""" Modèles de données pour les adresses IP et leur historique Basé sur modele-donnees.md """ from sqlalchemy import Column, String, Boolean, DateTime, Integer, ForeignKey, Index, JSON from sqlalchemy.orm import relationship from datetime import datetime from backend.app.core.database import Base class IP(Base): """ Table principale des adresses IP Stocke les informations actuelles et les métadonnées de chaque IP """ __tablename__ = "ip" # Clé primaire ip = Column(String, primary_key=True, index=True) # Métadonnées name = Column(String, nullable=True) # Nom donné à l'IP known = Column(Boolean, default=False, index=True) # IP connue ou inconnue location = Column(String, nullable=True) # Localisation (ex: "Bureau", "Serveur") host = Column(String, nullable=True) # Type d'hôte (ex: "PC", "Imprimante") # Timestamps first_seen = Column(DateTime, default=datetime.utcnow) # Première détection last_seen = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) # Dernière vue # État réseau last_status = Column(String, index=True) # "online", "offline", "unknown" # Informations réseau mac = Column(String, nullable=True) # Adresse MAC vendor = Column(String, nullable=True) # Fabricant (lookup MAC) hostname = Column(String, nullable=True) # Nom d'hôte réseau link = Column(String, nullable=True) # Lien personnalisé (URL) # Ports ouverts (stocké en JSON) open_ports = Column(JSON, default=list) # Liste des ports ouverts # Relation avec l'historique history = relationship("IPHistory", back_populates="ip_ref", cascade="all, delete-orphan") def __repr__(self): return f"" class IPHistory(Base): """ Table d'historique des états d'IP Stocke l'évolution dans le temps (24h par défaut) """ __tablename__ = "ip_history" # Clé primaire auto-incrémentée id = Column(Integer, primary_key=True, autoincrement=True) # Foreign key vers la table IP ip = Column(String, ForeignKey("ip.ip", ondelete="CASCADE"), nullable=False, index=True) # Timestamp de l'enregistrement timestamp = Column(DateTime, default=datetime.utcnow, index=True, nullable=False) # État à ce moment status = Column(String, nullable=False) # "online", "offline" # Ports ouverts à ce moment (JSON) open_ports = Column(JSON, default=list) # Relation inverse vers IP ip_ref = relationship("IP", back_populates="history") def __repr__(self): return f"" # Index recommandés (déjà définis dans les colonnes avec index=True) # Index supplémentaires si nécessaire Index('idx_ip_last_status', IP.last_status) Index('idx_ip_history_timestamp', IPHistory.timestamp) Index('idx_ip_history_ip', IPHistory.ip)