"""Pydantic schemas for request/response validation.""" from datetime import datetime from typing import Any, Optional from pydantic import BaseModel, Field # --- Auth --- class LoginRequest(BaseModel): username: str password: str class TokenResponse(BaseModel): access_token: str token_type: str = "bearer" # --- System Settings --- class SystemSettingUpdate(BaseModel): key: str value: str class SystemSettingResponse(BaseModel): key: str value: str updated_at: datetime | None = None model_config = {"from_attributes": True} # --- API Tokens --- class ApiTokenCreate(BaseModel): name: str permissions: list[str] = Field(default_factory=list) expires_in_days: int | None = None class ApiTokenResponse(BaseModel): id: int name: str token: str | None = None # Only shown on create permissions: list[str] = Field(default_factory=list) is_active: bool created_at: datetime | None = None expires_at: datetime | None = None model_config = {"from_attributes": True} # --- Logs --- class CardLogResponse(BaseModel): id: int card_id: str | None = None cardholder_id: str | None = None action: str status: str operator: str request_data: str | None = None response_data: str | None = None created_at: datetime | None = None model_config = {"from_attributes": True} class AuditLogResponse(BaseModel): id: int action: str resource_type: str resource_id: str | None = None operator: str ip_address: str | None = None details: str | None = None created_at: datetime | None = None model_config = {"from_attributes": True} # --- Dashboard --- class DashboardResponse(BaseModel): total_cards: int = 0 active_cards: int = 0 today_card_count: int = 0 daily_card_limit: int = 0 account_balance: dict[str, Any] | None = None # --- Cards --- class CardCreateRequest(BaseModel): cardholder_id: str card_nickname: str | None = None authorization_controls: dict[str, Any] | None = None form_factor: str = "VIRTUAL" purpose: str | None = None class CardUpdateRequest(BaseModel): card_nickname: str | None = None authorization_controls: dict[str, Any] | None = None status: str | None = None # --- Cardholders --- class CardholderCreateRequest(BaseModel): email: str type: str = "INDIVIDUAL" individual: dict[str, Any] = Field( ..., description="Individual details: first_name, last_name, date_of_birth, etc.", ) address: dict[str, Any] = Field( ..., description="Address: street_address, city, state, postcode, country_code.", ) # --- Pagination --- class PaginatedResponse(BaseModel): items: list[Any] page_num: int = 0 page_size: int = 20 total: int | None = None has_more: bool = False # --- External / Third-party --- class ExternalCardCreateRequest(BaseModel): cardholder_id: str card_nickname: str | None = None authorization_controls: dict[str, Any] | None = None form_factor: str = "VIRTUAL" purpose: str | None = None # --- Balance --- class BalanceResponse(BaseModel): available: list[dict[str, Any]] = Field(default_factory=list)