KDS — Регистрация устройства
Когда показывается: при первом запуске приложения (нет device_id в SQLite или device_id revoked сервером — 401 DEVICE_REVOKED).
Источник
BR 5.1 §2.1, §3 «Архитектура» (явный admin-login + выбор ТТ). Бизнес-спека: Кухонный экран §2.1.
Один раз на устройство. Владелец/менеджер франшизы вводит свой email+пароль (как в Админке Франшизы), выбирает ТТ из доступных в его scope, задаёт имя устройства. После этого устройство привязано к ТТ и переходит на экран PIN-логина повара.
Что видит пользователь
Полноэкранное окно. Логотип системы вверху, под ним заголовок «Подключение устройства», ниже форма из трёх шагов (как stepper).
Шаг 1 — Admin login
| Поле | Тип | Validation |
|---|---|---|
| Input email | Не пусто, валидный формат | |
| Пароль | Input password | Не пусто, ≥6 символов |
| Кнопка «Далее» | Button primary | Disabled пока поля пустые |
При тапе «Далее»:
POST /api/v1/admin/auth/loginс{ email, password }- При успехе — JWT сохраняется во временной памяти приложения (НЕ в SQLite — это сессия владельца, не повара)
- Проверка permission
kds.settings.edit— если нет → toast «У вас нет прав регистрировать KDS-устройство», возврат на шаг 1 - Переход на шаг 2
Ошибки:
INVALID_CREDENTIALS(401) → inline под полем «Неверный email или пароль»FORBIDDEN(403) — отсутствуетkds.settings.edit→ toast и блокировка регистрации- Network error → красный баннер «Нет связи с сервером, проверьте интернет», кнопка «Повторить»
Шаг 2 — Выбор ТТ
После admin-login приложение делает GET /api/v1/admin/stores — список ТТ доступных юзеру (фильтр по scope: владелец франшизы видит все, владелец партнёра — свои, менеджер — свою).
Layout
- Заголовок «Куда устанавливаете планшет?»
- Радио-список ТТ с названием + адресом
- При >5 ТТ — поле поиска по названию
- Если только одна ТТ — она автоматически выбрана, можно сразу нажать «Далее»
- Кнопка «Назад» (вернёт на шаг 1)
- Кнопка «Далее» (disabled до выбора)
Состояния
- Загрузка списка ТТ: skeleton-строки
- Нет доступных ТТ (scope пуст): «У вас нет торговых точек. Обратитесь к владельцу франшизы.» + кнопка «Назад»
Шаг 3 — Имя устройства
| Поле | Тип | Validation |
|---|---|---|
| Имя устройства | Input | До 100 символов, по умолчанию "KDS-{первые 6 hex device_id}" |
Подсказка: «Имя видно в админке (раздел “Настройки KDS”). Например, “Планшет горячего цеха” или “Бар-1”.»
Кнопка «Зарегистрировать».
При тапе «Зарегистрировать»
- На устройстве (если ещё нет) генерируется UUID
device_id, сохраняется в SQLite (tauri-plugin-sql) POST /api/v1/admin/kds/devices/registerс{ device_id, store_id, name, app_version }- При успехе:
- Запись в SQLite:
device_id,franchise_id,store_id, регистрация завершена - Переход на экран PIN-логина повара
- Toast «Устройство зарегистрировано»
- Запись в SQLite:
- При ошибке — обработка ниже
Ошибки
| Code | Поведение |
|---|---|
DEVICE_ALREADY_REGISTERED (409) | Toast «Устройство уже зарегистрировано в системе. Обратитесь к владельцу для отвязки.» Кнопка «Назад» |
STORE_NOT_IN_USER_SCOPE (403) | Toast «У вас нет доступа к этой ТТ» + возврат на шаг 2 |
STORE_NOT_FOUND (404) | Toast «ТТ не найдена», возврат на шаг 2 |
| Network | Красный баннер, кнопка «Повторить» |
После регистрации
Сразу переход на экран PIN-логина повара (см. PIN-логин). Admin-сессия владельца забывается (токен не сохраняется в SQLite — он только для регистрации).
Тех. детали
device_id — генерация
import { v4 as uuidv4 } from "uuid";
import { Database } from "@tauri-apps/plugin-sql";
async function ensureDeviceId(): Promise<string> {
const db = await Database.load("sqlite:kds.db");
const row = await db.select<{ value: string }[]>(
"SELECT value FROM config WHERE key = 'device_id'"
);
if (row.length > 0) return row[0].value;
const newId = uuidv4();
await db.execute(
"INSERT INTO config (key, value) VALUES ('device_id', $1)",
[newId]
);
return newId;
}Передача в каждом запросе
После регистрации все запросы к pos-bff идут с заголовком:
X-Device-Id: <device_id>
pos-bff валидирует устройство (проверяет revoked_at IS NULL) перед роутингом запроса.
Что НЕ входит в P0
- Регистрация по QR-коду из админки (быстрее чем email+password, но требует флоу с генерацией QR)
- Биометрия (Touch ID на планшете)
- Несколько ТТ на одном устройстве (отложено)
Связи
- Бизнес-спека §2.1 «Регистрация и привязка устройства»
- User Service API
- Авторизация админки — переиспользуем admin-login endpoint
- Следующий экран после регистрации