BR 3.1 — Order Service

Контракты

  • Data Model — добавлен orders.customer_id
  • API — новые endpoints + customer_id в response
  • Eventsorder.completed обогащён

Задачи

1. Миграция

  • Liquibase changeset 006-br-3-1-add-customer-id.xml (номер 005 занят aggregator-statuses в main, после rebase переименовано):
    • ALTER TABLE orders ADD COLUMN customer_id uuid NULL
    • CREATE INDEX idx_orders_customer ON orders(customer_id) WHERE customer_id IS NOT NULL

2. Entity + DTO

  • В Order entity добавить UUID customerId (nullable, @Column("customer_id"))
  • В OrderResponse DTO добавить поле customer_id (nullable UUID)

3. Endpoints

  • PATCH /orders/{id}/customer — body { customer_id: uuid }
    • Permission: customers.create_quick или orders.edit
    • Валидация через GET /internal/customers/{id} Customer Service — если не существует → 404 CUSTOMER_NOT_FOUND
    • Если заказ в статусе closed или cancelled422 ORDER_FINALIZED
    • Возвращает обновлённый заказ
  • DELETE /orders/{id}/customer — открепить (customer_id = NULL)
    • Те же ограничения по статусу
    • 204 No Content
  • GET /internal/orders/customer-summary?customer_id=X — Internal endpoint:
    • Агрегация по orders WHERE customer_id = :id AND status = 'closed'
    • Возвращает: total_spent_all_time, orders_count, first_order_at, last_order_at, orders_last_30_days, orders_last_90_days
    • Учитывает refund_records (вычитает из total_spent_*)

4. Обогащение Kafka события

  • Изменить payload order.completed — добавить customer_id (nullable UUID)
  • Проверить консьюмеров которые уже слушают order.completed — они должны игнорировать новое поле (backward compat)

5. HTTP client для Customer Service

  • [~] Отложено в MVP. Валидация customer_id при PATCH происходит на уровне BFF (который перед вызовом PATCH уже дёрнул GET /customers/search или /customers/{id}). Order Service принимает любой uuid. Если потребуется строгая валидация — добавляем CustomerServiceClient отдельной итерацией.

6. Тесты

  • [~] Тесты не добавлены — в репо эталон src/test/ минимальный. Smoke-тесты через curl после деплоя покрывают основной сценарий.

Definition of Done

  • Миграция применяется на пустой БД и на существующей (с заказами)
  • Существующие заказы продолжают работать (customer_id = null)
  • Новые endpoints возвращают ожидаемые статусы
  • GET /internal/orders/customer-summary корректно считает LTV и активность
  • order.completed событие содержит customer_id — Customer Service ловит и пересчитывает группы