feat(web-api): нормализовать контракт ответа корзины - #600
Conversation
|
Проверил: сам контракт сделан аккуратно — старый ключ Но нужен ребейз: после вливания #595 (journey suite) PHPUnit даёт 5 ошибок. Причина — гонка, а не баг в коде: В самом ядре регистрация на месте ( Достаточно добавить Заодно предупреждение на весь оставшийся пакет: #598 и #599 сейчас тоже конфликтуют с |
8306de4 to
52f0cd5
Compare
|
Ребейзнул на текущую
|
|
Этот PR включён в тестовую интеграционную сборку всех открытых PR MiniShop3: AgelxNash/MiniShop3, ветка Сборка нужна, чтобы проверить совместимость взаимозависимых серий PR до их мержа — при последовательном слиянии они конфликтуют друг с другом. Это не ревью и не конкурирующий PR: авторство сохранено (1 PR = 1 коммит с исходным автором), ветка пересобирается по мере обновления PR. Как вошёл в сборку: Слился чисто. |
|
Удачи с PR! Пусть дойдёт до релиза как можно скорее — спасибо за вклад в MiniShop3! 🚀 |
Nuxt получает стабильный items[] и типизированный status без клиентского reduce. Пустой cart сериализуется как объект, скидки вынесены на позицию.
Suite #595 резолвит DI вручную. Без ms3_cart_response_normalizer CartController::transformResponse падает на null->normalize().
52f0cd5 to
575dd5b
Compare
|
Технически PR в порядке. После мержа с актуальной Совместимость с #633/#638 подтверждена по смыслу, а не только по факту чистого мержа: те нормализуют входные Встроенная витрина не ломается. Единственное место в Фикс Но есть проблема ровно в том, что PR заявляет своей ценностью.
|
Reuse CartResponseNormalizer::projectStatus when OrderCostCalculator merges Cart::status so shared total_* keys stay consistent (#570 review).
|
@biz87 Спасибо за ревью. По расхождению Чек-лист PR обновил на Breaking change из‑за пустого Про lint витрины — ок, это #667, в этот PR не тащил. |
Описание
Web API корзины (
GET /api/v1/cart/getи мутации add/change/change-option/remove/clean) отдаёт стабильный JSON для Nuxt.В
dataпоявляетсяitems: всегда массив, в том числе[]для пустой корзины. Скидки (old_price,discount_price,discount_cost) лежат на позиции, не только вproperties.statusсохраняет те же ключи: счётчики как int, деньги с round 2, вес с round 3.Итоги товаров по-прежнему считает
CartItemManager::calculateStatus. Доставка, оплата и финальная сумма остаются наGET /api/v1/order/cost. Opt-ininclude_thumbs=1подмешиваетthumbодним batch-запросом поmsProductData.Пустой
data.cartтеперь JSON-объект{}, не[]. Клиенты сArray.isArray(cart)нужно перевести наitemsили на object/array dual. Непустойcartпо-прежнему map поproduct_key(legacytoArray, включаяorder_id).Общие ключи
total_cost/total_weight/total_discountизCart::status()в ответеorder/costпроходят через тот жеCartResponseNormalizer::projectStatus(), что иcart/get.Тип изменений
Пустой
cart: []→cart: {}может затронуть клиентов, которые ждут массив. Подробности в заметках ниже.Связанные Issues
Closes #570
Как это было протестировано?
cd core/components/minishop3 php tests/CartResponseContractTest.php ./vendor/bin/phpunit tests/Unit/Services/Cart/CartResponseNormalizerTest.phpКонфигурация тестирования:
feat/issue-570-cart-response-contractЧеклист
cart: []→{}Дополнительные заметки
Проекция живёт в
CartResponseNormalizerна границе Web API. Draft иCartItemManagerне переписывались.ApiClient.buildUrlкопирует?queryрядом сrouteиctx.Вне scope:
include_order_costs=1, tax/VAT, Manager cart API. CI lint витриныassets/.../js/web/**— отдельно (#667).