89 lines
2.4 KiB
Python
89 lines
2.4 KiB
Python
from collections.abc import AsyncGenerator
|
|
from contextlib import asynccontextmanager
|
|
from fastapi import FastAPI, Request, HTTPException
|
|
from fastapi.exceptions import RequestValidationError
|
|
from fastapi.responses import JSONResponse
|
|
from fastapi.middleware.cors import CORSMiddleware
|
|
from fastapi.middleware.gzip import GZipMiddleware
|
|
|
|
from backend.core.config import get_app_settings
|
|
from backend.core.root_logger import get_logger
|
|
from backend.routes import router
|
|
from backend import __version__
|
|
import uvicorn
|
|
|
|
settings = get_app_settings()
|
|
logger = get_logger()
|
|
|
|
description = f"""
|
|
fuware is a web application for managing your house items and tracking them.
|
|
"""
|
|
|
|
@asynccontextmanager
|
|
async def lifespan_fn(_: FastAPI) -> AsyncGenerator[None, None]:
|
|
logger.info("start: database initialization")
|
|
import backend.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},
|
|
)
|
|
|
|
@app.exception_handler(RequestValidationError)
|
|
async def validation_exception_handler(request: Request, exc: RequestValidationError):
|
|
print(exc)
|
|
return JSONResponse(status_code=422, content={"status": 422, "data": str(exc)})
|
|
|
|
def api_routers():
|
|
app.include_router(router)
|
|
|
|
api_routers()
|
|
|
|
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()
|