diff --git a/app/Http/Controllers/Api/V1/Me/MyLiveTrucksController.php b/app/Http/Controllers/Api/V1/Me/MyLiveTrucksController.php new file mode 100644 index 0000000..2b04335 --- /dev/null +++ b/app/Http/Controllers/Api/V1/Me/MyLiveTrucksController.php @@ -0,0 +1,58 @@ +where('head_user_id', $request->user()->id) + ->first(); + + if (! $household || ! $household->assigned_drop_off_point_id) { + return $this->ok([ + 'trucks' => [], + 'as_of' => now()->toIso8601String(), + 'household_assigned' => false, + ]); + } + + $relevantTripUuids = Trip::query() + ->whereIn('status', [Trip::STATUS_IN_PROGRESS, Trip::STATUS_AT_DUMPSITE]) + ->whereHas('stops', fn ($q) => $q->where('drop_off_point_id', $household->assigned_drop_off_point_id)) + ->pluck('uuid') + ->all(); + + $positions = collect($this->tracker->activeTruckPositions()) + ->filter(fn ($p) => $p['active_trip_id'] && in_array($p['active_trip_id'], $relevantTripUuids, true)) + ->values() + ->all(); + + return $this->ok([ + 'trucks' => $positions, + 'as_of' => now()->toIso8601String(), + 'household_assigned' => true, + 'drop_off_point' => [ + 'id' => $household->assignedDropOffPoint?->uuid, + 'name' => $household->assignedDropOffPoint?->name, + 'lat' => $household->assignedDropOffPoint?->coordinates?->latitude, + 'lng' => $household->assignedDropOffPoint?->coordinates?->longitude, + ], + ]); + } +} diff --git a/routes/api.php b/routes/api.php index 9813476..ac2b088 100644 --- a/routes/api.php +++ b/routes/api.php @@ -42,6 +42,7 @@ use App\Http\Controllers\Api\V1\HealthController; use App\Http\Controllers\Api\V1\Household\HouseholdController; use App\Http\Controllers\Api\V1\Me\MyCollectionsController; use App\Http\Controllers\Api\V1\Me\MyHouseholdController; +use App\Http\Controllers\Api\V1\Me\MyLiveTrucksController; use App\Http\Controllers\Api\V1\Me\MyNotificationsController; use App\Http\Controllers\Api\V1\Me\UpcomingPickupsController; use App\Http\Controllers\Api\V1\Qr\MyQrCodeController; @@ -105,6 +106,8 @@ Route::middleware('auth:sanctum')->prefix('me')->name('api.v1.me.')->group(funct Route::get('/notifications/unread-count', [MyNotificationsController::class, 'unreadCount'])->name('notifications.unread-count'); Route::post('/notifications/mark-all-read', [MyNotificationsController::class, 'markAllRead'])->name('notifications.mark-all-read'); Route::post('/notifications/{id}/read', [MyNotificationsController::class, 'markRead'])->name('notifications.mark-read'); + + Route::get('/live/trucks', [MyLiveTrucksController::class, 'trucks'])->name('live.trucks'); }); // Public partner stores (for residents browsing where to buy codes)