"""Shared datasources — initialised once via FastAPI lifespan.""" import logging from contextlib import asynccontextmanager from typing import Any, AsyncIterator from fastapi import FastAPI from owsclient import OwsClient from owscontext import get_correlation_id, get_request_context from python_pdp_sdk import MigrationAuthorizationBackend, PdpAuthorizationBackend from python_pdp_sdk.backends.authorization_backend import AuthorizationBackend from python_pdp_sdk.connectors.ows_pdp.ows_pdp import OwsPdpClient import config from context import request_tags logger = logging.getLogger(__name__) AUTHORIZATION_BACKEND_KEY = "AUTHORIZATION_BACKEND" OWS_CLIENT_KEY = "OWS_CLIENT" DATA_SOURCES: dict[str, Any] = {} @asynccontextmanager async def lifespan(app: FastAPI) -> AsyncIterator[dict[str, Any]]: ows_client = setup_ows_client() logger.info("[lifespan] Initialized ows client") DATA_SOURCES[OWS_CLIENT_KEY] = ows_client authorization_backend = setup_authorization_backend(ows_client) logger.info("[lifespan] Initialized authorization backend") DATA_SOURCES[AUTHORIZATION_BACKEND_KEY] = authorization_backend try: yield DATA_SOURCES finally: DATA_SOURCES.clear() def setup_ows_client() -> OwsClient: """Create and return a configured OwsClient instance.""" return OwsClient( environment=config.ENVIRONMENT, service_name=config.SERVICE_NAME, correlation_id_getter=get_correlation_id, request_context_getter=get_request_context, ) def setup_authorization_backend(ows_client: OwsClient) -> AuthorizationBackend: """Create and return a MigrationAuthorizationBackend wrapping PdpAuthorizationBackend.""" pdp_backend = PdpAuthorizationBackend(OwsPdpClient(ows_client)) return MigrationAuthorizationBackend( inner_backend=pdp_backend, service_name=config.SERVICE_NAME, environment=config.DD_ENV, dd_api_key=config.DD_API_KEY, extra_tags_getter=request_tags, ) def get_authorization_backend() -> AuthorizationBackend: return DATA_SOURCES[AUTHORIZATION_BACKEND_KEY]