11import datetime
22import uuid
33from contextlib import asynccontextmanager
4- from typing import Annotated , Any , Dict , Optional
4+ from typing import Any , Dict , Optional
55
6- from fastapi import Depends , FastAPI
6+ from fastapi import FastAPI
77from fastapi .middleware .cors import CORSMiddleware
88from fastapi .responses import JSONResponse
99from loguru import logger
1010from pydantic import BaseModel , Field
1111
12- from config import Settings
1312from app .interface_adapters import api_router
1413from app .interface_adapters .exceptions import AppException
1514from app .interface_adapters .middleware .error_handler import app_exception_handler
1615from app .resource_adapters .persistence .sqlmodel .database import get_engine
16+ from config import settings
1717
1818# https://brandur.org/logfmt
1919# https://github.com/Delgan/loguru
2020# https://betterstack.com/community/guides/logging/loguru/
2121
22+
2223def isRunning () -> bool :
23- #logger.info(f"App state: {dict(app.state.__dict__)}")
24+ # logger.info(f"App state: {dict(app.state.__dict__)}")
2425 running = getattr (app .state , "running" , False )
2526 logger .info (f"Running state: { running } " )
27+ logger .info (f"Environment: { settings .current_env } " )
2628 return running
2729
2830
@@ -35,8 +37,7 @@ async def lifespan(app: FastAPI):
3537
3638 app .state .running = True
3739 logger .info ("Lifespan started" )
38- logger .info (f"App state: { dict (app .state .__dict__ )} " )
39- logger .info (app .state .running )
40+ isRunning ()
4041
4142 yield
4243
@@ -45,8 +46,8 @@ async def lifespan(app: FastAPI):
4546
4647
4748def is_configured () -> bool :
48- logger .info (f"configured: { Settings . get_settings (). env_smoke_test == " configured" } " )
49- return Settings . get_settings () .env_smoke_test == "configured"
49+ logger .info (f"configured: { settings . env_smoke_test == ' configured' } " )
50+ return settings .env_smoke_test == "configured"
5051
5152
5253""" {
@@ -86,7 +87,7 @@ def create_health_response(is_healthy: bool, check_name: str) -> JSONResponse:
8687 status = "pass" if is_healthy else "fail"
8788 response = HealthCheck (
8889 status = status ,
89- version = Settings . get_settings () .project_name ,
90+ version = settings .project_name ,
9091 description = f"Service { status } " ,
9192 checks = {
9293 check_name : {
@@ -105,7 +106,7 @@ def create_health_response(is_healthy: bool, check_name: str) -> JSONResponse:
105106
106107app = FastAPI (
107108 lifespan = lifespan ,
108- title = Settings . get_settings (). project_name ,
109+ title = settings . project_name , # Use settings directly
109110 openapi_url = "/v1/openapi.json" ,
110111)
111112
@@ -129,6 +130,7 @@ def create_health_response(is_healthy: bool, check_name: str) -> JSONResponse:
129130# gzip compression - GZipMiddleware
130131# ssl enforcement - HTTPSRedirectMiddleware
131132
133+
132134@app .middleware ("http" )
133135async def add_request_id (request , call_next ):
134136 request_id = str (uuid .uuid4 ())
@@ -138,47 +140,49 @@ async def add_request_id(request, call_next):
138140 logger .info (f"Request { request_id } to { request .url .path } " )
139141 return response
140142
143+
141144@app .middleware ("http" )
142145async def add_process_time_header (request , call_next ):
143146 import time
147+
144148 start_time = time .perf_counter ()
145149 response = await call_next (request )
146150 process_time = time .perf_counter () - start_time
147151 response .headers ["X-Process-Time" ] = str (process_time )
148152 logger .info (f"Request to { request .url .path } took { process_time :.4f} seconds" )
149153 return response
150154
155+
151156app .add_middleware (
152157 CORSMiddleware ,
153- allow_origins = ["*" ], # Set this to lock down if applicable to your use case
154- # allow_origins=[str(origin) for origin in settings.BACKEND_CORS_ORIGINS],
155- allow_credentials = False , # Must be false if all origins (*) is allowed
156- allow_methods = ["*" ],
157- allow_headers = ["X-Forwarded-For" , "Authorization" , "Content-Type" , "X-Request-ID" ],
158- expose_headers = ["X-Process-Time" , "X-Request-ID" ]
158+ allow_origins = (
159+ [str (origin ) for origin in settings .backend_cors_origins ]
160+ if settings .backend_cors_origins
161+ else ["*" ]
162+ ),
163+ allow_credentials = settings .cors_allow_credentials ,
164+ allow_methods = settings .cors_allow_methods ,
165+ allow_headers = settings .cors_allow_headers ,
166+ expose_headers = settings .cors_expose_headers ,
159167)
160168
161169
162170@app .get ("/" )
163- async def root (
164- settings : Annotated [Settings , Depends (Settings .get_settings )],
165- ) -> Dict [str , Any ]:
171+ async def root () -> Dict [str , Any ]:
166172 return {
167173 "app_name" : settings .project_name ,
168174 "system_time" : datetime .datetime .now (),
169175 }
170176
171177
172178@app .get ("/info" )
173- async def info (
174- settings : Annotated [Settings , Depends (Settings .get_settings )],
175- ) -> Dict [str , Any ]:
176- logger .info (settings .model_dump ())
179+ async def info () -> Dict [str , Any ]:
177180 return {
178181 "app_name" : settings .project_name ,
179182 "system_time" : datetime .datetime .now (),
180183 "execution_mode" : settings .execution_mode ,
181184 "env_smoke_test" : settings .env_smoke_test ,
185+ "env" : settings .current_env ,
182186 }
183187
184188
0 commit comments