Hire-ai/backend/app/routers/questions.py
2026-10-08 02:50:35 +05:30

84 lines
3 KiB
Python

from fastapi import APIRouter, Depends, HTTPException, status
from bson import ObjectId
from datetime import datetime, timezone
from typing import List
from app.database import get_db
from app.dependencies import get_current_user
from app.models.question import QuestionSetIn, QuestionSetOut, QuestionItem
from app.services.gemini_service import generate_interview_questions
router = APIRouter(prefix="/api/questions", tags=["questions"])
@router.post("/generate", response_model=QuestionSetOut, status_code=status.HTTP_201_CREATED)
async def generate_questions(
req: QuestionSetIn,
db=Depends(get_db),
current_user: dict = Depends(get_current_user),
):
try:
resume_oid = ObjectId(req.resume_id)
req_oid = ObjectId(req.requirement_id)
except:
raise HTTPException(status_code=400, detail="Invalid ID format")
# Fetch resume
resume = await db["resumes"].find_one({"_id": resume_oid, "uploaded_by": current_user["google_id"]})
if not resume:
raise HTTPException(status_code=404, detail="Resume not found")
# Fetch requirements
requirement = await db["requirements"].find_one({"_id": req_oid, "user_id": current_user["google_id"]})
if not requirement:
raise HTTPException(status_code=404, detail="Requirement not found")
# Generate questions via Gemini
try:
# Pass resume text and requirements to Gemini
generated_data = await generate_interview_questions(
resume_text=resume.get("parsed", {}).get("raw_text", ""),
role_name=requirement.get("role_name", ""),
skills=requirement.get("mandatory_skills", []) + requirement.get("nice_to_have_skills", []),
experience=requirement.get("experience_years", 0),
projects=resume.get("parsed", {}).get("projects", [])
)
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
# Save to MongoDB
now = datetime.now(timezone.utc)
doc = {
"user_id": current_user["google_id"],
"resume_id": req.resume_id,
"requirement_id": req.requirement_id,
"questions": generated_data,
"created_at": now
}
# Upsert logic to overwrite if same pair exists
result = await db["questions"].find_one_and_update(
{
"user_id": current_user["google_id"],
"resume_id": req.resume_id,
"requirement_id": req.requirement_id
},
{"$set": doc},
upsert=True,
return_document=True
)
result["id"] = str(result.pop("_id"))
return result
@router.get("/{resume_id}", response_model=List[QuestionSetOut])
async def get_questions_for_resume(
resume_id: str,
db=Depends(get_db),
current_user: dict = Depends(get_current_user),
):
cursor = db["questions"].find({"user_id": current_user["google_id"], "resume_id": resume_id}).sort("created_at", -1)
results = []
async for doc in cursor:
doc["id"] = str(doc.pop("_id"))
results.append(doc)
return results