Spaces:
Running
Running
| from __future__ import annotations | |
| from pathlib import Path | |
| from fastapi import FastAPI | |
| from fastapi.middleware.cors import CORSMiddleware | |
| from fastapi.responses import JSONResponse | |
| from fastapi.staticfiles import StaticFiles | |
| from app.api import auth, elaboracao, health, logs, pesquisa, repositorio, session, visualizacao | |
| from app.services import auth_service | |
| app = FastAPI( | |
| title="MESA Frame API", | |
| version="1.0.0", | |
| description="Backend FastAPI para o app MESA (Elaboracao + Visualizacao)", | |
| ) | |
| app.add_middleware( | |
| CORSMiddleware, | |
| allow_origins=["*"], | |
| allow_credentials=True, | |
| allow_methods=["*"], | |
| allow_headers=["*"], | |
| ) | |
| async def auth_middleware(request, call_next): # type: ignore[no-untyped-def] | |
| path = request.url.path | |
| if request.method.upper() == "OPTIONS": | |
| return await call_next(request) | |
| if path.startswith("/api"): | |
| if path == "/api/health" or path == "/api/auth/login": | |
| return await call_next(request) | |
| token = auth_service.extract_token_from_request(request) | |
| user = auth_service.get_user_by_token(token) | |
| if user is None: | |
| return JSONResponse(status_code=401, content={"detail": "Login obrigatorio"}) | |
| request.state.auth_user = user | |
| request.state.auth_token = token | |
| return await call_next(request) | |
| app.include_router(health.router) | |
| app.include_router(auth.router) | |
| app.include_router(session.router) | |
| app.include_router(elaboracao.router) | |
| app.include_router(visualizacao.router) | |
| app.include_router(pesquisa.router) | |
| app.include_router(repositorio.router) | |
| app.include_router(logs.router) | |
| def _mount_frontend_if_exists() -> None: | |
| frontend_dist = Path(__file__).resolve().parents[2] / "frontend" / "dist" | |
| index_file = frontend_dist / "index.html" | |
| if not index_file.exists(): | |
| return | |
| # Serve the entire Vite build output so root-level files from public/ | |
| # (e.g. /logo_mesa.png) and hashed /assets files are both available. | |
| app.mount("/", StaticFiles(directory=frontend_dist, html=True), name="frontend") | |
| _mount_frontend_if_exists() | |