"""Application.""" import sentry_sdk from audience_common.logger.asgi.middleware import RequestLoggerMiddleware from fastapi import FastAPI, HTTPException from fastapi.datastructures import Default from fastapi.middleware import Middleware from fastapi.responses import JSONResponse from jwtauth.asgi.middleware import JWTAuthenticationMiddleware from jwtauth.utils import jwt_auth_enabled_for_env, jwt_auth_from_environment from contributor import config from contributor.api import error_handlers from contributor.api.context.asgi.middleware import ( CorrelationIdMiddleware, RequestContextMiddleware, ) from contributor.api.datasources import datasources_lifespan from contributor.api.routers import ( contributors, global_participants, infra, participation_roles, products, projects, services, tracks, ) _EXCLUDE_PATHS = [r"^/hello/$", r"^/redoc$", r"^/docs$", r"^/openapi.json$"] app = FastAPI( debug=config.APP_DEBUG, title=config.SERVICE_NAME, version=config.SERVICE_VERSION, default_response_class=Default(JSONResponse), description="Contributor and artist metadata service", lifespan=datasources_lifespan, middleware=[ Middleware(CorrelationIdMiddleware), Middleware(RequestContextMiddleware), Middleware( RequestLoggerMiddleware, exclude_paths=_EXCLUDE_PATHS, ), Middleware( JWTAuthenticationMiddleware, environment=config.ENVIRONMENT, enabled=jwt_auth_enabled_for_env(config.ENVIRONMENT), exclude_paths=_EXCLUDE_PATHS, auth=jwt_auth_from_environment(config.ENVIRONMENT), ), ], ) app.include_router(infra.router) app.include_router(contributors.router) app.include_router(global_participants.router) app.include_router(projects.router) app.include_router(products.router) app.include_router(services.router) app.include_router(tracks.router) app.include_router(participation_roles.router) # Register exception handlers app.add_exception_handler(Exception, error_handlers.default_error_handler) app.add_exception_handler(HTTPException, error_handlers.http_error_handler) 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)