from pydantic import BaseModel, EmailStr, Field, ConfigDict # ========================================================= # BASE CONFIG (STRICT MODE → PREVENTS SILENT DATA COERCION) # ========================================================= class StrictSchema(BaseModel): model_config = ConfigDict( strict=True, extra="forbid", validate_assignment=True, ) # ========================================================= # SIGNUP SCHEMA # ========================================================= class SignupSchema(StrictSchema): email: EmailStr username: str = Field( min_length=3, max_length=32, pattern=r"^[a-zA-Z0-9_]+$" ) password: str = Field( min_length=8, max_length=72, ) # ========================================================= # LOGIN SCHEMA # ========================================================= class LoginSchema(StrictSchema): email: EmailStr password: str = Field( min_length=1, max_length=72, ) # ========================================================= # TOKEN REQUEST SCHEMA # ========================================================= class TokenSchema(StrictSchema): token: str = Field( min_length=10, max_length=2048 ) # ========================================================= # USER RESPONSE SCHEMA (SAFE OUTPUT MODEL) # ========================================================= class UserOutSchema(StrictSchema): id: int email: EmailStr username: str created_at: str