HR-ATS-Portal/backend/main.py

66 lines
2.2 KiB
Python

import logging
from contextlib import asynccontextmanager
import fastapi
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
from fastapi import FastAPI,APIRouter
from db_setup import lifespan as db_lifespan
from inbox.app import router as inbox_router
from users.app import router as users_router
from role.app import router as role_router
from forget_password.app import router as forget_password_router
from job.app import router as candidate_router
from notifications.app import router as confirmation_router
# Without this the db/migration logs have no handler and are swallowed under uvicorn.
logging.basicConfig(level=logging.INFO, format="%(levelname)-8s %(name)s: %(message)s")
logger = logging.getLogger("main")
@asynccontextmanager
async def lifespan(app):
"""Compose DB lifespan with optional LLM/agent warm-up (degrades on failure)."""
async with db_lifespan(app):
llm_ready = False
agent_ready = False
close_llm = None
close_agent = None
try:
from llm_setup import init_llm, close_llm as _close_llm
from agent.agent_setup import init_agent, close_agent as _close_agent
close_llm = _close_llm
close_agent = _close_agent
await init_llm()
llm_ready = True
await init_agent()
agent_ready = True
except Exception as exc:
logger.warning("llm/agent startup skipped: %s", exc)
try:
yield
finally:
if agent_ready and close_agent is not None:
await close_agent()
if llm_ready and close_llm is not None:
await close_llm()
# lifespan connects to Postgres and brings migrations up to head on startup,
# and disposes of the connection pool on shutdown.
app = FastAPI(lifespan=lifespan)
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
app.include_router(inbox_router)
app.include_router(users_router)
app.include_router(role_router)
app.include_router(forget_password_router)
app.include_router(confirmation_router)
app.include_router(candidate_router)