api-admim/app/main.py

111 lines
3.3 KiB
Python

import asyncio
from fastapi import FastAPI, Request
from contextlib import asynccontextmanager
from fastapi.exceptions import ResponseValidationError, RequestValidationError
from pydantic import ValidationError
from starlette.exceptions import HTTPException as StarletteHTTPException
from fastapi.responses import JSONResponse
from app.database.session import sessionmanager
from app.routers import rotas
# Importação das Rotas
from app.config import URL_BD
from app.routers.router_registry import RouterRegistry
from fastapi.middleware.cors import CORSMiddleware
# from starlette.middleware.cors import CORSMiddleware
def init_app(init_db=True):
lifespan = None
if init_db:
sessionmanager.init(URL_BD)
@asynccontextmanager
async def lifespan(app_init: FastAPI):
yield
if sessionmanager.is_initialized(): # Usa o método público para checar o engine
await sessionmanager.close()
server = FastAPI(title="Sonora Tecnologia Admin", lifespan=lifespan)
server.add_middleware(
CORSMiddleware,
allow_origins=["http://localhost:4200",
"http://srv-captain--sistema/",
"https://srv-captain--sistema/",
"https://app.sonoraav.com.br",
"http://app.sonoraav.com.br",
], # Domínio do seu frontend
allow_credentials=True,
allow_methods=["*"], # Permitir todos os métodos (ou especifique "POST" se necessário)
allow_headers=["*"],
)
# Registro dinâmico das rotas
router_registry = RouterRegistry(server, rotas.routers)
router_registry.register_routers()
return server
# Definindo o objeto "app" para estar disponível em todos os contextos
app = init_app()
@app.exception_handler(ResponseValidationError)
async def response_validation_exception_handler(request: Request, exc: ResponseValidationError):
return JSONResponse(
status_code=500,
content={"message": "Erro ao validar a resposta do servidor."},
)
@app.exception_handler(RequestValidationError)
async def validation_exception_handler(request: Request, exc: RequestValidationError):
return JSONResponse(
status_code=422,
content={"detail": exc.errors()},
)
@app.exception_handler(StarletteHTTPException)
async def starlette_http_exception_handler(request: Request, exc: StarletteHTTPException):
return JSONResponse(
status_code=exc.status_code,
content={"detail": "API Administrativa Eventos"},
)
@app.exception_handler(ValidationError)
async def pydantic_validation_exception_handler(request: Request, exc: ValidationError):
return JSONResponse(
status_code=422,
content={"detail": exc.errors()},
)
@app.exception_handler(asyncio.TimeoutError)
async def timeout_error_handler(request: Request, exc: asyncio.TimeoutError):
return JSONResponse(
status_code=504,
content={"detail": "A operação excedeu o tempo limite."},
)
if __name__ == "__main__":
# Código de inicialização que só roda se o arquivo for executado diretamente
app = init_app()
# Exemplo de inicialização do servidor (se necessário)
# import uvicorn
# uvicorn.run("app", host="0.0.0.0", port=8000)