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=["*"], ) @app.middleware("http") 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()