from datetime import datetime from typing import Optional, List from pydantic import BaseModel, Field class ApplicationBase(BaseModel): """Base application schema""" name: str = Field(..., min_length=1, max_length=100) redirect_uris: List[str] = Field(default_factory=list) grant_types: List[str] = Field( default_factory=lambda: ["authorization_code", "refresh_token"] ) scopes: List[str] = Field(default_factory=lambda: ["read", "write"]) class ApplicationCreate(ApplicationBase): """Schema for creating a new application""" pass class ApplicationUpdate(BaseModel): """Schema for updating an application (all fields optional)""" name: Optional[str] = Field(None, min_length=1, max_length=100) redirect_uris: Optional[List[str]] = None grant_types: Optional[List[str]] = None scopes: Optional[List[str]] = None class ApplicationResponse(ApplicationBase): """Schema for application response""" id: str = Field(..., alias="_id") client_id: str owner_id: str created_at: datetime updated_at: datetime class Config: populate_by_name = True from_attributes = True class ApplicationWithSecret(ApplicationResponse): """Schema for application response with client secret (only on creation)""" client_secret: str = Field(..., description="Plain text client secret (only shown once)")