Files
Verde-Web/app/Http/Controllers/Api/V1/Me/MyLiveTrucksController.php
2026-07-02 13:02:29 +08:00

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,
],
]);
}
}