Spaces:
Sleeping
Sleeping
Update main.py
Browse files
main.py
CHANGED
|
@@ -10,6 +10,7 @@ from fastapi.middleware.cors import CORSMiddleware
|
|
| 10 |
from utils import read_file, fetch_job_description, optimize_resume_api
|
| 11 |
import logging
|
| 12 |
import os
|
|
|
|
| 13 |
API_SECRET = os.getenv("API_SECRET")
|
| 14 |
|
| 15 |
# Set up logging
|
|
@@ -22,10 +23,6 @@ app.add_middleware(CORSMiddleware, allow_origins=["*"], allow_credentials=True,
|
|
| 22 |
|
| 23 |
security = HTTPBearer()
|
| 24 |
|
| 25 |
-
class OptimizationResponse(BaseModel):
|
| 26 |
-
optimizedResume: str
|
| 27 |
-
metadata: dict
|
| 28 |
-
|
| 29 |
class ErrorResponse(BaseModel):
|
| 30 |
detail: str
|
| 31 |
|
|
@@ -35,6 +32,13 @@ def verify_token(credentials: HTTPAuthorizationCredentials = Depends(security)):
|
|
| 35 |
raise HTTPException(status_code=401, detail="Invalid authentication token")
|
| 36 |
return token
|
| 37 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 38 |
@app.post("/api/v1/optimize-resume", response_model=OptimizationResponse, responses={400: {"model": ErrorResponse}, 401: {"model": ErrorResponse}, 500: {"model": ErrorResponse}})
|
| 39 |
async def optimize_resume(
|
| 40 |
resume: Optional[UploadFile] = File(None),
|
|
@@ -63,16 +67,22 @@ async def optimize_resume(
|
|
| 63 |
job_description_content = fetch_job_description(jobDescriptionUrl)
|
| 64 |
|
| 65 |
# Perform optimization
|
| 66 |
-
|
| 67 |
-
|
| 68 |
-
|
| 69 |
-
|
| 70 |
-
|
| 71 |
-
|
| 72 |
-
|
| 73 |
-
|
| 74 |
-
metadata
|
| 75 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 76 |
except ValueError as ve:
|
| 77 |
logger.error(f"ValueError occurred: {str(ve)}", exc_info=True)
|
| 78 |
raise HTTPException(status_code=400, detail=str(ve))
|
|
|
|
| 10 |
from utils import read_file, fetch_job_description, optimize_resume_api
|
| 11 |
import logging
|
| 12 |
import os
|
| 13 |
+
from fastapi.responses import JSONResponse
|
| 14 |
API_SECRET = os.getenv("API_SECRET")
|
| 15 |
|
| 16 |
# Set up logging
|
|
|
|
| 23 |
|
| 24 |
security = HTTPBearer()
|
| 25 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 26 |
class ErrorResponse(BaseModel):
|
| 27 |
detail: str
|
| 28 |
|
|
|
|
| 32 |
raise HTTPException(status_code=401, detail="Invalid authentication token")
|
| 33 |
return token
|
| 34 |
|
| 35 |
+
import re
|
| 36 |
+
|
| 37 |
+
def extract_xml_content(text, tag):
|
| 38 |
+
pattern = f"<{tag}>(.*?)</{tag}>"
|
| 39 |
+
matches = re.findall(pattern, text, re.DOTALL)
|
| 40 |
+
return matches
|
| 41 |
+
|
| 42 |
@app.post("/api/v1/optimize-resume", response_model=OptimizationResponse, responses={400: {"model": ErrorResponse}, 401: {"model": ErrorResponse}, 500: {"model": ErrorResponse}})
|
| 43 |
async def optimize_resume(
|
| 44 |
resume: Optional[UploadFile] = File(None),
|
|
|
|
| 67 |
job_description_content = fetch_job_description(jobDescriptionUrl)
|
| 68 |
|
| 69 |
# Perform optimization
|
| 70 |
+
output = optimize_resume_api(resume_content, job_description_content)
|
| 71 |
+
optimized_resume = extract_xml_content(output, "optimized_resume")
|
| 72 |
+
changes_made = extract_xml_content(output, "changes_made")
|
| 73 |
+
|
| 74 |
+
# Prepare the response
|
| 75 |
+
response_data = {
|
| 76 |
+
"optimizedResume": optimized_resume[0] if optimized_resume else "",
|
| 77 |
+
"changesMade": changes_made[0] if changes_made else "",
|
| 78 |
+
"metadata": {
|
| 79 |
+
"original_resume": resume_content,
|
| 80 |
+
"original_jd": job_description_content
|
| 81 |
+
}
|
| 82 |
+
}
|
| 83 |
+
|
| 84 |
+
return JSONResponse(content=response_data)
|
| 85 |
+
|
| 86 |
except ValueError as ve:
|
| 87 |
logger.error(f"ValueError occurred: {str(ve)}", exc_info=True)
|
| 88 |
raise HTTPException(status_code=400, detail=str(ve))
|