from sqlalchemy import JSON, Column, DateTime, Integer, String, Text from sqlalchemy.sql import func from app.db.session import Base class SystemLog(Base): __tablename__ = "system_logs" id = Column(Integer, primary_key=True, autoincrement=True) occurred_at = Column(DateTime(timezone=True), server_default=func.now(), index=True) source = Column(String(50), nullable=False, index=True) service = Column(String(50), nullable=True) module = Column(String(120), nullable=True) event = Column(String(160), nullable=True, index=True) level = Column(String(20), nullable=False, index=True) message = Column(Text, nullable=False) request_id = Column(String(64), nullable=True, index=True) trace_id = Column(String(64), nullable=True) user_id = Column(Integer, nullable=True, index=True) category = Column(String(80), nullable=True, index=True) context = Column(JSON, nullable=False, default=dict) created_at = Column(DateTime(timezone=True), server_default=func.now()) class AuditLog(Base): __tablename__ = "audit_logs" id = Column(Integer, primary_key=True, autoincrement=True) occurred_at = Column(DateTime(timezone=True), server_default=func.now(), index=True) actor_id = Column(Integer, nullable=True, index=True) actor_name = Column(String(255), nullable=True) action = Column(String(120), nullable=False, index=True) target_type = Column(String(80), nullable=True) target_id = Column(String(120), nullable=True) result = Column(String(40), nullable=True, index=True) request_id = Column(String(64), nullable=True, index=True) ip = Column(String(64), nullable=True) details = Column(JSON, nullable=False, default=dict) created_at = Column(DateTime(timezone=True), server_default=func.now()) class ObservabilityEvent(Base): __tablename__ = "observability_events" id = Column(Integer, primary_key=True, autoincrement=True) occurred_at = Column(DateTime(timezone=True), server_default=func.now(), index=True) source = Column(String(50), nullable=False, index=True) service = Column(String(50), nullable=True, index=True) module = Column(String(120), nullable=True, index=True) category = Column(String(80), nullable=True, index=True) event = Column(String(160), nullable=True, index=True) level = Column(String(20), nullable=False, index=True) message = Column(Text, nullable=False) fingerprint = Column(String(80), nullable=False, index=True) request_id = Column(String(64), nullable=True, index=True) trace_id = Column(String(64), nullable=True, index=True) task_id = Column(String(120), nullable=True, index=True) source_ref_id = Column(String(120), nullable=True, index=True) provider = Column(String(120), nullable=True, index=True) user_id = Column(Integer, nullable=True, index=True) context = Column(JSON, nullable=False, default=dict) occurrence_count = Column(Integer, nullable=False, default=1) created_at = Column(DateTime(timezone=True), server_default=func.now()) class ObservabilityEventGroup(Base): __tablename__ = "observability_event_groups" fingerprint = Column(String(80), primary_key=True) source = Column(String(50), nullable=False, index=True) service = Column(String(50), nullable=True, index=True) module = Column(String(120), nullable=True, index=True) category = Column(String(80), nullable=True, index=True) event = Column(String(160), nullable=True, index=True) last_level = Column(String(20), nullable=False, index=True) sample_message = Column(Text, nullable=False) sample_detail = Column(Text, nullable=True) affected_sources = Column(JSON, nullable=False, default=list) count = Column(Integer, nullable=False, default=0) first_seen_at = Column(DateTime(timezone=True), nullable=False, index=True) last_seen_at = Column(DateTime(timezone=True), nullable=False, index=True) updated_at = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now())