from datetime import datetime from typing import Optional from pydantic import BaseModel, ConfigDict, EmailStr, Field class ResponseBase(BaseModel): success: Optional[bool] = Field(None) message: Optional[str] = Field(None) class UserBase(BaseModel): email: EmailStr = Field(..., examples=["user@example.com"]) username: str = Field( ..., min_length=3, max_length=64, pattern=r"^[A-Za-z0-9_.-]+$", examples=["user_1"], ) full_name: Optional[str] = Field( None, max_length=255, pattern=r"^[^<>]*$", examples=["Иван Иванов"], ) role_id: int = 3 class UserCreate(UserBase): password: str | None = Field(default=None, examples=["pass123"]) model_config = ConfigDict( json_schema_extra={ "example": { "email": "user@example.com", "username": "user_1", "full_name": "Иван Иванов", "role_id": 3, "password": "pass123", } } ) class UserUpdate(BaseModel): email: Optional[EmailStr] = Field(default=None, examples=["user@example.com"]) username: Optional[str] = Field( None, min_length=3, max_length=64, pattern=r"^[A-Za-z0-9_.-]+$", examples=["user_1"], ) full_name: Optional[str] = Field( None, max_length=255, pattern=r"^[^<>]*$", examples=["Иван Иванов"], ) role_id: Optional[int] = None is_active: Optional[bool] = True class UserInDB(UserBase): model_config = ConfigDict(from_attributes=True) id: int created_at: datetime updated_at: Optional[datetime] = None is_active: bool class User(UserInDB): pass class UserResponse(ResponseBase): result: Optional[UserInDB] = None class UserListResponse(ResponseBase): result: Optional[list[User]] = None class SSPBase(BaseModel): title: str is_ssp: bool = True is_active: bool = True class SSPInDB(SSPBase): model_config = ConfigDict(from_attributes=True) id: int class SSPIDList(BaseModel): ssp_ids: list[int] class UserSSPLinkBase(BaseModel): user_id: int ssp: list[SSPInDB] class UserSSPLinkResponse(ResponseBase): result: Optional[UserSSPLinkBase] = None class Token(BaseModel): access_token: str token_type: str = "bearer" expires_in: Optional[int] = None refresh_token: Optional[str] = None class LoginRequest(BaseModel): username: str password: str class RefreshRequest(BaseModel): refresh_token: str