""" Application FastAPI principale. """ import logging from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from .config import settings from .database import init_db, get_db from .routes import router from .init_blockchain import initialize_elections_blockchain from .logging_config import setup_logging # Setup logging for the entire application setup_logging(level=logging.INFO) logger = logging.getLogger(__name__) logger.info("=" * 70) logger.info("🚀 Starting E-Voting Backend") logger.info("=" * 70) # Initialiser la base de données logger.info("📦 Initializing database...") try: init_db() logger.info("✓ Database initialized successfully") except Exception as e: logger.error(f"✗ Database initialization failed: {e}", exc_info=True) raise # Initialiser la blockchain avec les élections existantes logger.info("⛓️ Initializing blockchain...") try: db = next(get_db()) initialize_elections_blockchain(db) db.close() logger.info("✓ Blockchain initialization completed") except Exception as e: logger.error(f"⚠️ Blockchain initialization failed (non-fatal): {e}", exc_info=True) logger.info("=" * 70) logger.info("✓ Backend initialization complete, starting FastAPI app") logger.info("=" * 70) # Créer l'application FastAPI app = FastAPI( title=settings.app_name, version=settings.app_version, debug=settings.debug ) # Configuration CORS # Allow frontend to communicate with backend app.add_middleware( CORSMiddleware, allow_origins=[ "http://localhost:3000", "http://localhost:8000", "http://127.0.0.1:3000", "http://127.0.0.1:8000", "http://frontend:3000", # Docker compose service name ], allow_credentials=True, allow_methods=["GET", "POST", "PUT", "DELETE", "OPTIONS"], allow_headers=["*"], ) # Inclure les routes app.include_router(router) @app.on_event("startup") async def startup_event(): """Initialize blockchain client on application startup""" from .routes.votes import init_blockchain_client try: await init_blockchain_client() logger.info("✓ Blockchain client initialized successfully") except Exception as e: logger.warning(f"⚠️ Blockchain client initialization failed: {e}") @app.get("/health") async def health_check(): """Vérifier l'état de l'application""" return {"status": "ok", "version": settings.app_version} @app.get("/") async def root(): """Endpoint root""" return { "name": settings.app_name, "version": settings.app_version, "docs": "/docs" }