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-клиента