110 lines
2.2 KiB
Python
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
|