Skip to content

Instantly share code, notes, and snippets.

@amberlex78
Created June 8, 2026 12:09
Show Gist options
  • Select an option

  • Save amberlex78/ac81904ee026cd3f9b93a883393705b0 to your computer and use it in GitHub Desktop.

Select an option

Save amberlex78/ac81904ee026cd3f9b93a883393705b0 to your computer and use it in GitHub Desktop.
<?php
public function sessionDetails(Request $request, DeviceRunSession $session): JsonResponse
{
$validated = $request->validate([
'device_id' => 'required|integer|exists:hkl_devices,id',
]);
if ($session->device_id !== (int) $validated['device_id']) {
abort(404);
}
$device = Device::query()
->with(['relays' => fn ($query) => $query->orderBy('relay_number')])
->findOrFail($validated['device_id']);
$startedAt = CarbonImmutable::parse($session->started_at);
$isActive = $session->ended_at === null;
$endedAt = $session->ended_at
? CarbonImmutable::parse($session->ended_at)
: CarbonImmutable::now();
$relayNames = $device->relays
->mapWithKeys(fn ($relay) => [(int) $relay->relay_number => $relay->name ?: "Relay {$relay->relay_number}"]);
$events = RelayHistory::query()
->where('device_id', $device->id)
->whereBetween('created_at', [$startedAt, $endedAt])
->orderBy('created_at')
->orderBy('id')
->get();
$startedRelays = $this->maskToRelayItems($session->start_relay_mask, $relayNames);
$endedRelays = $isActive ? null : $this->maskToRelayItems($session->end_relay_mask, $relayNames);
$relayDurations = $this->buildRelayDurations($session, $events, $relayNames, $startedAt, $endedAt);
$activeRelayNumbers = collect($startedRelays)
->pluck('relay_number')
->merge($isActive ? [] : collect($endedRelays)->pluck('relay_number'))
->merge($events->where('state', true)->pluck('relay_number'))
->merge(collect($relayDurations)->where('duration_seconds', '>', 0)->pluck('relay_number'))
->unique()
->sort()
->values();
return response()->json([
'session' => [
'id' => $session->id,
'started_at' => $startedAt->toIso8601String(),
'ended_at' => $session->ended_at ? $endedAt->toIso8601String() : null,
'duration_seconds' => $session->ended_at
? max(0, $startedAt->diffInSeconds($endedAt))
: max(0, $startedAt->diffInSeconds($endedAt)),
'start_relay_mask' => $session->start_relay_mask,
'end_relay_mask' => $session->end_relay_mask,
'is_active' => $isActive,
],
'summary' => [
'relays' => $activeRelayNumbers
->map(fn ($relayNumber) => $this->relayItem($relayNumber, $relayNames))
->all(),
'switches_count' => $events->count(),
'started_relays' => $startedRelays,
'ended_relays' => $endedRelays,
],
'relay_durations' => $relayDurations,
'events' => $events->map(fn (RelayHistory $event) => [
'occurred_at' => $event->created_at?->toIso8601String(),
'relay_number' => (int) $event->relay_number,
'relay_name' => $relayNames->get((int) $event->relay_number, "Relay {$event->relay_number}"),
'state' => (bool) $event->state,
])->values(),
]);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment