from pydantic import BaseModel, Field class TicketCreateRequest(BaseModel): workspace_code: str = Field(default="", max_length=50) requester_id: str = Field(..., min_length=1, max_length=100) requester_tenant_id: str = Field(..., min_length=1, max_length=100) requester_contact: str | None = Field(default=None, max_length=100) title: str = Field(..., min_length=1, max_length=255) description: str = Field(..., min_length=1) category_code: str | None = Field(default=None, max_length=20) ticket_type: str = Field(default="GENERAL") requires_approval: bool = False extra_fields: dict[str, str] = Field(default_factory=dict) class TicketCreateResponse(BaseModel): ticket_id: int workspace_code: str status_code: str sync_status: str message: str class WorkspaceSummary(BaseModel): workspace_code: str workspace_name: str workspace_type: str class WorkspaceFormField(BaseModel): field_code: str label: str field_type: str required: bool = False class WorkspaceFormTemplateResponse(BaseModel): workspace_code: str workspace_name: str requires_approval: bool fields: list[WorkspaceFormField] class SupportActivityItem(BaseModel): id: str label: str detail: str timestamp: str class SupportAttachmentRecord(BaseModel): attachment_id: int original_file_name: str mime_type: str | None = None file_size: int | None = None created_at: str class TicketCommentCreateRequest(BaseModel): requester_id: str = Field(..., min_length=1, max_length=100) requester_tenant_id: str = Field(..., min_length=1, max_length=100) author_name: str | None = Field(default=None, max_length=100) content: str = Field(..., min_length=1) is_internal: bool = False class TicketCommentUpdateRequest(BaseModel): requester_id: str = Field(..., min_length=1, max_length=100) requester_tenant_id: str = Field(..., min_length=1, max_length=100) content: str = Field(..., min_length=1) class TicketIssueLinkStatusSyncRequest(BaseModel): linked: bool class SupportTicketCommentRecord(BaseModel): comment_id: int ticket_id: int author_id: str author_tenant_id: str author_name: str content: str is_internal: bool created_at: str updated_at: str edited_at: str | None class SupportTicketRecord(BaseModel): ticket_id: int workspace_code: str workspace_name: str title: str description: str requester_id: str requester_tenant_id: str requester_contact: str category_code: str ticket_type: str requires_approval: bool status_code: str approval_status: str sync_status: str issue_link_status: str created_at: str updated_at: str extra_fields: dict[str, str] attachments: list[SupportAttachmentRecord] = Field(default_factory=list) activity: list[SupportActivityItem] class TicketMutationResponse(BaseModel): ticket_id: int status_code: str approval_status: str issue_link_status: str updated_at: str