""" Application root file: Inits the FastAPI application """ from contextlib import asynccontextmanager from typing import AsyncGenerator from fastapi import FastAPI from starlette.middleware.sessions import SessionMiddleware from starlette.middleware.cors import CORSMiddleware from src.config import settings from src.api import api_router from src.auth.config import auth_settings from src.auth.service import get_current_user, get_dev_user @asynccontextmanager async def lifespan(_application: FastAPI) -> AsyncGenerator: # Startup yield # Shutdown if settings.ENVIRONMENT.is_deployed: # Just a precaution, should be False anyway settings.DISABLE_AUTH = False tags_metadata = [ { "name": "User", "description": "User related operations, includes getting information about the current user", } ] app = FastAPI( swagger_ui_init_oauth={ "clientId": auth_settings.CLIENT_ID, "usePkceWithAuthorizationCodeGrant": True, "scopes": "openid profile email", }, openapi_tags=tags_metadata, ) # Type inspection disabled for middleware injection. # Known bug in FastAPI type checking: https://github.com/astral-sh/ty/issues/1635 # noinspection PyTypeChecker app.add_middleware(SessionMiddleware, secret_key=settings.SECRET_KEY.get_secret_value()) # noinspection PyTypeChecker app.add_middleware( CORSMiddleware, allow_origins=settings.CORS_ORIGINS, allow_origin_regex=settings.CORS_ORIGINS_REGEX, allow_credentials=True, allow_methods=("GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"), allow_headers=settings.CORS_HEADERS, ) if settings.ENVIRONMENT == "local" and settings.DISABLE_AUTH: app.dependency_overrides[get_current_user] = get_dev_user app.include_router(api_router)