from collections.abc import AsyncGenerator from contextlib import asynccontextmanager from mimetypes import init from fastapi import FastAPI, Request, HTTPException from fastapi.responses import JSONResponse from fastapi.middleware.cors import CORSMiddleware from fastapi.middleware.gzip import GZipMiddleware from fuware.core.config import get_app_settings from fuware.core.root_logger import get_logger from fuware.routes import router from fuware import __version__ import uvicorn settings = get_app_settings() logger = get_logger() description = f""" fuware is a web application for managing your hours items and tracking them. """ @asynccontextmanager async def lifespan_fn(_: FastAPI) -> AsyncGenerator[None, None]: logger.info("start: database initialization") import fuware.db.init_db as init_db init_db.main() logger.info("end: database initialization") logger.info("-----SYSTEM STARTUP-----") # logger.info("------APP SETTINGS------") # logger.info( # settings.model_dump_json( # indent=4, # exclude={ # "SECRET", # "DB_URL", # replace by DB_URL_PUBLIC for logs # "DB_PROVIDER", # }, # ) # ) yield logger.info("-----SYSTEM SHUTDOWN-----") app = FastAPI( title="Fuware", description=description, version=__version__, docs_url=settings.DOCS_URL, redoc_url=settings.REDOC_URL, lifespan=lifespan_fn, ) app.add_middleware(GZipMiddleware, minimum_size=1000) if not settings.PRODUCTION: allowed_origins = ["http://localhost:3000"] app.add_middleware( CORSMiddleware, allow_origins=allowed_origins, allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) @app.exception_handler(HTTPException) async def unicorn_exception_handler(request: Request, exc: HTTPException): return JSONResponse( status_code=exc.status_code, content={"status": exc.status_code, "data": exc.detail}, ) def api_routers(): app.include_router(router) api_routers() # app.include_router(authR.authRouter) # app.include_router(userR.userRouter) def main(): uvicorn.run("app:app", host="0.0.0.0", port=settings.API_PORT, reload=True, workers=1, forwarded_allow_ips="*") if __name__ == "__main__": main()