-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
130 lines (112 loc) · 4.1 KB
/
Copy pathmain.py
File metadata and controls
130 lines (112 loc) · 4.1 KB
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
from core.config import settings
from fastapi import FastAPI
from fastapi.responses import JSONResponse
from sqlalchemy import text
from core.database import engine, Base
from fastapi.middleware.cors import CORSMiddleware
try:
from starlette.middleware.sessions import SessionMiddleware
except ImportError: # pragma: no cover - fallback for test env without starlette extras installed
class SessionMiddleware: # type: ignore
def __init__(self, app, **kwargs):
self.app = app
def __call__(self, scope, receive, send):
return self.app(scope, receive, send)
from api import auth, websockets
from api import profiles
from api import roles
from api import questions
from api import sessions
from api import group_interview_sessions
from api import technologies
from api import ollama
from api import azure_openai
from api import azure_speech
from api import elevenlabs
from api import matching
from api.evaluations import router as evaluations_router
from api.metrics import router as metrics_router
from api.recommendations import router as recommendations_router
from api.interviews import router as interviews_router
from api.badges import router as badges_router
from api.improvement_plan import router as improvement_plan_router
from middleware.auth_middleware import AuthMiddleware
from core.limiter import auth_rate_limiter, rate_limit_exceeded_handler
from slowapi.errors import RateLimitExceeded
if settings.AUTO_CREATE_TABLES:
try:
Base.metadata.create_all(bind=engine)
except Exception as e:
print(f"Could not create tables: {e}")
app = FastAPI()
app.state.limiter = auth_rate_limiter
app.add_exception_handler(RateLimitExceeded, rate_limit_exceeded_handler)
app.add_middleware(
CORSMiddleware,
allow_origins=[settings.LOCAL_HOST_FRONT, settings.LOCAL_IP, settings.FRONTEND_URL],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
app.add_middleware(
SessionMiddleware,
secret_key=settings.secret_key,
)
# Middleware de autenticación JWT (excluye rutas públicas)
app.add_middleware(
AuthMiddleware,
excluded_paths=[
"/auth/microsoft",
"/auth/microsoft/callback",
"/auth/microsoft/exchange",
"/auth/refresh",
"/auth/google",
"/auth/google/exchange",
"/docs",
"/openapi.json",
"/health",
"/api/ai/ollama/health",
"/api/ai/ollama/ask",
"/api/ai/azure-openai/health",
"/api/ai/azure-openai/ask",
"/api/ws",
],
)
app.include_router(auth.router)
app.include_router(profiles.router)
app.include_router(profiles.router, prefix="/api")
app.include_router(profiles.profile_alias_router, prefix="/api")
app.include_router(roles.router, prefix="/api")
app.include_router(questions.router, prefix="/api")
app.include_router(sessions.router, prefix="/api")
app.include_router(group_interview_sessions.router, prefix="/api")
app.include_router(technologies.router, prefix="/api")
app.include_router(matching.router, prefix="/api")
app.include_router(ollama.router, prefix="/api")
app.include_router(azure_openai.router, prefix="/api")
app.include_router(evaluations_router)
app.include_router(metrics_router, prefix="/api")
app.include_router(recommendations_router, prefix="/api")
app.include_router(interviews_router, prefix="/api")
app.include_router(azure_speech.router, prefix="/api")
app.include_router(elevenlabs.router, prefix="/api")
app.include_router(websockets.router, prefix="/api")
app.include_router(badges_router, prefix="/api")
app.include_router(improvement_plan_router, prefix="/api")
@app.get("/health/live", tags=["health"])
def live_check():
return {"status": "ok"}
@app.get("/health/ready", tags=["health"])
def ready_check():
try:
with engine.connect() as connection:
connection.execute(text("SELECT 1"))
except Exception:
return JSONResponse(
status_code=503,
content={"status": "degraded", "database": "unavailable"},
)
return {"status": "ready", "database": "ok"}
@app.get("/health", tags=["health"])
def health_check():
return live_check()