srbhr/Resume-Matcher · error · HTTPException

Failed to delete application. Please try again.

Error message

Failed to delete application. Please try again.

What it means

This 500 HTTPException is raised by the delete_application route when the underlying db.delete_application() call throws any exception. It is a generic wrapper that hides the database error from the client while logging the real cause server-side. It means the delete operation failed at the persistence layer, not that the application was missing (that is the 404 path).

Solutions

  1. Check backend logs for the 'Failed to delete application %s' line to see the underlying exception
  2. Verify the database (MongoDB) is reachable and credentials are valid
  3. Retry the delete; transient DB issues resolve after reconnection
  4. Fix the root-cause exception in the db layer's delete_application once identified

Example fix

// before
deleted = await db.delete_application(application_id)
// after
try:
    deleted = await db.delete_application(application_id)
except Exception as e:
    logger.error("Failed to delete application %s: %s", application_id, e)
    raise HTTPException(status_code=500, detail="Failed to delete application. Please try again.")
Defensive patterns

Strategy: try-catch

Validate before calling

const exists = await api.getApplication(id).then(() => true).catch(() => false)
if (!exists) console.warn(`application ${id} missing; skipping delete`)

Try / catch

try {
  await api.deleteApplication(id)
} catch (e) {
  if (e.response?.status === 404) return // already gone
  if (e.response?.status === 500) {
    logger.error('delete failed server-side', e)
    showToast('Delete failed, please retry')
  }
}

Prevention

When it happens

Trigger: DELETE /applications/{id} where db.delete_application raises: MongoDB connection failure/timeout, collection unavailable, serialization error in the motor/pymongo driver, or any other unhandled exception inside the db layer.

Common situations: Database is down or restarting, connection pool exhausted, network partition between backend and DB, DB credentials rotated, or a bug in db.delete_application raising on unexpected document shape.

Related errors


AI-assisted analysis of srbhr/Resume-Matcher@116f9cc3b0 (2026-08-28). Data as JSON: /api/errors/cfff289ac6c02c68. Report an issue: GitHub.

Appendix: source

Thrown at apps/backend/app/routers/applications.py:159

        updates["status"] = request.status.value
    try:
        updated = await db.update_application(application_id, updates)
    except Exception as e:
        logger.error("Failed to update application %s: %s", application_id, e)
        raise HTTPException(status_code=500, detail="Failed to update application. Please try again.")
    if updated is None:
        raise HTTPException(status_code=404, detail="Application not found")
    return ApplicationResponse(**updated)


@router.delete("/{application_id}", response_model=ApplicationActionResponse)
async def delete_application(application_id: str) -> ApplicationActionResponse:
    """Delete a card."""
    try:
        deleted = await db.delete_application(application_id)
    except Exception as e:
        logger.error("Failed to delete application %s: %s", application_id, e)
        raise HTTPException(status_code=500, detail="Failed to delete application. Please try again.")
    if not deleted:
        raise HTTPException(status_code=404, detail="Application not found")
    return ApplicationActionResponse(message="Application deleted", affected=1)


@router.post("/bulk-delete", response_model=ApplicationActionResponse)
async def bulk_delete_applications(request: BulkDelete) -> ApplicationActionResponse:
    """Delete many cards."""
    try:
        deleted = await db.bulk_delete_applications(request.application_ids)
    except Exception as e:
        logger.error("Failed to bulk-delete applications: %s", e)
        raise HTTPException(status_code=500, detail="Failed to delete applications. Please try again.")
    return ApplicationActionResponse(message=f"Deleted {deleted} application(s)", affected=deleted)


async def _extract_company_role(job_description: str) -> dict[str, str | None]:
    """Best-effort company/role extraction for the manual-add path.

View on GitHub (pinned to 116f9cc3b0)