""" Configuration de la base de données """ from sqlalchemy import create_engine, Column, String, Integer, DateTime, Text, JSON, Boolean from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker, Session from sqlalchemy.sql import func import os from typing import Generator # URL de la base de données DATABASE_URL = os.getenv("DATABASE_URL", "postgresql+psycopg://notariat:notariat_pwd@localhost:5432/notariat") # Création du moteur SQLAlchemy engine = create_engine(DATABASE_URL, echo=False) # Session factory SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) # Base pour les modèles Base = declarative_base() class Document(Base): """Modèle de document en base de données""" __tablename__ = "documents" id = Column(String, primary_key=True, index=True) filename = Column(String, nullable=False) mime_type = Column(String, nullable=False) size = Column(Integer, nullable=False) status = Column(String, default="pending") id_dossier = Column(String, nullable=False, index=True) etude_id = Column(String, nullable=False, index=True) utilisateur_id = Column(String, nullable=False, index=True) source = Column(String, default="upload") created_at = Column(DateTime(timezone=True), server_default=func.now()) updated_at = Column(DateTime(timezone=True), onupdate=func.now()) processing_steps = Column(JSON, default={}) extracted_data = Column(JSON, default={}) errors = Column(JSON, default=[]) manual_review = Column(Boolean, default=False) class ProcessingLog(Base): """Log des étapes de traitement""" __tablename__ = "processing_logs" id = Column(Integer, primary_key=True, index=True, autoincrement=True) document_id = Column(String, nullable=False, index=True) step_name = Column(String, nullable=False) status = Column(String, nullable=False) started_at = Column(DateTime(timezone=True), server_default=func.now()) completed_at = Column(DateTime(timezone=True)) duration = Column(Integer) # en millisecondes error_message = Column(Text) step_metadata = Column(JSON, default={}) def get_db() -> Generator[Session, None, None]: """Dépendance pour obtenir une session de base de données""" db = SessionLocal() try: yield db finally: db.close() async def init_db(): """Initialisation de la base de données""" try: # Création des tables Base.metadata.create_all(bind=engine) print("Base de données initialisée avec succès") except Exception as e: print(f"Erreur lors de l'initialisation de la base de données: {e}") raise