feat: add remote device management and pairing functionality
- Implemented device pairing with a four-digit code and TTL for remote settings. - Introduced automatic checks for device status and configuration validation. - Developed UI components for device setup and management, including error handling and retry options. - Created a device bridge for secure communication between the device and the server. - Added tests for managed state validation and device pairing logic. - Established a local end-to-end fixture for testing device service and API interactions.
|
Before Width: | Height: | Size: 87 KiB After Width: | Height: | Size: 87 KiB |
|
Before Width: | Height: | Size: 98 KiB After Width: | Height: | Size: 43 KiB |
BIN
artifacts/device-management-offline.jpg
Normal file
|
After Width: | Height: | Size: 78 KiB |
BIN
artifacts/device-pairing-screen.jpg
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
artifacts/device-remote-light.jpg
Normal file
|
After Width: | Height: | Size: 70 KiB |
BIN
artifacts/device-repairing.jpg
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
artifacts/devices-admin-applied.jpg
Normal file
|
After Width: | Height: | Size: 55 KiB |
26
artifacts/verification-departure-features.md
Normal file
@@ -0,0 +1,26 @@
|
||||
# Проверка четырёх функций табло — 9 октября 2026
|
||||
|
||||
Добавлены отмены в строках отправлений, следующий рейс того же направления, крупное время при ожидании от 90 минут и профили читаемости.
|
||||
|
||||
## Автоматические проверки
|
||||
|
||||
- `npm test`: 64 теста прошли. Проверены точные и общие уведомления, несколько маршрутов, неоднозначные площадки/рейсы, устаревшие предупреждения, прибытия после полуночи, следующий рейс и сохранение настроек.
|
||||
- `npm run build`: финальная TypeScript/Vite-сборка. Временная визуальная сборка исключена из итогового `dist`.
|
||||
- `git diff --check`: без ошибок форматирования.
|
||||
- Импорт серверных модулей из изолированной структуры runtime прошёл. В Dockerfile добавлен общий модуль обработки отмен. Docker-контейнер не запускался.
|
||||
|
||||
## Браузер
|
||||
|
||||
Основная страница проверена с настоящими данными остановки «Швейная фабрика»: следующий рейс того же направления отображается, завтрашнее время не дублируется. После перезапуска локального сервера API вернул расписание 22 маршрутов с метаданными отправной остановки и дня обслуживания. Временный сбой upstream вернул 502; повторный запрос завершился успешно.
|
||||
|
||||
Отмена и большие интервалы проверены на явно обозначенных тестовых данных с настоящим компонентом `DeparturesScreen`; исходник сценариев находится в `test/fixtures/board-features.tsx`. Тестовые отмены не выдавались за действующие сообщения API.
|
||||
|
||||
- **1079×591, 6 строк:** страницы по три строки, высота строк 73–74 px, промежуток между временем и ожиданием около 24 px, содержимое не переполняет список.
|
||||
- **855×723, 4 строки:** четыре строки одновременно, высота 76–77 px, без пересечений.
|
||||
- **879×593:** отменённый рейс пропускается при выборе ближайшего; ночной сценарий показывает «Завтра в 05:40» и следующий рейс «06:20 завтра».
|
||||
- **390×667:** длинное ожидание, переход к отсчёту за 10 минут, длинные названия, все рейсы отменены; в профиле «улица / далеко» одна крупная строка на странице.
|
||||
- **1280×900:** тёмная тема с отменами и светлая тема с крупным временем «Сегодня в 14:05».
|
||||
- Автоматическая смена страниц уличного профиля наблюдалась через 10 секунд; пауза останавливает смену.
|
||||
- На реальной странице профиль «улица / далеко» и выключенные новые функции сохранились после перезагрузки. В меню 879×593 новые поля доступны через постоянные кнопки «Ниже». Затем восстановлены «телевизор / близко», оба новых переключателя включены, удержание ближайшего рейса включено, 4 строки, тёмная лаймовая тема.
|
||||
|
||||
Снимки `departure-features-*.jpg` находятся рядом с этим файлом. Итоговый пример отмены — `departure-features-cancellation.jpg`. Физический Xiaomi Mi Box 4 с Яндекс Браузером не проверялся.
|
||||
37
artifacts/verification-device-management.md
Normal file
@@ -0,0 +1,37 @@
|
||||
# Удалённое управление табло — 10 октября 2026
|
||||
|
||||
Изменения сделаны совместно в `/Users/xtimms/Projects/ridebus-board` и `/Users/xtimms/Projects/polotsk-transit-api`.
|
||||
|
||||
## Результат
|
||||
|
||||
- При включённом `BOARD_REMOTE_SETTINGS` новое устройство показывает четырёхзначный код с TTL 5 минут; привязка выполняется администратором в разделе «Устройства» выбранного города.
|
||||
- Индивидуальный токен в HttpOnly cookie, на API только хеш. Код занимается транзакционно, параметры остановки/маршрута проверяются по городу. Отдельные права устройства и администратора.
|
||||
- Настройки с версиями и оптимистическим сохранением. Подтверждение применения от телевизора; состояние связи с порогом 90 секунд.
|
||||
- Удалённые настройки всех существующих параметров табло, ограниченное локальное меню, кеш конфигурации, отказ от показа после получения отзыва доступа, повторное подключение по новому коду.
|
||||
- Автономный режим сохранён; параметр управления по умолчанию выключен до развёртывания обновлённого API.
|
||||
|
||||
## Проверки
|
||||
|
||||
- Board: 66 тестов прошли; `npm run build` (TypeScript + Vite) успешен.
|
||||
- API: полный набор — 96 прошли, 15 пропущены из-за отсутствия отдельной PostgreSQL БД. Новые целевые проверки — 7 прошли, 1 PostgreSQL-тест пропущен. Повторная целевая проверка после уточнения лимитов тоже успешна.
|
||||
- Admin: Vite production build успешен; существующие предупреждения о Browserslist и размере общего bundle.
|
||||
- `git diff --check` без ошибок в обоих проектах.
|
||||
- Сервер Board импортирован из изолированного дерева с тем же набором общих файлов, который копируется в Docker runtime. Docker-контейнер не запускался: локальный daemon недоступен.
|
||||
|
||||
## Совместный браузерный стенд
|
||||
|
||||
Использованы настоящие обработчики API устройств, сервис, мост Board и UI обоих проектов. Репозиторий устройств в памяти и транспортные данные явно тестовые; это не доказательство работы с производственной БД. Файл стенда: `test/fixtures/device-flow-server.mjs`, тестовый сервер доступен только на loopback и остановлен после проверки.
|
||||
|
||||
Проверены через интерфейс:
|
||||
|
||||
1. Вход тестового администратора и раздел «Устройства».
|
||||
2. Ввод кода, автоматический переход табло к расписанию, статус «В сети / Настройки применены · v1».
|
||||
3. Изменение остановки на «Автовокзал», светлая зелёная тема, уличный профиль и дальний просмотр; автоматическое применение без перезагрузки, затем «Настройки применены · v2» в админке.
|
||||
4. Перезагрузка сохраняет привязку; локальное меню показывает «Управляется из админки» и версию 2.
|
||||
5. Отвязка в админке прекращает показ; кнопка на табло получает новый код.
|
||||
6. Недоступность серверной части управления и перезагрузка страницы: восстановлены имя остановки и параметры из кеша, показаны сообщения о сохранённом расписании и отсутствии связи с управлением.
|
||||
7. Восстановление связи: устройство снова «В сети», сохранённая конфигурация подтверждена.
|
||||
|
||||
Снимки: `device-pairing-screen.jpg`, `devices-admin-applied.jpg`, `device-remote-light.jpg`, `device-repairing.jpg`, `device-management-offline.jpg`.
|
||||
|
||||
Миграция 016 подготовлена, но к рабочей базе не применялась. Обновлённые API и админка на сервер не выкладывались. Физический Xiaomi Mi Box 4 не проверялся. Исходный локальный Board на 5180 перезапущен с новым серверным кодом, его автономные настройки сохранены; тестовые вкладки закрыты.
|
||||