BR 3.1 — Order Service
Контракты
- Data Model — добавлен
orders.customer_id - API — новые endpoints + customer_id в response
- Events —
order.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 NULLCREATE INDEX idx_orders_customer ON orders(customer_id) WHERE customer_id IS NOT NULL
2. Entity + DTO
- В
Orderentity добавитьUUID customerId(nullable,@Column("customer_id")) - В
OrderResponseDTO добавить поле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илиcancelled→422 ORDER_FINALIZED - Возвращает обновлённый заказ
- Permission:
-
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 ловит и пересчитывает группы