from sqlalchemy import Column, Integer, String, DateTime, Boolean, ForeignKey, Text, Enum from sqlalchemy.sql import func from sqlalchemy.orm import relationship from app.db.base import Base import enum class IntegrationType(str, enum.Enum): USER_MANAGEMENT = "user_management" PAYMENT = "payment" COMMUNICATION = "communication" class WebhookStatus(str, enum.Enum): PENDING = "pending" PROCESSING = "processing" SUCCESS = "success" FAILED = "failed" RETRY = "retry" class ExternalIntegration(Base): __tablename__ = "external_integrations" id = Column(Integer, primary_key=True, index=True) organization_id = Column(Integer, ForeignKey("organizations.id"), nullable=False) name = Column(String(255), nullable=False) type = Column(Enum(IntegrationType), nullable=False) endpoint_url = Column(String(500), nullable=False) api_key = Column(String(500)) is_active = Column(Boolean, default=True) config = Column(Text) last_sync = Column(DateTime(timezone=True)) created_at = Column(DateTime(timezone=True), server_default=func.now()) updated_at = Column(DateTime(timezone=True), onupdate=func.now()) webhooks = relationship("WebhookEvent", back_populates="integration") health_checks = relationship("IntegrationHealth", back_populates="integration") class WebhookEvent(Base): __tablename__ = "webhook_events" id = Column(Integer, primary_key=True, index=True) organization_id = Column(Integer, ForeignKey("organizations.id"), nullable=False) integration_id = Column(Integer, ForeignKey("external_integrations.id"), nullable=False) external_id = Column(String(255), nullable=False, index=True) event_type = Column(String(100), nullable=False) payload = Column(Text, nullable=False) status = Column(Enum(WebhookStatus), default=WebhookStatus.PENDING) retry_count = Column(Integer, default=0) max_retries = Column(Integer, default=3) error_message = Column(Text) processed_at = Column(DateTime(timezone=True)) created_at = Column(DateTime(timezone=True), server_default=func.now()) updated_at = Column(DateTime(timezone=True), onupdate=func.now()) integration = relationship("ExternalIntegration", back_populates="webhooks") class IntegrationHealth(Base): __tablename__ = "integration_health" id = Column(Integer, primary_key=True, index=True) integration_id = Column(Integer, ForeignKey("external_integrations.id"), nullable=False) status = Column(String(50), nullable=False) response_time = Column(Integer) error_message = Column(Text) checked_at = Column(DateTime(timezone=True), server_default=func.now()) integration = relationship("ExternalIntegration", back_populates="health_checks")