"""Pydantic request/response models.""" from __future__ import annotations from pydantic import BaseModel, Field # ── Auth ───────────────────────────────────────────────────────────────────── class LoginRequest(BaseModel): username: str = Field(min_length=3, max_length=120) password: str = Field(min_length=1, max_length=72) class TokenResponse(BaseModel): access_token: str token_type: str = "bearer" # ── RBAC & Accounts (P1) ───────────────────────────────────────────────────── class RoleCreate(BaseModel): role_key: str = Field(pattern=r"^[a-z][a-z0-9_]{1,30}$") label: str description: str | None = None sort_order: int | None = None class RoleUpdate(BaseModel): label: str | None = None description: str | None = None sort_order: int | None = None class CapabilityCreate(BaseModel): cap_key: str = Field(pattern=r"^[a-z][a-z0-9_]{1,40}$") label: str sort_order: int | None = None class RoleCapCell(BaseModel): role_key: str cap_key: str value: str class UserCreate(BaseModel): username: str = Field(min_length=3, max_length=120) password: str = Field(min_length=12, max_length=72) full_name: str | None = None phone: str | None = None status: str | None = None roles: list[str] = [] class UserUpdate(BaseModel): full_name: str | None = None phone: str | None = None status: str | None = None password: str | None = Field(default=None, min_length=12, max_length=72) roles: list[str] | None = None