from collections.abc import AsyncIterator from contextlib import asynccontextmanager from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from fastapi.staticfiles import StaticFiles from app.config import settings from app.routers import admin, auth, cloud_types, clouds, collections, favorites, health, profiles @asynccontextmanager async def lifespan(_: FastAPI) -> AsyncIterator[None]: settings.upload_dir.mkdir(parents=True, exist_ok=True) yield app = FastAPI( title=settings.app_name, version="0.1.0", debug=settings.debug, lifespan=lifespan, ) app.add_middleware( CORSMiddleware, allow_origins=settings.cors_origin_list, allow_credentials=True, allow_methods=["GET", "POST", "PATCH", "DELETE", "OPTIONS"], allow_headers=["Authorization", "Content-Type"], ) for router in ( health.router, auth.router, profiles.router, cloud_types.router, clouds.router, collections.router, favorites.router, admin.router, ): app.include_router(router, prefix=settings.api_v1_prefix) app.mount("/media", StaticFiles(directory=settings.upload_dir, check_dir=False), name="media") @app.get("/", include_in_schema=False) async def root() -> dict[str, str]: return {"name": settings.app_name, "docs": "/docs"}