import uuid from sqlalchemy import Column, String, DateTime, func, Text, Integer, ForeignKey from sqlalchemy.dialects.postgresql import UUID, JSONB from app.config.database import Base import enum class EventStatus(str, enum.Enum): PENDING = "PENDING" COMPLETED = "COMPLETED" FAILED = "FAILED" class EventLog(Base): __tablename__ = "event_logs" id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) event_id = Column(UUID(as_uuid=True), nullable=False, index=True) event_type = Column(String, nullable=False) payload = Column(JSONB, nullable=False) target_module_id = Column(UUID(as_uuid=True), nullable=False) target_environment_slug = Column(String, nullable=False) target_url = Column(String, nullable=False) status = Column(String, default=EventStatus.PENDING, index=True) retry_count = Column(Integer, default=0) next_retry_at = Column(DateTime(timezone=True), default=func.now(), index=True) error_log = Column(Text, nullable=True) follow_up_event = Column(JSONB, nullable=True) created_at = Column(DateTime(timezone=True), server_default=func.now()) updated_at = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now()) def __repr__(self): return f" {self.target_module_id} ({self.status})>"