Подсказка external_id из уже увиденных устройств при добавлении

Поле External ID при создании/изменении устройства теперь input+datalist:
можно вписать значение вручную (как раньше) или выбрать из подсказок —
идентификаторы устройств, от которых device-control-service уже
получал MQTT-телеметрию/ack (Redis-множество devices:known), но
которые ещё не зарегистрированы в Postgres. Уже зарегистрированные
id из списка подсказок исключаются.

DeviceShadow::knownExternalIds() — новый read-метод (SMEMBERS
devices:known), зеркалит то же множество, что Go-сервисы уже читают/
пишут для health-check/online-детекции.
This commit is contained in:
2026-08-18 03:10:28 +05:00
parent be1f238f89
commit dd551a0de3
6 changed files with 61 additions and 7 deletions
@@ -59,11 +59,11 @@ class DeviceController extends Controller
]);
}
public function create()
public function create(DeviceShadow $shadow)
{
$this->authorize('create', Device::class);
return Inertia::render('Devices/Create', $this->formOptions());
return Inertia::render('Devices/Create', $this->formOptions($shadow));
}
public function store(DeviceRequest $request)
@@ -75,13 +75,13 @@ class DeviceController extends Controller
return redirect()->route('devices.index')->with('status', 'Устройство добавлено.');
}
public function edit(Device $device)
public function edit(Device $device, DeviceShadow $shadow)
{
$this->authorize('update', $device);
return Inertia::render('Devices/Edit', [
'device' => $device->only(['id', 'name', 'zone_id', 'device_type_id', 'external_id', 'protocol']),
...$this->formOptions(),
...$this->formOptions($shadow),
]);
}
@@ -150,11 +150,21 @@ class DeviceController extends Controller
/**
* @return array<string, mixed>
*/
private function formOptions(): array
private function formOptions(DeviceShadow $shadow): array
{
$registeredIds = Device::pluck('external_id')->all();
$unregisteredExternalIds = collect($shadow->knownExternalIds())
->diff($registeredIds)
->sort()
->values();
return [
'zones' => ZoneResource::collection(Zone::orderBy('name')->get())->resolve(),
'deviceTypes' => DeviceTypeResource::collection(DeviceType::orderBy('code')->get())->resolve(),
// external_id of devices device-control-service has already seen
// over MQTT but nobody has registered yet — offered as
// suggestions (not a closed list) when adding/editing a device.
'unregisteredExternalIds' => $unregisteredExternalIds,
];
}
}