Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 38 additions & 12 deletions app/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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"""
Expand Down Expand Up @@ -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.
Expand All @@ -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()