Spaces:
Sleeping
Sleeping
File size: 2,005 Bytes
fe099da 76fd934 fe099da | 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 57 58 59 60 61 62 63 64 | from fastapi import FastAPI, UploadFile, File, Form
from fastapi.responses import Response
from fastapi.middleware.cors import CORSMiddleware
from parser import extract_text_from_pdf
from ai import extract_jd_keywords, rewrite_resume_bullets, generate_cover_letter
from exporter import create_docx
from supabase import create_client
import os
from dotenv import load_dotenv
load_dotenv(dotenv_path=os.path.join(os.path.dirname(os.path.abspath(__file__)), ".env"))
SUPABASE_URL = os.getenv("SUPABASE_URL")
SUPABASE_KEY = os.getenv("SUPABASE_SERVICE_KEY")
GROQ_API_KEY = os.getenv("GROQ_API_KEY")
app = FastAPI()
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_methods=["*"],
allow_headers=["*"],
)
sb = create_client(SUPABASE_URL, SUPABASE_KEY)
@app.get("/")
def root():
return {"status": "Job Copilot API is running"}
@app.post("/tailor")
async def tailor(
jd_text: str = Form(...),
tone: str = Form(...),
candidate_name: str = Form(...),
user_id: str = Form(None),
resume_file: UploadFile = File(...)
):
resume_bytes = await resume_file.read()
resume_text = extract_text_from_pdf(resume_bytes)
jd_keywords = extract_jd_keywords(jd_text)
bullets = rewrite_resume_bullets(resume_text, jd_keywords)
cover_letter = generate_cover_letter(resume_text, jd_text, tone)
if user_id:
try:
sb.table("applications").insert({
"user_id": user_id,
"candidate_name": candidate_name,
"job_description": jd_text[:500],
"tone": tone
}).execute()
except Exception as e:
print(f"Supabase insert error: {e}")
docx_bytes = create_docx(bullets, cover_letter, candidate_name)
return Response(
content=docx_bytes,
media_type="application/vnd.openxmlformats-officedocument.wordprocessingml.document",
headers={"Content-Disposition": f"attachment; filename=tailored_{candidate_name}.docx"}
) |