import asyncio import os from contextlib import asynccontextmanager from threading import Thread from alembic import command from alembic.config import Config from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from fastapi.responses import RedirectResponse from src.config import DatabaseConfig, logger from src.controllers import api_router from src.models import Base def run_upgrade(connection, alembic_config: Config): alembic_config.attributes["connection"] = connection command.upgrade(alembic_config, "head") async def run_migrations(): logger.info("Running migrations if any...") alembic_config = Config("alembic.ini") alembic_config.set_main_option( "sqlalchemy.url", os.getenv("SQLALCHEMY_DATABASE_URI") ) async with DatabaseConfig.get_engine().begin() as session: await session.run_sync(run_upgrade, alembic_config) @asynccontextmanager async def lifespan(app: FastAPI): try: logger.info("Starting up the application...") await run_migrations() logger.info("Application started successfully...") yield except Exception as e: logger.error(f"Error during startup: {str(e)}") raise finally: logger.info("Shutting down the application...") logger.info("Application shutdown complete.") app = FastAPI(lifespan=lifespan) app.add_middleware( CORSMiddleware, # allow_origins=os.getenv( # "CORS_ALLOW_ORIGINS", "http://localhost, http://127.0.0.1" # ).split(", "), allow_origins=["*"], allow_credentials=False, allow_methods=["*"], allow_headers=["*"], ) @app.get("/") async def check_health(): return RedirectResponse(url="/docs") @app.delete("/api/v1/database") async def delete_all_data(): async with DatabaseConfig.get_engine().begin() as session: await session.run_sync(Base.metadata.drop_all) await session.run_sync(Base.metadata.create_all) return {"response": "All data deleted successfully!"} app.include_router(api_router, prefix="/api/v1")