system-prompts-and-models-o.../salesflow-saas/backend/app/models/operations.py
2026-04-04 18:04:21 +03:00

48 lines
2.1 KiB
Python

"""Full Auto Ops: domain events, approval queue, integration connector health."""
from __future__ import annotations
from sqlalchemy import Column, String, Text, DateTime, ForeignKey, UniqueConstraint
from sqlalchemy.dialects.postgresql import UUID, JSONB
from sqlalchemy.orm import relationship
from app.models.base import TenantModel
class DomainEvent(TenantModel):
__tablename__ = "domain_events"
event_type = Column(String(120), nullable=False, index=True)
payload = Column(JSONB, default=dict)
source = Column(String(50), nullable=False, default="api") # api, webhook, worker
correlation_id = Column(String(80), nullable=True, index=True)
class ApprovalRequest(TenantModel):
__tablename__ = "approval_requests"
channel = Column(String(40), nullable=False) # whatsapp, email, sms
resource_type = Column(String(80), nullable=False)
resource_id = Column(UUID(as_uuid=True), nullable=False, index=True)
payload = Column(JSONB, default=dict)
status = Column(String(20), nullable=False, default="pending") # pending, approved, rejected
requested_by_id = Column(UUID(as_uuid=True), ForeignKey("users.id"), nullable=False)
reviewed_by_id = Column(UUID(as_uuid=True), ForeignKey("users.id"), nullable=True)
reviewed_at = Column(DateTime(timezone=True), nullable=True)
note = Column(Text, nullable=True)
requested_by = relationship("User", foreign_keys=[requested_by_id])
reviewed_by = relationship("User", foreign_keys=[reviewed_by_id])
class IntegrationSyncState(TenantModel):
__tablename__ = "integration_sync_states"
__table_args__ = (UniqueConstraint("tenant_id", "connector_key", name="uq_tenant_connector"),)
connector_key = Column(String(80), nullable=False, index=True)
display_name_ar = Column(String(255), nullable=True)
last_success_at = Column(DateTime(timezone=True), nullable=True)
last_attempt_at = Column(DateTime(timezone=True), nullable=True)
status = Column(String(20), nullable=False, default="unknown") # ok, degraded, error, unknown
last_error = Column(Text, nullable=True)