BR 6.1 → POS BFF

Репозиторий: erp-pos (часть bff/) Контракты: API, Events

Задачи

Kafka consumer

  • Расширить существующий pos-bff-sse-${HOSTNAME} consumer-группа подпиской на новый топик marketing.slide.changed:
    • В существующем KafkaConsumer.ts (или эквивалент) добавить topic в массив subscribed
    • На message — broadcastToStore(payload.store_id, 'marketing.invalidate', { action: payload.action })
  • (Опционально) Метрика — счётчик обработанных marketing-событий

REST endpoint

  • Новый route GET /pos/api/v1/marketing/active:
    • Получает store_id из req.user.scope.store_ids[0] (предполагаем, кассир имеет 1 ТТ)
    • Если scope пустой — 400 NO_STORE_IN_SCOPE
    • Если scope > 1 — 400 MULTI_STORE_NOT_SUPPORTED (Phase 2 — выбирать по тек. кассе)
    • Прокси в Store Service GET /internal/stores/{store_id}/marketing-slides/active с service-token
    • Возвращает response 1-к-1 (slides + standby конфиг)
  • Проверка permission pos.access (через middleware)

SSE-расширение

  • Добавить в SSE-хаб event-name marketing.invalidate в whitelist (если есть filter)
  • Документация типа SSE event для POS Desktop frontend (TypeScript-типы в shared/ если есть)

Тесты

  • Unit-тест роутинга /marketing/active с моком Store Service
  • Интеграционный тест: Kafka-сообщение в marketing.slide.changed → SSE event у клиента того же store_id
  • Тест: SSE event не уходит клиентам другого store_id

Зависимости

  • Store Service — должен быть задеплоен с эндпоинтом /internal/.../marketing-slides/active
  • Kafka топик marketing.slide.changed — создан до старта консьюмера

Готово когда

  • POS BFF логирует получение marketing.slide.changed при изменении слайда в админке
  • GET /pos/api/v1/marketing/active возвращает реальные данные ТТ
  • SSE event marketing.invalidate доходит до тестового POS Desktop-клиента