11import logging
22
3- from fastapi import FastAPI , HTTPException
4- from fastapi .exceptions import RequestValidationError
3+ from common_library .basic_types import BootModeEnum
4+ from fastapi import FastAPI
5+ from fastapi .middleware .gzip import GZipMiddleware
6+ from fastapi_pagination import add_pagination
7+ from servicelib .fastapi import timing_middleware
8+ from servicelib .fastapi .http_error import set_app_default_http_error_handlers
59from servicelib .fastapi .openapi import override_fastapi_openapi_method
610from servicelib .fastapi .prometheus_instrumentation import (
711 setup_prometheus_instrumentation ,
812)
913from servicelib .fastapi .tracing import initialize_tracing
10- from servicelib . logging_utils import config_all_loggers
14+ from starlette . middleware . base import BaseHTTPMiddleware
1115
1216from .._meta import API_VERSION , API_VTAG , APP_NAME
13- from ..api .errors .http_error import http_error_handler
14- from ..api .errors .validation_error import http422_error_handler
15- from ..api .module_setup import setup_api
17+ from ..api .routes import setup_rest_api_routes
1618from ..modules import pennsieve
1719from .events import (
1820 create_start_app_handler ,
2931 "hpack" ,
3032)
3133
32- logger = logging .getLogger (__name__ )
34+ _logger = logging .getLogger (__name__ )
3335
3436
35- def create_app (settings : ApplicationSettings | None = None ) -> FastAPI :
36- if settings is None :
37- settings = ApplicationSettings .create_from_envs ()
38- assert settings # nosec
39-
40- logging .basicConfig (level = settings .LOG_LEVEL .value )
41- logging .root .setLevel (settings .LOG_LEVEL .value )
42- config_all_loggers (
43- log_format_local_dev_enabled = settings .DATCORE_ADAPTER_LOG_FORMAT_LOCAL_DEV_ENABLED ,
44- logger_filter_mapping = settings .DATCORE_ADAPTER_LOG_FILTER_MAPPING ,
45- tracing_settings = settings .DATCORE_ADAPTER_TRACING ,
46- )
47-
37+ def create_app (settings : ApplicationSettings ) -> FastAPI :
4838 # keep mostly quiet noisy loggers
4939 quiet_level : int = max (
5040 min (logging .root .level + LOG_LEVEL_STEP , logging .CRITICAL ), logging .WARNING
5141 )
5242
5343 for name in NOISY_LOGGERS :
5444 logging .getLogger (name ).setLevel (quiet_level )
55- logger .debug ("App settings:\n %s" , settings .model_dump_json (indent = 2 ))
45+
46+ _logger .debug ("App settings:\n %s" , settings .model_dump_json (indent = 1 ))
5647
5748 app = FastAPI (
58- debug = settings .debug ,
59- title = "Datcore Adapter Service" ,
49+ debug = settings .SC_BOOT_MODE
50+ in [BootModeEnum .DEBUG , BootModeEnum .DEVELOPMENT , BootModeEnum .LOCAL ],
51+ title = APP_NAME ,
6052 description = "Interfaces with Pennsieve storage service" ,
6153 version = API_VERSION ,
6254 openapi_url = f"/api/{ API_VTAG } /openapi.json" ,
6355 docs_url = "/dev/doc" ,
6456 redoc_url = None , # default disabled
6557 )
6658 override_fastapi_openapi_method (app )
59+ add_pagination (app )
6760
6861 app .state .settings = settings
6962
@@ -76,19 +69,25 @@ def create_app(settings: ApplicationSettings | None = None) -> FastAPI:
7669 APP_NAME ,
7770 )
7871
72+ if settings .SC_BOOT_MODE != BootModeEnum .PRODUCTION :
73+ # middleware to time requests (ONLY for development)
74+ app .add_middleware (
75+ BaseHTTPMiddleware , dispatch = timing_middleware .add_process_time_header
76+ )
77+ app .add_middleware (GZipMiddleware )
78+
7979 # events
8080 app .add_event_handler ("startup" , on_startup )
8181 app .add_event_handler ("startup" , create_start_app_handler (app ))
8282 app .add_event_handler ("shutdown" , create_stop_app_handler (app ))
8383 app .add_event_handler ("shutdown" , on_shutdown )
8484
8585 # Routing
86- setup_api (app )
86+ setup_rest_api_routes (app )
8787
8888 if settings .PENNSIEVE .PENNSIEVE_ENABLED :
8989 pennsieve .setup (app , settings .PENNSIEVE )
9090
91- app .add_exception_handler (HTTPException , http_error_handler )
92- app .add_exception_handler (RequestValidationError , http422_error_handler )
91+ set_app_default_http_error_handlers (app )
9392
9493 return app
0 commit comments