47 lines
1.1 KiB
Python
47 lines
1.1 KiB
Python
"""User schemas. ``password_hash`` is never exposed — only ``UserResponse``
|
|
fields leave the service."""
|
|
|
|
import datetime as dt
|
|
import uuid
|
|
|
|
from pydantic import BaseModel, ConfigDict, Field
|
|
|
|
from app.domain.entities import User
|
|
|
|
|
|
class UserResponse(BaseModel):
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
id: uuid.UUID
|
|
username: str
|
|
is_superuser: bool
|
|
is_active: bool
|
|
created_at: dt.datetime
|
|
updated_at: dt.datetime
|
|
|
|
@classmethod
|
|
def from_entity(cls, user: User) -> UserResponse:
|
|
return cls.model_validate(user)
|
|
|
|
|
|
class CreateUserRequest(BaseModel):
|
|
username: str = Field(min_length=1, max_length=64)
|
|
password: str = Field(min_length=8)
|
|
is_superuser: bool = False
|
|
|
|
|
|
class UpdateUserRequest(BaseModel):
|
|
"""Admin patch — every field optional; only provided ones change."""
|
|
|
|
is_superuser: bool | None = None
|
|
is_active: bool | None = None
|
|
|
|
|
|
class ResetPasswordRequest(BaseModel):
|
|
new_password: str = Field(min_length=8)
|
|
|
|
|
|
class ChangePasswordRequest(BaseModel):
|
|
current_password: str = Field(min_length=1)
|
|
new_password: str = Field(min_length=8)
|