from datetime import datetime from pydantic import BaseModel, ConfigDict, Field from typing import Optional, Literal class TicketCreate(BaseModel): title: str = Field(..., min_length=5, max_length=200) db_type: Literal["mysql", "postgres", "redis", "mongo"] instance_id: int target_database: str = Field(..., min_length=1) sql_content: str = Field(..., min_length=1) rollback_sql: Optional[str] = None reason: str = Field(..., min_length=5) priority: Literal["high", "medium", "low"] = "medium" class TicketReview(BaseModel): action: Literal["approve", "reject"] comment: str = Field(default="", max_length=500) class TicketResponse(BaseModel): id: int title: str db_type: str instance_id: int target_database: str sql_content: str rollback_sql: Optional[str] = None status: str priority: str applicant_id: int applicant_name: Optional[str] = None approver_id: Optional[int] = None approver_name: Optional[str] = None reason: Optional[str] = None audit_result: Optional[str] = None execute_result: Optional[str] = None create_time: datetime review_time: Optional[datetime] = None execute_time: Optional[datetime] = None model_config = ConfigDict(from_attributes=True) class TicketListParams(BaseModel): page: int = 1 page_size: int = 10 status: Optional[str] = None db_type: Optional[str] = None keyword: Optional[str] = None