from datetime import datetime from pydantic import BaseModel, EmailStr, field_validator import re # ── Auth ───────────────────────────────────────────────────────────────────── class UserRegister(BaseModel): username: str email: EmailStr password: str @field_validator("username") @classmethod def username_valid(cls, v: str) -> str: v = v.strip() if not re.match(r"^[A-Za-z0-9_]{3,64}$", v): raise ValueError( "Username must be 3–64 characters, letters/numbers/underscore only." ) return v @field_validator("password") @classmethod def password_strength(cls, v: str) -> str: if len(v) < 8: raise ValueError("Password must be at least 8 characters.") return v class UserLogin(BaseModel): username: str password: str class UserOut(BaseModel): id: int username: str email: str created_at: datetime model_config = {"from_attributes": True} class TokenPayload(BaseModel): sub: int # user id exp: int # ── PDFs ────────────────────────────────────────────────────────────────────── class PDFOut(BaseModel): id: int title: str total_pages: int | None created_at: datetime model_config = {"from_attributes": True} class PDFUploadResult(BaseModel): filename: str success: bool pdf: PDFOut | None = None error: str | None = None