POS BFF — POS Phase 1

Что сделано

routes/tables.ts — расширен

Было: list / release / reserve / cancel-reservation. Стало:

MethodPathAuthНазначение
GET/api/v1/pos/tablesrequireCashierList по activeStoreId
GET/api/v1/pos/tables/:idrequireCashierSingle fetch
POST/api/v1/pos/tablesrequireManagerCreate новый стол
PATCH/api/v1/pos/tables/:idrequireManagerUpdate position/capacity/number/label
DELETE/api/v1/pos/tables/:idrequireManagerSoft delete
POST/api/v1/pos/tables/:id/releaserequireCashierRelease стола
POST/api/v1/pos/tables/:id/reserverequireCashierReserve (с note + until)
POST/api/v1/pos/tables/:id/cancel-reservationrequireCashierСнять бронь
PATCH/api/v1/pos/tables/:id/waiterrequireManagerBR 3.2 — назначить/снять официанта

Все запросы проксируются на store-service /internal/tables/... с X-Service-Token. POST / мапится на /internal/tables/by-store/{activeStoreId} (storeId берётся из JWT, в теле не передаётся).

middleware/auth.tsrequireManager middleware

export async function requireManager(request, reply) {
  await requireCashier(request, reply);
  if (reply.sent) return;
  const permissions = (request as any).permissions ?? [];
  if (!permissions.includes("pos.settings.edit")) {
    return reply.status(403).send({
      error: { code: "MANAGER_REQUIRED", message: "Действие доступно только менеджеру ТТ" },
    });
  }
}

Цепочка: токен валидный → pos.access есть → pos.settings.edit есть. Если хотя бы что-то нет — 403.

Stub-режим уже даёт pos.settings.edit

Dev-стаб с dev-cashier-* токеном получает все permissions (включая settings.edit), что позволяет тестировать manager-флоу без настоящей роли. Для prod нужно настроить pos.settings.edit для нужных permissions-ролей.

Файлы

  • bff/src/routes/tables.ts — full rewrite (старые endpoints сохранены 1-в-1, добавлены новые)
  • bff/src/middleware/auth.ts — добавлен requireManager функция

Тесты

  • TypeScript: tsc --noEmit — pre-existing error в catalog.ts не от нас, новые файлы чистые
  • Smoke после деплоя через UI desktop-pos

Ссылки