diff --git a/app/main.py b/app/main.py index e8b5eec..dbec834 100644 --- a/app/main.py +++ b/app/main.py @@ -5,8 +5,12 @@ from fastapi.security import OAuth2PasswordBearer from fastapi.middleware.cors import CORSMiddleware from fastapi.openapi.docs import get_redoc_html -from starlette.status import HTTP_422_UNPROCESSABLE_ENTITY, HTTP_500_INTERNAL_SERVER_ERROR +from starlette.status import ( + HTTP_422_UNPROCESSABLE_ENTITY, + HTTP_500_INTERNAL_SERVER_ERROR, +) from contextlib import asynccontextmanager +from fastapi.responses import HTMLResponse from .middleware.middleware import ExceptionLoggingMiddleware from .routers import auth, customer @@ -15,10 +19,13 @@ from .database.database import Base, SessionLocal, engine Base.metadata.create_all(bind=engine) + + def init_admin_user() -> None: """Inicializa o usuário admin e configura o banco de dados. - Cria um usuário administrador e inicializa o banco de dados com dados padrão. + Cria um usuário administrador e inicializa o banco de dados com dados + padrão. Returns: None @@ -28,7 +35,8 @@ def init_admin_user() -> None: create_admin_user(db) finally: db.close() - + + @asynccontextmanager async def lifespan(app: FastAPI): """Executa tarefas antes de iniciar a API""" @@ -63,39 +71,52 @@ async def lifespan(app: FastAPI): app.include_router(auth.router, tags=['authentication']) app.include_router(customer.router, prefix='/customers', tags=['customers']) + +STATUS_CODE = "status code" + + @app.exception_handler(RequestValidationError) async def validation_exception_handler(request, exc): logger.error(f"Validation error: {exc}") return JSONResponse( status_code=HTTP_422_UNPROCESSABLE_ENTITY, content={ - "status code": 422, - "msg": f"Validation error in request body or parameters: {exc.errors()}" + STATUS_CODE: 422, + "msg": ( + f"Validation error in request body or parameters: " + f"{exc.errors()}" + ) }, ) + @app.exception_handler(HTTPException) async def http_exception_handler(request, exc): logger.error(f"HTTP error: {exc.detail}") return JSONResponse( status_code=exc.status_code, content={ - "status code": exc.status_code, + STATUS_CODE: exc.status_code, "msg": exc.detail, }, ) + @app.exception_handler(Exception) async def global_exception_handler(request, exc): logger.error(f"Unexpected server error: {str(exc)}", exc_info=True) return JSONResponse( status_code=HTTP_500_INTERNAL_SERVER_ERROR, content={ - "status code": 500, - "msg": "An unexpected error occurred. Please try again later or contact your Support Team." + STATUS_CODE: 500, + "msg": """ + An unexpected error occurred. + Please try again later or contact your Support Team. + """ }, ) + @app.get('/health', tags=['health']) def health_check() -> dict: """Retorna o status operacional da aplicação. @@ -106,26 +127,31 @@ def health_check() -> dict: logger.debug('Status endpoint accessed') return {'status': 'Operational'} -# Adiciona a rota para a documentação do ReDoc + @app.get('/redoc', include_in_schema=False, tags=['documentation']) -async def redoc() -> str: +async def redoc() -> HTMLResponse: """Retorna o HTML para a documentação do ReDoc. Returns: - str: O HTML da documentação do ReDoc. + HTMLResponse: O HTML da documentação do ReDoc. """ return get_redoc_html( openapi_url=app.openapi_url, title=app.title + ' - ReDoc', - redoc_js_url='https://cdn.jsdelivr.net/npm/redoc/bundles/redoc.standalone.js', + redoc_js_url=( + 'https://cdn.jsdelivr.net/npm/redoc/bundles/redoc.standalone.js' + ), ) + @app.get('/docs', tags=['documentation']) def get_docs(): return app.openapi() + def run_server(): uvicorn.run("app.main:app", host="127.0.0.1", port=8000, reload=True) + if __name__ == '__main__': run_server()