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