import enum from sqlalchemy import Column, Integer, String, DateTime, ForeignKey, JSON, Date, Text, Enum from sqlalchemy.orm import relationship from sqlalchemy.sql import func from sqlalchemy.dialects.postgresql import UUID as PG_UUID from app.db.base_class import Base class LogSeverity(str, enum.Enum): info = "info" # Általános művelet (pl. profil megtekintés) warning = "warning" # Gyanús, de nem biztosan káros (pl. 3 elrontott jelszó) critical = "critical" # Súlyos művelet (pl. jelszóváltoztatás, export) emergency = "emergency" # Azonnali beavatkozást igényel (pl. SuperAdmin módosítás) class VehicleOwnership(Base): __tablename__ = "vehicle_ownerships" __table_args__ = {"schema": "data"} id = Column(Integer, primary_key=True, index=True) vehicle_id = Column(PG_UUID(as_uuid=True), ForeignKey("data.assets.id"), nullable=False) user_id = Column(Integer, ForeignKey("data.users.id"), nullable=False) start_date = Column(Date, nullable=False, default=func.current_date()) end_date = Column(Date, nullable=True) notes = Column(Text, nullable=True) vehicle = relationship("Asset", back_populates="ownership_history") user = relationship("User", back_populates="ownership_history") class AuditLog(Base): __tablename__ = "audit_logs" __table_args__ = {"schema": "data"} id = Column(Integer, primary_key=True, index=True) user_id = Column(Integer, ForeignKey("data.users.id"), nullable=True) severity = Column(Enum(LogSeverity), default=LogSeverity.info, nullable=False) # Mi történt és min? action = Column(String(100), nullable=False, index=True) target_type = Column(String(50), index=True) # pl. "User", "Wallet", "Asset" target_id = Column(String(50), index=True) # A cél rekord ID-ja # Részletes adatok (JSONB formátum a rugalmasságért) # A 'changes' helyett explicit old/new párost használunk a könnyebb visszaállításhoz old_data = Column(JSON, nullable=True) new_data = Column(JSON, nullable=True) # Biztonsági nyomkövetés ip_address = Column(String(45), index=True) # IPv6-ot is támogat user_agent = Column(Text, nullable=True) # Böngésző/Eszköz információ timestamp = Column(DateTime(timezone=True), server_default=func.now(), index=True) user = relationship("User")