diff --git a/config/database.py b/config/database.py index ebd82d5..f8a6db4 100644 --- a/config/database.py +++ b/config/database.py @@ -1,129 +1,17 @@ -from datetime import datetime from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession from sqlalchemy.orm import sessionmaker -from sqlalchemy import Table, Column, Integer, String, DateTime, Boolean, MetaData, ForeignKey, Text from config.settings import settings import logging -# Configuration du logging logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) -# Métadonnées pour les tables -metadata = MetaData() - -# Table des utilisateurs -users_table = Table( - "users", - metadata, - Column("id", Integer, primary_key=True), - Column("email", String(255), unique=True, nullable=False), # VARCHAR(255) - Column("full_name", String(255), nullable=False), # VARCHAR(255) - Column("phone", String(20), nullable=False), # VARCHAR(20) - Column("date_of_birth", DateTime, nullable=False), - Column("organization", String(255)), # VARCHAR(255) - Column("hashed_password", String(255), nullable=False), # VARCHAR(255) - Column("role", String(50), default="user"), # VARCHAR(50) - Column("is_blocked", Boolean, default=False), - Column("is_deleted", Boolean, default=False) -) - -# Table des rôles -roles_table = Table( - "roles", - metadata, - Column("id", Integer, primary_key=True), - Column("name", String(50), unique=True, nullable=False), # VARCHAR(50) - Column("permissions", Text) # Stocke les permissions sous forme de chaîne séparée par des virgules -) - -# Table des demandes de besoin -need_requests_table = Table( - "need_requests", - metadata, - Column("id", Integer, primary_key=True), - Column("category", String(50), nullable=False), # Ex: "water", "food", "medical assistance" - Column("description", Text, nullable=False), - Column("adults", Integer, nullable=False), - Column("children", Integer, nullable=False), - Column("vulnerable", Integer, nullable=False), - Column("location", String(255), nullable=False), # VARCHAR(255) - Column("gps_coordinates", String(100)), # VARCHAR(100) - Column("requester_email", String(255), ForeignKey("users.email"), nullable=False), # VARCHAR(255) - Column("assigned_to", Integer, ForeignKey("users.id")), # Utilisateur qui a pris en charge la demande - Column("status", String(50), default="pending") # Ex: "pending", "in_progress", "completed" -) - -# Table des signalements d'utilisateurs -user_reports_table = Table( - "user_reports", - metadata, - Column("id", Integer, primary_key=True), - Column("reporter_id", Integer, ForeignKey("users.id"), nullable=False), - Column("reported_user_id", Integer, ForeignKey("users.id"), nullable=False), - Column("reason", Text, nullable=False), - Column("status", String(50), default="pending") # Ex: "pending", "resolved" -) - -# Table des problèmes techniques -technical_issues_table = Table( - "technical_issues", - metadata, - Column("id", Integer, primary_key=True), - Column("user_id", Integer, ForeignKey("users.id"), nullable=False), - Column("description", Text, nullable=False), - Column("status", String(50), default="open") # Ex: "open", "in_progress", "resolved" -) - -# Table des points d'intérêt -points_of_interest_table = Table( - "points_of_interest", - metadata, - Column("id", Integer, primary_key=True), - Column("label", String(255), nullable=False), # VARCHAR(255) - Column("description", Text), - Column("icon", String(255)), # URL de l'icône (VARCHAR(255)) - Column("organization", String(255)), # VARCHAR(255) - Column("gps_coordinates", String(100), nullable=False), # VARCHAR(100) - Column("added_by", Integer, ForeignKey("users.id"), nullable=False) -) - -# Table des abris -shelters_table = Table( - "shelters", - metadata, - Column("id", Integer, primary_key=True), - Column("label", String(255), nullable=False), # VARCHAR(255) - Column("description", Text), - Column("status", String(50), default="available"), # Ex: "available", "full", "closed" - Column("contact_person", String(255)), # VARCHAR(255) - Column("gps_coordinates", String(100), nullable=False), # VARCHAR(100) - Column("added_by", Integer, ForeignKey("users.id"), nullable=False) -) - -# Table des déclarations de personnes -person_reports_table = Table( - "person_reports", - metadata, - Column("id", Integer, primary_key=True), - Column("full_name", String(255), nullable=False), # VARCHAR(255) - Column("date_of_birth", DateTime, nullable=False), - Column("status", String(50), nullable=False), # Ex: "missing", "safe", "deceased" - Column("location", String(255)), # VARCHAR(255) - Column("gps_coordinates", String(100)), # VARCHAR(100) - Column("photo_url", String(255)), # URL de la photo (VARCHAR(255)) - Column("reporter_email", String(255), ForeignKey("users.email"), nullable=False), # VARCHAR(255) - Column("created_at", DateTime, default=datetime.utcnow), # Date de création - Column("updated_at", DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) # Date de mise à jour -) - -# Connexion à la base de données DATABASE_URL = settings.database_url engine = create_async_engine(DATABASE_URL, echo=True) AsyncSessionLocal = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False) -# Fonction pour initialiser la base de données async def init_db(): + from models.db import metadata try: async with engine.begin() as conn: await conn.run_sync(metadata.create_all) @@ -132,7 +20,6 @@ async def init_db(): logger.error(f"Error creating database tables: {str(e)}") raise -# Fonction pour obtenir une session de base de données async def get_db(): async with AsyncSessionLocal() as session: - yield session \ No newline at end of file + yield session diff --git a/models/db.py b/models/db.py index 6dd10a4..328fd62 100644 --- a/models/db.py +++ b/models/db.py @@ -1,61 +1,49 @@ -from datetime import datetime -from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession -from sqlalchemy.orm import sessionmaker from sqlalchemy import Table, Column, Integer, String, DateTime, Boolean, MetaData, ForeignKey, Text -from config.settings import settings -import logging +from datetime import datetime -# Configuration du logging -logging.basicConfig(level=logging.INFO) -logger = logging.getLogger(__name__) - -# Métadonnées pour les tables metadata = MetaData() -# Table des utilisateurs +# Table definitions users_table = Table( "users", metadata, Column("id", Integer, primary_key=True), - Column("email", String(255), unique=True, nullable=False), # VARCHAR(255) - Column("full_name", String(255), nullable=False), # VARCHAR(255) - Column("phone", String(20), nullable=False), # VARCHAR(20) + Column("email", String(255), unique=True, nullable=False), + Column("full_name", String(255), nullable=False), + Column("phone", String(20), nullable=False), Column("date_of_birth", DateTime, nullable=False), - Column("organization", String(255)), # VARCHAR(255) - Column("hashed_password", String(255), nullable=False), # VARCHAR(255) - Column("role", String(50), default="user"), # VARCHAR(50) + Column("organization", String(255)), + Column("hashed_password", String(255), nullable=False), + Column("role", String(50), default="user"), Column("is_blocked", Boolean, default=False), Column("is_deleted", Boolean, default=False) ) -# Table des rôles roles_table = Table( "roles", metadata, Column("id", Integer, primary_key=True), - Column("name", String(50), unique=True, nullable=False), # VARCHAR(50) - Column("permissions", Text) # Stocke les permissions sous forme de chaîne séparée par des virgules + Column("name", String(50), unique=True, nullable=False), + Column("permissions", Text) ) -# Table des demandes de besoin need_requests_table = Table( "need_requests", metadata, Column("id", Integer, primary_key=True), - Column("category", String(50), nullable=False), # Ex: "water", "food", "medical assistance" + Column("category", String(50), nullable=False), Column("description", Text, nullable=False), Column("adults", Integer, nullable=False), Column("children", Integer, nullable=False), Column("vulnerable", Integer, nullable=False), - Column("location", String(255), nullable=False), # VARCHAR(255) - Column("gps_coordinates", String(100)), # VARCHAR(100) - Column("requester_email", String(255), ForeignKey("users.email"), nullable=False), # VARCHAR(255) - Column("assigned_to", Integer, ForeignKey("users.id")), # Utilisateur qui a pris en charge la demande - Column("status", String(50), default="pending"), # Ex: "pending", "in_progress", "completed" - Column("deleted", DateTime, default=None) # Marque la suppression logique + Column("location", String(255), nullable=False), + Column("gps_coordinates", String(100)), + Column("requester_email", String(255), ForeignKey("users.email"), nullable=False), + Column("assigned_to", Integer, ForeignKey("users.id")), + Column("status", String(50), default="pending"), + Column("deleted", DateTime, default=None) ) -# Table des signalements d'utilisateurs user_reports_table = Table( "user_reports", metadata, @@ -63,77 +51,53 @@ user_reports_table = Table( Column("reporter_id", Integer, ForeignKey("users.id"), nullable=False), Column("reported_user_id", Integer, ForeignKey("users.id"), nullable=False), Column("reason", Text, nullable=False), - Column("status", String(50), default="pending") # Ex: "pending", "resolved" + Column("status", String(50), default="pending") ) -# Table des problèmes techniques technical_issues_table = Table( "technical_issues", metadata, Column("id", Integer, primary_key=True), Column("user_id", Integer, ForeignKey("users.id"), nullable=False), Column("description", Text, nullable=False), - Column("status", String(50), default="open") # Ex: "open", "in_progress", "resolved" + Column("status", String(50), default="open") ) -# Table des points d'intérêt points_of_interest_table = Table( "points_of_interest", metadata, Column("id", Integer, primary_key=True), - Column("label", String(255), nullable=False), # VARCHAR(255) + Column("label", String(255), nullable=False), Column("description", Text), - Column("icon", String(255)), # URL de l'icône (VARCHAR(255)) - Column("organization", String(255)), # VARCHAR(255) - Column("gps_coordinates", String(100), nullable=False), # VARCHAR(100) + Column("icon", String(255)), + Column("organization", String(255)), + Column("gps_coordinates", String(100), nullable=False), Column("added_by", Integer, ForeignKey("users.id"), nullable=False) ) -# Table des abris shelters_table = Table( "shelters", metadata, Column("id", Integer, primary_key=True), - Column("label", String(255), nullable=False), # VARCHAR(255) + Column("label", String(255), nullable=False), Column("description", Text), - Column("status", String(50), default="available"), # Ex: "available", "full", "closed" - Column("contact_person", String(255)), # VARCHAR(255) - Column("gps_coordinates", String(100), nullable=False), # VARCHAR(100) + Column("status", String(50), default="available"), + Column("contact_person", String(255)), + Column("gps_coordinates", String(100), nullable=False), Column("added_by", Integer, ForeignKey("users.id"), nullable=False) ) -# Table des déclarations de personnes person_reports_table = Table( "person_reports", metadata, Column("id", Integer, primary_key=True), - Column("full_name", String(255), nullable=False), # VARCHAR(255) + Column("full_name", String(255), nullable=False), Column("date_of_birth", DateTime, nullable=False), - Column("status", String(50), nullable=False), # Ex: "missing", "safe", "deceased" - Column("location", String(255)), # VARCHAR(255) - Column("gps_coordinates", String(100)), # VARCHAR(100) - Column("photo_url", String(255)), # URL de la photo (VARCHAR(255)) - Column("reporter_email", String(255), ForeignKey("users.email"), nullable=False), # VARCHAR(255) - Column("created_at", DateTime, default=datetime.utcnow), # Date de création - Column("updated_at", DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) # Date de mise à jour -) - -# Connexion à la base de données -DATABASE_URL = settings.database_url -engine = create_async_engine(DATABASE_URL, echo=True) -AsyncSessionLocal = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False) - -# Fonction pour initialiser la base de données -async def init_db(): - try: - async with engine.begin() as conn: - await conn.run_sync(metadata.create_all) - logger.info("Database tables created successfully.") - except Exception as e: - logger.error(f"Error creating database tables: {str(e)}") - raise - -# Fonction pour obtenir une session de base de données -async def get_db(): - async with AsyncSessionLocal() as session: - yield session \ No newline at end of file + Column("status", String(50), nullable=False), + Column("location", String(255)), + Column("gps_coordinates", String(100)), + Column("photo_url", String(255)), + Column("reporter_email", String(255), ForeignKey("users.email"), nullable=False), + Column("created_at", DateTime, default=datetime.utcnow), + Column("updated_at", DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) +) \ No newline at end of file