From cb25cf782d666278e3f2b5c8392f110c232d1e74 Mon Sep 17 00:00:00 2001 From: Claude AI Date: Thu, 29 Jan 2026 10:54:26 +0000 Subject: [PATCH] feat(fase3): add Queue and QuickReply API schemas Co-Authored-By: Claude Opus 4.5 --- services/api-gateway/app/schemas/__init__.py | 20 ++++ services/api-gateway/app/schemas/queue.py | 96 ++++++++++++++++++++ 2 files changed, 116 insertions(+) create mode 100644 services/api-gateway/app/schemas/queue.py diff --git a/services/api-gateway/app/schemas/__init__.py b/services/api-gateway/app/schemas/__init__.py index 287a96c..2580a56 100644 --- a/services/api-gateway/app/schemas/__init__.py +++ b/services/api-gateway/app/schemas/__init__.py @@ -15,6 +15,17 @@ from app.schemas.flow import ( FlowResponse, FlowListResponse, ) +from app.schemas.queue import ( + QueueCreate, + QueueUpdate, + QueueAgentAdd, + QueueAgentResponse, + QueueResponse, + QueueDetailResponse, + QuickReplyCreate, + QuickReplyUpdate, + QuickReplyResponse, +) __all__ = [ "LoginRequest", @@ -30,4 +41,13 @@ __all__ = [ "FlowUpdate", "FlowResponse", "FlowListResponse", + "QueueCreate", + "QueueUpdate", + "QueueAgentAdd", + "QueueAgentResponse", + "QueueResponse", + "QueueDetailResponse", + "QuickReplyCreate", + "QuickReplyUpdate", + "QuickReplyResponse", ] diff --git a/services/api-gateway/app/schemas/queue.py b/services/api-gateway/app/schemas/queue.py new file mode 100644 index 0000000..373967a --- /dev/null +++ b/services/api-gateway/app/schemas/queue.py @@ -0,0 +1,96 @@ +from pydantic import BaseModel +from typing import Optional, List +from uuid import UUID +from datetime import datetime +from app.models.queue import AssignmentMethod + + +class QueueCreate(BaseModel): + name: str + description: Optional[str] = None + assignment_method: AssignmentMethod = AssignmentMethod.ROUND_ROBIN + max_per_agent: int = 10 + sla_first_response: int = 300 + sla_resolution: int = 86400 + business_hours: Optional[dict] = None + fallback_flow_id: Optional[UUID] = None + + +class QueueUpdate(BaseModel): + name: Optional[str] = None + description: Optional[str] = None + assignment_method: Optional[AssignmentMethod] = None + max_per_agent: Optional[int] = None + sla_first_response: Optional[int] = None + sla_resolution: Optional[int] = None + business_hours: Optional[dict] = None + fallback_flow_id: Optional[UUID] = None + is_active: Optional[bool] = None + + +class QueueAgentAdd(BaseModel): + user_id: UUID + is_supervisor: bool = False + skills: List[str] = [] + + +class QueueAgentResponse(BaseModel): + id: UUID + user_id: UUID + user_name: Optional[str] = None + user_email: Optional[str] = None + is_supervisor: bool + skills: List[str] + created_at: datetime + + class Config: + from_attributes = True + + +class QueueResponse(BaseModel): + id: UUID + name: str + description: Optional[str] + assignment_method: AssignmentMethod + max_per_agent: int + sla_first_response: int + sla_resolution: int + business_hours: Optional[dict] + fallback_flow_id: Optional[UUID] + is_active: bool + created_at: datetime + agent_count: Optional[int] = 0 + + class Config: + from_attributes = True + + +class QueueDetailResponse(QueueResponse): + agents: List[QueueAgentResponse] = [] + + +class QuickReplyCreate(BaseModel): + shortcut: str + content: str + attachments: List[dict] = [] + queue_id: Optional[UUID] = None + + +class QuickReplyUpdate(BaseModel): + shortcut: Optional[str] = None + content: Optional[str] = None + attachments: Optional[List[dict]] = None + queue_id: Optional[UUID] = None + + +class QuickReplyResponse(BaseModel): + id: UUID + shortcut: str + content: str + attachments: List[dict] + queue_id: Optional[UUID] + created_by: UUID + created_at: datetime + + class Config: + from_attributes = True