62 lines
2.3 KiB
PHP
62 lines
2.3 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Api\V1\Me;
|
|
|
|
use App\Http\Controllers\Api\V1\ApiController;
|
|
use App\Models\Household;
|
|
use App\Models\Trip;
|
|
use App\Services\LiveTracking\TruckTracker;
|
|
use Illuminate\Http\JsonResponse;
|
|
use Illuminate\Http\Request;
|
|
|
|
class MyLiveTrucksController extends ApiController
|
|
{
|
|
public function __construct(private readonly TruckTracker $tracker) {}
|
|
|
|
/**
|
|
* Live truck positions filtered to trucks whose currently-running
|
|
* trip serves the resident's assigned drop-off point. Same shape as
|
|
* the admin endpoint so the frontend can share marker rendering.
|
|
*/
|
|
public function trucks(Request $request): JsonResponse
|
|
{
|
|
$userId = $request->user()->id;
|
|
$household = \Illuminate\Support\Facades\Cache::remember("user:{$userId}:household", now()->addMinutes(10), function () use ($userId) {
|
|
return Household::with('assignedDropOffPoint')
|
|
->where('head_user_id', $userId)
|
|
->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,
|
|
],
|
|
]);
|
|
}
|
|
}
|