Cybersecurity-Projects/PROJECTS/bug-bounty-platform/backend/app/user/schemas.py

110 lines
2.2 KiB
Python

"""
ⒸAngelaMos | 2025
schemas.py
"""
from pydantic import (
Field,
EmailStr,
field_validator,
)
from config import (
UserRole,
FULL_NAME_MAX_LENGTH,
PASSWORD_MAX_LENGTH,
PASSWORD_MIN_LENGTH,
)
from core.base_schema import (
BaseSchema,
BaseResponseSchema,
)
class UserCreate(BaseSchema):
"""
Schema for user registration
"""
email: EmailStr
password: str = Field(
min_length = PASSWORD_MIN_LENGTH,
max_length = PASSWORD_MAX_LENGTH
)
full_name: str | None = Field(
default = None,
max_length = FULL_NAME_MAX_LENGTH
)
@field_validator("password")
@classmethod
def validate_password_strength(cls, v: str) -> str:
"""
Ensure password has minimum complexity
"""
if not any(c.isupper() for c in v):
raise ValueError(
"Password must contain at least one uppercase letter"
)
if not any(c.isdigit() for c in v):
raise ValueError("Password must contain at least one digit")
return v
class UserUpdate(BaseSchema):
"""
Schema for updating user profile
"""
full_name: str | None = Field(
default = None,
max_length = FULL_NAME_MAX_LENGTH
)
class UserUpdateAdmin(UserUpdate):
"""
Schema for admin updating user
"""
email: EmailStr | None = None
is_active: bool | None = None
is_verified: bool | None = None
role: UserRole | None = None
class AdminUserCreate(BaseSchema):
"""
Schema for admin creating a user
"""
email: EmailStr
password: str = Field(
min_length = PASSWORD_MIN_LENGTH,
max_length = PASSWORD_MAX_LENGTH
)
full_name: str | None = Field(
default = None,
max_length = FULL_NAME_MAX_LENGTH
)
role: UserRole = UserRole.USER
is_active: bool = True
is_verified: bool = False
class UserResponse(BaseResponseSchema):
"""
Schema for user API responses
"""
email: EmailStr
full_name: str | None
is_active: bool
is_verified: bool
role: UserRole
class UserListResponse(BaseSchema):
"""
Schema for paginated user list
"""
items: list[UserResponse]
total: int
page: int
size: int