diff --git a/services/api-gateway/app/models/__init__.py b/services/api-gateway/app/models/__init__.py index a8e5850..027c644 100644 --- a/services/api-gateway/app/models/__init__.py +++ b/services/api-gateway/app/models/__init__.py @@ -1,5 +1,20 @@ from app.models.user import User from app.models.whatsapp import WhatsAppAccount, Contact, Conversation, Message from app.models.flow import Flow, FlowSession, TriggerType +from app.models.queue import Queue, QueueAgent, AssignmentMethod +from app.models.quick_reply import QuickReply -__all__ = ["User", "WhatsAppAccount", "Contact", "Conversation", "Message", "Flow", "FlowSession", "TriggerType"] +__all__ = [ + "User", + "WhatsAppAccount", + "Contact", + "Conversation", + "Message", + "Flow", + "FlowSession", + "TriggerType", + "Queue", + "QueueAgent", + "AssignmentMethod", + "QuickReply", +] diff --git a/services/api-gateway/app/models/queue.py b/services/api-gateway/app/models/queue.py new file mode 100644 index 0000000..0a14dd3 --- /dev/null +++ b/services/api-gateway/app/models/queue.py @@ -0,0 +1,46 @@ +import uuid +from datetime import datetime +from sqlalchemy import Column, String, Boolean, DateTime, Integer, ForeignKey, Enum as SQLEnum +from sqlalchemy.dialects.postgresql import UUID, JSONB, ARRAY +from sqlalchemy.orm import relationship +import enum +from app.core.database import Base + + +class AssignmentMethod(str, enum.Enum): + ROUND_ROBIN = "round_robin" + LEAST_BUSY = "least_busy" + SKILL_BASED = "skill_based" + + +class Queue(Base): + __tablename__ = "queues" + + id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) + name = Column(String(100), nullable=False) + description = Column(String(500), nullable=True) + assignment_method = Column(SQLEnum(AssignmentMethod), default=AssignmentMethod.ROUND_ROBIN, nullable=False) + max_per_agent = Column(Integer, default=10, nullable=False) + sla_first_response = Column(Integer, default=300, nullable=False) + sla_resolution = Column(Integer, default=86400, nullable=False) + business_hours = Column(JSONB, default=dict) + fallback_flow_id = Column(UUID(as_uuid=True), ForeignKey("flows.id"), nullable=True) + is_active = Column(Boolean, default=True, nullable=False) + created_at = Column(DateTime, default=datetime.utcnow, nullable=False) + + agents = relationship("QueueAgent", back_populates="queue") + conversations = relationship("Conversation", back_populates="queue") + + +class QueueAgent(Base): + __tablename__ = "queue_agents" + + id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) + queue_id = Column(UUID(as_uuid=True), ForeignKey("queues.id"), nullable=False) + user_id = Column(UUID(as_uuid=True), ForeignKey("users.id"), nullable=False) + is_supervisor = Column(Boolean, default=False, nullable=False) + skills = Column(ARRAY(String), default=list) + created_at = Column(DateTime, default=datetime.utcnow, nullable=False) + + queue = relationship("Queue", back_populates="agents") + user = relationship("User")