File size: 2,221 Bytes
d6c9678
 
 
 
 
 
385f196
d6c9678
 
1426bed
6127e00
385f196
d6c9678
 
 
 
 
 
 
 
 
 
 
 
 
 
 
385f196
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d6c9678
385f196
d6c9678
 
 
82ec900
385f196
1426bed
385f196
d6c9678
 
 
edfdca7
d6c9678
 
 
 
5bccf4a
 
 
d6c9678
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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, trabalhos_tecnicos, visualizacao
from app.runtime_paths import resolve_frontend_dist_dir
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(trabalhos_tecnicos.router)
app.include_router(logs.router)


def _mount_frontend_if_exists() -> None:
    frontend_dist = resolve_frontend_dist_dir()
    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()