Skip to content

Resume Routes

route

Resume upload and management API routes.

This module provides protected API endpoints for uploading resumes, listing user resumes, and deleting resumes. All routes require authentication and appropriate OAuth scopes.

Classes

Functions

create_resume async
create_resume(
    request, file=File(...), db=Depends(get_session)
)

Upload and process a resume file.

Accepts a resume file (PDF supported), extracts text, runs it through the extraction agent to get structured data, and stores both the file and metadata.

Parameters:

Name Type Description Default
request Request

FastAPI request object (contains auth_info in state).

required
file UploadFile

Uploaded resume file (must be PDF).

File(...)
db AsyncSession

Database session dependency.

Depends(get_session)

Returns:

Type Description
dict[str, Any]

Dictionary containing extracted resume data (ExtractionAgentResponse).

Raises:

Type Description
HTTPException

400 if file type is unsupported or processing fails.

Source code in bitonicai/routes/vb1/protected/resume/route.py
@resume_router.post("/upload")
@require_scopes(["upload:resume"])
async def create_resume(
    request: Request, file: UploadFile = File(...), db: AsyncSession = Depends(get_session)
) -> dict[str, Any]:
    """Upload and process a resume file.

    Accepts a resume file (PDF supported), extracts text, runs it through
    the extraction agent to get structured data, and stores both the file
    and metadata.

    Args:
        request: FastAPI request object (contains auth_info in state).
        file: Uploaded resume file (must be PDF).
        db: Database session dependency.

    Returns:
        Dictionary containing extracted resume data (ExtractionAgentResponse).

    Raises:
        HTTPException: 400 if file type is unsupported or processing fails.
    """
    type = file.content_type
    file_bytes = await file.read()
    await file.seek(0)
    if type not in supported_file_types:
        raise HTTPException(status_code=400, detail="Unsupported file type")
    resume_service = ResumeService(db)
    await resume_service.upload_resume(request.state.auth_info.sub, file_bytes, file.filename)
    return {"message": "Resume uploaded successfully"}
list_resumes async
list_resumes(
    request,
    page=Query(default=1, ge=1),
    page_size=Query(default=10, ge=1),
    db=Depends(get_session),
)

List all resumes for the authenticated user.

Parameters:

Name Type Description Default
request Request

FastAPI request object (contains auth_info in state).

required
db AsyncSession

Database session dependency.

Depends(get_session)

Returns:

Type Description
ResumeListResponse

Dictionary with "resumes" key containing list of file paths.

Source code in bitonicai/routes/vb1/protected/resume/route.py
@resume_router.get("/list", response_model=ResumeListResponse)
@require_scopes(["read:resume"])
async def list_resumes(
    request: Request,
    page: int = Query(default=1, ge=1),
    page_size: int = Query(default=10, ge=1),
    db: AsyncSession = Depends(get_session),
) -> ResumeListResponse:
    """List all resumes for the authenticated user.

    Args:
        request: FastAPI request object (contains auth_info in state).
        db: Database session dependency.

    Returns:
        Dictionary with "resumes" key containing list of file paths.
    """
    resume_service = ResumeService(db)
    return await resume_service.list_resumes(request.state.auth_info.sub, page, page_size)
get_resume async
get_resume(request, resume_id, db=Depends(get_session))

Get a resume for the authenticated user.

Source code in bitonicai/routes/vb1/protected/resume/route.py
@resume_router.get("/{resume_id}", response_model=ResumeResponse)
@require_scopes(["read:resume"])
async def get_resume(
    request: Request, resume_id: uuid.UUID, db: AsyncSession = Depends(get_session)
) -> ResumeResponse:
    """Get a resume for the authenticated user."""
    resume_service = ResumeService(db)
    resume = await resume_service.get_resume(request.state.auth_info.sub, resume_id)
    return resume
delete_all_resumes async
delete_all_resumes(request, db=Depends(get_session))

Delete all resumes for the authenticated user.

Removes both database records and files from S3 storage.

Parameters:

Name Type Description Default
request Request

FastAPI request object (contains auth_info in state).

required
db AsyncSession

Database session dependency.

Depends(get_session)

Returns:

Type Description
dict[str, str]

Dictionary with success message.

Source code in bitonicai/routes/vb1/protected/resume/route.py
@resume_router.delete("/all")
@require_scopes(["delete:resume"])
async def delete_all_resumes(
    request: Request, db: AsyncSession = Depends(get_session)
) -> dict[str, str]:
    """Delete all resumes for the authenticated user.

    Removes both database records and files from S3 storage.

    Args:
        request: FastAPI request object (contains auth_info in state).
        db: Database session dependency.

    Returns:
        Dictionary with success message.
    """
    resume_service = ResumeService(db)
    await resume_service.delete_all_resumes(request.state.auth_info.sub)
    return {"message": "All resumes deleted successfully"}
delete_resume async
delete_resume(request, resume_id, db=Depends(get_session))

Delete a resume for the authenticated user.

Source code in bitonicai/routes/vb1/protected/resume/route.py
@resume_router.delete("/{resume_id}")
@require_scopes(["delete:resume"])
async def delete_resume(
    request: Request, resume_id: uuid.UUID, db: AsyncSession = Depends(get_session)
) -> dict[str, str]:
    """Delete a resume for the authenticated user."""
    resume_service = ResumeService(db)
    await resume_service.delete_resume(request.state.auth_info.sub, resume_id)
    return {"message": "Resume deleted successfully"}