Декомпозиция BR 4.1 — External Menu Builder и монитор
Источник
BR 4.1 Бизнес-спека: Внешние меню
Затронутые сервисы / репозитории
| Сервис | Порт | Репо | Задачи |
|---|---|---|---|
| Catalog Service | :3004 | erp-catalog-service | Catalog Service |
| Admin BFF | :3020 | erp-admin (bff/) | Admin BFF |
| Admin Franchise web | :3020 | erp-admin (web/) | Admin Franchise |
| User Service | :3002 | — | — изменений нет |
| Order / POS / Aggregator | — | — | — изменений нет (Aggregator затронем в BR 4.2) |
| Infrastructure | — | erp-infrastructure | — изменений нет (Catalog Service уже в compose; добавление миграций — стандартный flow) |
Без выделения отдельного сервиса
Render для монитора (
/r/{slug}) реализуем как endpoint в Catalog Service напрямую — не выделяемmenu-rendererв отдельный микросервис. Это упрощает деплой и уменьшает latency. Вариант с отдельным сервисом — рассмотреть в P1+ если нагрузка вырастет.
Последовательность выполнения
- 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-consumecatalog.product.deleted, cron для hard-delete архивных. - Admin BFF (≈ 1 день) — proxy-routes для всех 18 endpoints + shared TypeScript types.
- Admin Franchise web (≈ 4-5 дней) — 3 страницы: список, конструктор (drag-drop), и страница превью; компоненты override-form, ImagePreview, drag-drop API, WebSocket клиент для live-preview (опционально в P1).
- 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) — для гейтинга кнопок и роутов на фронте.
Риски / открытые вопросы
- WebSocket в Spring Boot Catalog Service — сейчас сервис не имеет WebSocket-stack’а. Нужно добавить
spring-boot-starter-websocket+ STOMP или нативный handler. Альтернатива: SSE (Server-Sent Events) — проще в реализации. - Размер ZIP-export’а — если 50 товаров с 5 MB фотками каждый → ZIP ~250 MB. Нужно ли ограничение / сжатие изображений? Для MVP — оставляем оригинальные размеры, в P1 добавить ресайз.
- HTML рендер шаблонов — Thymeleaf, Mustache, Freemarker, или статически в JS? Рекомендую вариант: SSR-минимум на сервере (просто инжект JSON в HTML), всю логику рендера держим в client-side React/vanilla. Так фронт легко тестировать.
- Где хостить 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