from typing import List, Optional, Dict, Any from pydantic import BaseModel, Field # Import Field from datetime import datetime # Import datetime # Pydantic models for reading data from the database class KeyCategoryBase(BaseModel): name: str type: str tags: Optional[List[str]] = None # metadata: Optional[Dict[str, Any]] = None # Removed from base class KeyCategory(KeyCategoryBase): id: int # Map metadata_ from SQLAlchemy model to metadata in schema metadata: Optional[Dict[str, Any]] = Field(None, alias="metadata_") created_at: Optional[datetime] = None # Use datetime type updated_at: Optional[datetime] = None # Use datetime type class Config: orm_mode = True # Enable ORM mode by_alias = True # Use aliases for serialization # Configure JSON encoding for datetime objects if needed (orm_mode might handle this) # json_encoders = { # datetime: lambda v: v.isoformat() if v else None # } class APIKeyBase(BaseModel): value: str category_id: int status: str = "active" # metadata: Optional[Dict[str, Any]] = None # Removed from base class APIKey(APIKeyBase): id: int usage_count: int last_used: Optional[datetime] = None # Use datetime type # Map metadata_ from SQLAlchemy model to metadata in schema metadata: Optional[Dict[str, Any]] = Field(None, alias="metadata_") created_at: Optional[datetime] = None # Use datetime type updated_at: Optional[datetime] = None # Use datetime type class Config: orm_mode = True # Enable ORM mode by_alias = True # Use aliases for serialization # Configure JSON encoding for datetime objects if needed # json_encoders = { # datetime: lambda v: v.isoformat() if v else None # } # Pydantic models for creating data (less fields, e.g., no ID, timestamps) class KeyCategoryCreate(KeyCategoryBase): metadata: Optional[Dict[str, Any]] = None # Add metadata back to create schema class APIKeyCreate(APIKeyBase): metadata: Optional[Dict[str, Any]] = None # Add metadata back to create schema # Pydantic models for updating data (all fields optional) class KeyCategoryUpdate(BaseModel): name: Optional[str] = None type: Optional[str] = None tags: Optional[List[str]] = None metadata: Optional[Dict[str, Any]] = None class APIKeyUpdate(BaseModel): value: Optional[str] = None category_id: Optional[int] = None status: Optional[str] = None metadata: Optional[Dict[str, Any]] = None