84 lines
3 KiB
Python
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
|