File size: 2,889 Bytes
d2b7a80 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | # routes.py
from fastapi import APIRouter, UploadFile, File, Form, HTTPException
from typing import Optional
from schemas import ScoreResponse, ScoreRequest
from services.scorer import resume_score
from utilities.pdf_parser import extract_text_from_pdf
from utilities.keyword_match import clean_text
router = APIRouter(prefix="/predict", tags=["Prediction"])
# ββ JSON route (both inputs are plain text) ββββββββββββββββββββββββββββββββ
@router.post("/ats", response_model=ScoreResponse)
async def predict_ats_json(payload: ScoreRequest):
resume_clean = clean_text(payload.resume_text)
jd_clean = clean_text(payload.job_description)
return resume_score(resume_clean, jd_clean)
# ββ Multipart route (one or both inputs are PDFs) βββββββββββββββββββββββββ
@router.post("/ats/upload", response_model=ScoreResponse)
async def predict_ats_upload(
resume_pdf: Optional[UploadFile] = File(None, description="Resume PDF (optional)"),
jd_pdf: Optional[UploadFile] = File(None, description="JD PDF (optional)"),
resume_text: Optional[str] = Form(None, description="Resume plain text (optional)"),
job_description: Optional[str] = Form(None, description="JD plain text (optional)"),
):
# ββ Resolve resume text ββββββββββββββββββββββββββββββββββββββββββββββ
if resume_pdf and resume_pdf.filename:
if resume_pdf.content_type != "application/pdf":
raise HTTPException(status_code=400, detail="resume_pdf must be a PDF file.")
try:
resume_raw = extract_text_from_pdf(await resume_pdf.read())
except ValueError as e:
raise HTTPException(status_code=422, detail=str(e))
elif resume_text:
resume_raw = resume_text
else:
raise HTTPException(status_code=422, detail="Provide either resume_pdf or resume_text.")
# ββ Resolve JD text ββββββββββββββββββββββββββββββββββββββββββββββββββ
if jd_pdf and jd_pdf.filename:
if jd_pdf.content_type != "application/pdf":
raise HTTPException(status_code=400, detail="jd_pdf must be a PDF file.")
try:
jd_raw = extract_text_from_pdf(await jd_pdf.read())
except ValueError as e:
raise HTTPException(status_code=422, detail=str(e))
elif job_description:
jd_raw = job_description
else:
raise HTTPException(status_code=422, detail="Provide either jd_pdf or job_description.")
resume_clean = clean_text(resume_raw)
jd_clean = clean_text(jd_raw)
return resume_score(resume_clean, jd_clean) |