"""Application.""" import sentry_sdk from fastapi import FastAPI, HTTPException from fastapi.datastructures import Default from fastapi.middleware import Middleware from fastapi.responses import JSONResponse from audience_common.context.asgi.middleware import ( CorrelationIdMiddleware, RequestContextMiddleware, ) from audience_common.logger.asgi.middleware import RequestLoggerMiddleware from jwtauth.asgi.middleware import JWTAuthenticationMiddleware from jwtauth.utils import jwt_auth_enabled_for_env, jwt_auth_from_environment from {{cookiecutter.app_name}} import config from {{cookiecutter.app_name}}.api import error_handlers from {{cookiecutter.app_name}}.api.routers import infra app = FastAPI( debug=config.APP_DEBUG, title=config.SERVICE_NAME, version=config.SERVICE_VERSION, default_response_class=Default(JSONResponse), description="{{cookiecutter.description}}", middleware=[ Middleware(CorrelationIdMiddleware), Middleware(RequestContextMiddleware), Middleware( RequestLoggerMiddleware, exclude_paths=["/hello/", "/redoc", "/docs", "/openapi.json"], ), Middleware( JWTAuthenticationMiddleware, environment=config.ENVIRONMENT, enabled=jwt_auth_enabled_for_env(config.ENVIRONMENT), exclude_paths=["/hello/", "/redoc", "/docs", "/openapi.json"], auth=jwt_auth_from_environment(config.ENVIRONMENT), ), ], ) app.include_router(infra.router) # Register exception handlers app.add_exception_handler(Exception, error_handlers.default_error_handler) app.add_exception_handler( HTTPException, error_handlers.http_error_handler, # type: ignore[arg-type] ) if config.ENVIRONMENT in [config.PROD_ENVIRONMENT, config.QA_ENVIRONMENT]: if not config.SENTRY_DSN: raise Exception(f"Sentry is not configured in {config.ENVIRONMENT}") sentry_sdk.init(dsn=config.SENTRY_DSN)