Catalog Service — BR 5.1

Контракты

  • Data Model — поля yellow_threshold_minutes/red_threshold_minutes на kitchen_stations, новая таблица kds_franchise_settings
  • API — расширены kitchen_stations endpoints + 2 новых для KDS settings
  • Events — событие catalog.kds_settings.updated
  • Бизнес-логика: Кухонные станции, Настройки KDS

Что делаем

Миграция Liquibase

  • src/main/resources/db/changelog/0XX_add_kds_settings.xml:
    • ALTER TABLE kitchen_stations ADD COLUMN yellow_threshold_minutes integer NOT NULL DEFAULT 5
    • ALTER TABLE kitchen_stations ADD COLUMN red_threshold_minutes integer NOT NULL DEFAULT 0
    • CHECK CONSTRAINT yellow_threshold_minutes >= 0, red_threshold_minutes >= 0
    • CREATE TABLE kds_franchise_settings:
      • PK (franchise_id), FK к franchises (cross-service ref, no DB FK — opaque)
      • new_order_sound varchar(20) NOT NULL DEFAULT 'bell'
      • new_order_repeat_seconds integer NOT NULL DEFAULT 30 CHECK BETWEEN 5 AND 120
      • overdue_sound varchar(20) NOT NULL DEFAULT 'alarm'
      • sound_volume smallint NOT NULL DEFAULT 80 CHECK BETWEEN 0 AND 100
      • auto_logout_minutes integer NOT NULL DEFAULT 30 CHECK BETWEEN 5 AND 240
      • created_at, updated_at timestamps
    • Регистрация в db.changelog-master.xml

Entities

  • KitchenStation — добавить поля yellowThresholdMinutes, redThresholdMinutes (Integer)
  • Новая KdsFranchiseSettings:
    • PK franchiseId (UUID)
    • Поля: newOrderSound, newOrderRepeatSeconds, overdueSound, soundVolume, autoLogoutMinutes
    • Audit timestamps

Repositories

  • KdsFranchiseSettingsRepository extends JpaRepository<KdsFranchiseSettings, UUID>:
    • Optional<KdsFranchiseSettings> findByFranchiseId(UUID)
    • В Service — auto-create если нет записи (default values)

Services

  • KitchenStationService.update(...) — расширить: если изменились yellow/red_threshold_minutes → опубликовать catalog.kds_settings.updated с kind=station_thresholds

  • Новый KdsFranchiseSettingsService:

    • getOrCreate(franchiseId) — auto-create with defaults
    • update(franchiseId, partialDto) — partial update + публикация события catalog.kds_settings.updated с kind=settings

Controllers

  • KitchenStationController — расширить:

    • GET /kitchen-stations Response теперь включает yellow_threshold_minutes и red_threshold_minutes
    • POST /kitchen-stations Request принимает (опционально) пороги, default 5/0
    • PATCH /kitchen-stations/{id} Request принимает пороги, опубликовать событие если изменились
  • Новый KdsAdminController:

    • GET /admin/kds/settings — auto-create + return; permission kds.settings.edit OR catalog.read
    • PATCH /admin/kds/settings — partial update; permission kds.settings.edit

KafkaPublisher

  • KdsEventPublisher:
    • publishKdsSettingsUpdated(franchiseId, kind, kitchenStationId) — топик catalog.kds_settings.updated, ключ franchise_id

Tests

  • Unit:
    • KitchenStationServiceTest.update_publishesEventWhenThresholdsChanged
    • KdsFranchiseSettingsServiceTest.getOrCreate_createsDefault
    • KdsFranchiseSettingsServiceTest.update_partial_publishesEvent
  • Integration:
    • KdsAdminControllerIntegrationTest — get/patch с реальной БД и Kafka

Конфигурация

  • application.yml:
    • app.kds.allowed-sounds-new-order: bell,chime,buzzer,marimba,digital
    • app.kds.allowed-sounds-overdue: alarm,siren,bell-loud

Что НЕ делаем

  • Не реализуем хранение/upload кастомных звуковых файлов — это BR 5.7
  • Не делаем consumer на catalog.kds_settings.updated — это P1 (pos-bff подпишется в BR 5.x для live-push)

Зависимости

  • Permissions kds.settings.edit и catalog.read — стандартный механизм auth (через JWT) — Catalog Service уже использует эту проверку

Ссылки