DocHub
Fixed all driver endpoint bugs — firestore_id mapping, restaurant lookups, pickup validation, proof of delivery uploads

Driver Delivery Flow Fixes

Date: March 2, 2026

During end-to-end testing of the driver delivery flow on staging (ricoya.ipnoelp.com), every step after claiming an order failed. Five separate bugs were identified and fixed.

1. Claim Order — firestore_id Undefined

Symptom: /api/driver/orders/undefined/claim (400 error)

Root Cause: The driver order list endpoints returned raw Supabase rows without a firestore_id field. The client-side code (driverOrdersApi.ts) builds URLs using order.firestore_id, which was undefined.

Fix: Added firestore_id: String(row.id) mapping in both:

  • src/app/api/driver/orders/route.ts (assigned orders)
  • src/app/api/driver/orders/available/route.ts (available orders)

2. Restaurant Load — 500 Error

Symptom: After claiming an order, the restaurant details failed to load with a 500 error.

Root Cause: src/app/api/driver/restaurants/route.ts referenced legacy_numeric_id column, which does not exist on the restaurants table.

Fix: Changed the filter to use id instead of legacy_numeric_id.

3. Restaurant Single Lookup — 404

Symptom: Restaurant detail page returned 404 for some restaurants.

Root Cause: src/app/api/driver/restaurants/[restaurantId]/route.ts only tried numeric id lookup. Some restaurant references use the legacy_firestore_id string.

Fix: Added fallback — try numeric id first, then legacy_firestore_id if not found.

4. Pickup — 400 Error

Symptom: /api/driver/orders/[orderId]/pickup returned 400.

Root Cause: The pickup endpoint tried to write pickup_verified_by_user_id to the orders table. This column does not exist (only pickup_verified_by_uid and pickup_verified_by_email exist).

Fix: Removed the pickup_verified_by_user_id assignment from the update payload in src/app/api/driver/orders/[orderId]/pickup/route.ts.

5. Proof of Delivery Upload — 500 Error

Symptom: File upload during proof of delivery capture failed.

Root Cause: Two issues:

  1. The file_uploads insert included a storage_type column that does not exist in the database.
  2. Client-side Supabase insert failed on Safari due to connection issues.

Fix:

  • Removed storage_type from FileUpload interface in src/data/models.ts
  • Moved the file_uploads database insert from client-side (fileUploadsRepo.ts) to the server-side /api/uploads endpoint using supabaseAdmin
  • Added recordUpload form field flag to trigger the server-side insert

Files Changed

File Change
src/app/api/driver/orders/route.ts Added firestore_id mapping
src/app/api/driver/orders/available/route.ts Added firestore_id mapping
src/app/api/driver/restaurants/route.ts Fixed legacy_numeric_id → id
src/app/api/driver/restaurants/[restaurantId]/route.ts Added legacy_firestore_id fallback
src/app/api/driver/orders/[orderId]/pickup/route.ts Removed pickup_verified_by_user_id
src/app/api/uploads/route.ts Added server-side file_uploads insert
src/repositories/fileUploadsRepo.ts Rewrote to use server endpoint
src/data/models.ts Removed storage_type from FileUpload

Audit

All driver endpoints were audited after fixes. The claim, pickup, resign, and proof routes all use .eq("id", orderId) with string coercion — confirmed safe for Supabase’s integer-to-string comparison.