first commit
This commit is contained in:
commit
7a72438fd1
74 changed files with 7548 additions and 0 deletions
84
backend/app/routers/questions.py
Normal file
84
backend/app/routers/questions.py
Normal file
|
|
@ -0,0 +1,84 @@
|
|||
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
|
||||
Loading…
Add table
Add a link
Reference in a new issue