Spaces:
Sleeping
Sleeping
| from fastapi import APIRouter, HTTPException, Depends, UploadFile, File, Form | |
| from sqlalchemy.orm import Session | |
| from pydantic import BaseModel | |
| from typing import List, Optional | |
| from app.db.session import SessionLocal | |
| from app.models.resume import Resume | |
| from app.services.llm_service import LLMService | |
| from app.services.jd_parser import JDParser | |
| router = APIRouter() | |
| # llm_service instantiated inside route | |
| # Dependency | |
| def get_db(): | |
| db = SessionLocal() | |
| try: | |
| yield db | |
| finally: | |
| db.close() | |
| class InterviewPrepResponse(BaseModel): | |
| questions: List[str] | |
| company_overview: str | |
| role_expectations: str | |
| interview_focus: str | |
| disclaimer: str | |
| async def generate_questions( | |
| resume_id: str = Form(...), | |
| jd_text: Optional[str] = Form(None), | |
| jd_url: Optional[str] = Form(None), | |
| jd_file: Optional[UploadFile] = File(None), | |
| db: Session = Depends(get_db) | |
| ): | |
| # 1. Fetch Resume (validation) | |
| if resume_id: | |
| resume = db.query(Resume).filter(Resume.resume_id == resume_id).first() | |
| if not resume: | |
| raise HTTPException(status_code=404, detail="Resume not found") | |
| try: | |
| # Extract JD text | |
| job_description = "" | |
| if jd_text and jd_text.strip(): | |
| job_description = JDParser.extract_from_text(jd_text) | |
| elif jd_url and jd_url.strip(): | |
| job_description = JDParser.extract_from_url(jd_url) | |
| elif jd_file: | |
| content = await jd_file.read() | |
| if jd_file.filename.lower().endswith('.pdf'): | |
| job_description = JDParser.extract_from_pdf(content) | |
| elif jd_file.filename.lower().endswith(('.png', '.jpg', '.jpeg')): | |
| job_description = JDParser.extract_from_image(content) | |
| else: | |
| raise HTTPException(status_code=400, detail="Unsupported file type") | |
| else: | |
| raise HTTPException(status_code=400, detail="No job description provided (text, url, or file required)") | |
| if not job_description or not job_description.strip(): | |
| raise HTTPException(status_code=400, detail="Could not extract text from the provided job description input") | |
| llm_service = LLMService() | |
| result = llm_service.generate_interview_questions(job_description) | |
| return result | |
| except HTTPException as he: | |
| raise he | |
| except Exception as e: | |
| print(f"Interview Prep Error: {e}") | |
| raise HTTPException(status_code=500, detail="Failed to generate interview questions") | |