"""Issue schemas.""" from datetime import datetime from typing import Optional, List, Dict, Any from pydantic import BaseModel from app.models.issue import IssueStatus, IssuePriority class IssueBase(BaseModel): title: str description: Optional[str] = None priority: IssuePriority = IssuePriority.MEDIUM class IssueCreate(IssueBase): external_id: Optional[str] = None external_key: Optional[str] = None external_url: Optional[str] = None source: Optional[str] = None labels: Optional[List[str]] = None callback_url: Optional[str] = None raw_payload: Optional[Dict[str, Any]] = None class IssueUpdate(BaseModel): title: Optional[str] = None description: Optional[str] = None priority: Optional[IssuePriority] = None status: Optional[IssueStatus] = None labels: Optional[List[str]] = None class IssueRead(IssueBase): id: int organization_id: int integration_id: Optional[int] = None external_id: Optional[str] = None external_key: Optional[str] = None external_url: Optional[str] = None source: Optional[str] = None labels: Optional[List[str]] = None status: IssueStatus root_cause: Optional[str] = None affected_files: Optional[List[str]] = None suggested_fix: Optional[str] = None confidence: Optional[float] = None pr_url: Optional[str] = None pr_branch: Optional[str] = None pr_status: Optional[str] = None sla_deadline: Optional[datetime] = None sla_breached: bool = False created_at: datetime analysis_completed_at: Optional[datetime] = None class Config: from_attributes = True class IssueStats(BaseModel): total: int pending: int analyzing: int analyzed: int pr_created: int completed: int error: int avg_confidence: float avg_analysis_time_seconds: Optional[float] = None by_source: Dict[str, int] by_priority: Dict[str, int] sla_breached: int class IssueComment(BaseModel): author: str content: str author_type: str = "user"