| 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 |