from pydantic import BaseModel, Field from typing import Optional, List from datetime import datetime from enum import Enum class TicketStatus(str, Enum): OPEN = "open" IN_PROGRESS = "in_progress" RESOLVED = "resolved" CLOSED = "closed" class TicketPriority(str, Enum): LOW = "low" MEDIUM = "medium" HIGH = "high" CRITICAL = "critical" class ProjectCreate(BaseModel): name: str key: str = Field(..., pattern="^[A-Z]{2,10}$") description: Optional[str] = None webhook_url: Optional[str] = None class Project(ProjectCreate): id: int created_at: datetime ticket_count: int = 0 class TicketCreate(BaseModel): project_id: int title: str description: str priority: TicketPriority = TicketPriority.MEDIUM labels: List[str] = [] class Ticket(TicketCreate): id: int key: str # e.g., "PROJ-123" status: TicketStatus = TicketStatus.OPEN created_at: datetime updated_at: datetime class TicketUpdate(BaseModel): title: Optional[str] = None description: Optional[str] = None status: Optional[TicketStatus] = None priority: Optional[TicketPriority] = None labels: Optional[List[str]] = None class Comment(BaseModel): id: int ticket_id: int author: str content: str created_at: datetime class CommentCreate(BaseModel): author: str = "system" content: str class WebhookConfig(BaseModel): id: int project_id: int url: str events: List[str] = ["ticket.created", "ticket.updated", "comment.added"] active: bool = True