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
EmailInput emailНе пусто, валидный формат
ПарольInput passwordНе пусто, ≥6 символов
Кнопка «Далее»Button primaryDisabled пока поля пустые

При тапе «Далее»:

  1. POST /api/v1/admin/auth/login с { email, password }
  2. При успехе — JWT сохраняется во временной памяти приложения (НЕ в SQLite — это сессия владельца, не повара)
  3. Проверка permission kds.settings.edit — если нет → toast «У вас нет прав регистрировать KDS-устройство», возврат на шаг 1
  4. Переход на шаг 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”.»

Кнопка «Зарегистрировать».

При тапе «Зарегистрировать»

  1. На устройстве (если ещё нет) генерируется UUID device_id, сохраняется в SQLite (tauri-plugin-sql)
  2. POST /api/v1/admin/kds/devices/register с { device_id, store_id, name, app_version }
  3. При успехе:
    • Запись в SQLite: device_id, franchise_id, store_id, регистрация завершена
    • Переход на экран PIN-логина повара
    • Toast «Устройство зарегистрировано»
  4. При ошибке — обработка ниже

Ошибки

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 на планшете)
  • Несколько ТТ на одном устройстве (отложено)

Связи