Декомпозиция BR 4.1 — External Menu Builder и монитор

Источник

BR 4.1 Бизнес-спека: Внешние меню

Затронутые сервисы / репозитории

СервисПортРепоЗадачи
Catalog Service:3004erp-catalog-serviceCatalog Service
Admin BFF:3020erp-admin (bff/)Admin BFF
Admin Franchise web:3020erp-admin (web/)Admin Franchise
User Service:3002— изменений нет
Order / POS / Aggregator— изменений нет (Aggregator затронем в BR 4.2)
Infrastructureerp-infrastructure— изменений нет (Catalog Service уже в compose; добавление миграций — стандартный flow)

Без выделения отдельного сервиса

Render для монитора (/r/{slug}) реализуем как endpoint в Catalog Service напрямую — не выделяем menu-renderer в отдельный микросервис. Это упрощает деплой и уменьшает latency. Вариант с отдельным сервисом — рассмотреть в P1+ если нагрузка вырастет.

Последовательность выполнения

  1. Catalog Service (≈ 3-4 дня) — миграция (3 таблицы), entities, repositories, ExternalMenuService с CRUD + публикацией + soft-delete + orphan-каскадом, ExternalMenuController (~18 endpoints), ZIP-builder для offline export, render endpoint /r/{slug} с шаблоном Thymeleaf или Mustache, WebSocket gateway, KafkaPublisher для external_menu.updated, KafkaConsumer для self-consume catalog.product.deleted, cron для hard-delete архивных.
  2. Admin BFF (≈ 1 день) — proxy-routes для всех 18 endpoints + shared TypeScript types.
  3. Admin Franchise web (≈ 4-5 дней) — 3 страницы: список, конструктор (drag-drop), и страница превью; компоненты override-form, ImagePreview, drag-drop API, WebSocket клиент для live-preview (опционально в P1).
  4. Smoke test и pilot — установить на тестовый монитор в demo-coffee → 1-2 недели реального использования (выявление проблем с шрифтами, разрешениями, kiosk-mode стабильностью).

Итого: ≈ 8-10 дней работы.

Зависимости

  • BR 1.7 (Каталог) — должна быть в проде. Используем products, categories как источник.
  • BR 1.10 (Прейскуранты) — если меню привязано к ТТ → используем price_lists для fallback цены.
  • BR 1.13 (Стоп-листы)product_stop_list, category_stop_list — для автоматического скрытия при рендере.
  • BR 1.5 (Permission-based UI gating) — для гейтинга кнопок и роутов на фронте.

Риски / открытые вопросы

  1. WebSocket в Spring Boot Catalog Service — сейчас сервис не имеет WebSocket-stack’а. Нужно добавить spring-boot-starter-websocket + STOMP или нативный handler. Альтернатива: SSE (Server-Sent Events) — проще в реализации.
  2. Размер ZIP-export’а — если 50 товаров с 5 MB фотками каждый → ZIP ~250 MB. Нужно ли ограничение / сжатие изображений? Для MVP — оставляем оригинальные размеры, в P1 добавить ресайз.
  3. HTML рендер шаблонов — Thymeleaf, Mustache, Freemarker, или статически в JS? Рекомендую вариант: SSR-минимум на сервере (просто инжект JSON в HTML), всю логику рендера держим в client-side React/vanilla. Так фронт легко тестировать.
  4. Где хостить static assets для рендера — фотки уже в S3 (или будут) каталога. JS bundle для /r/{slug} собирается из отдельного репо? Или внутри Catalog Service (resources/static)? Скорее всего — отдельная мини-сборка menu-renderer-bundle в erp-admin репо, deploy которой кладёт build в Catalog Service/resources/static/.

Прогресс

  • Catalog Service — миграция + entities + service + controller + ZIP + render + Kafka publisher/consumer + cron (коммиты 9f1dfc0, 427a231)
  • WebSocket gateway — deferred to BR 4.1.1 (P0 использует 30-сек polling fallback)
  • Admin BFF — 18 прокси-роутов + shared TS types
  • Admin Franchise web — список + редактор + превью + drag-drop
  • [~] Menu renderer — реализован inline в ExternalMenuRenderController.buildHtml (vanilla JS, 3 шаблона). Отдельный Vite-bundle в erp-admin/web — не нужен в P0
  • Тесты mvn test для Catalog Service — TODO BR 4.1.1
  • e2e — установить на тестовый монитор demo-coffee
  • Deploy на VPS

Sandbox / тестовые данные

  • Demo-coffee tenant: demo@nirbi.ru / admin123 на erp-test.nirbi.ru
  • Создать тестовое меню «Demo Bar Screen» с 5-10 товарами
  • Тестовый монитор — любой ноутбук с Chromium в полноэкранном режиме chrome --kiosk https://erp-test.nirbi.ru/r/demo-bar

Ссылки