feat(web-api): нормализовать контракт ответа корзины - #600
Conversation
Nuxt получает стабильный items[] и типизированный status без клиентского reduce. Пустой cart сериализуется как объект, скидки вынесены на позицию.
|
Проверил: сам контракт сделан аккуратно — старый ключ Но нужен ребейз: после вливания #595 (journey suite) PHPUnit даёт 5 ошибок. Причина — гонка, а не баг в коде: В самом ядре регистрация на месте ( Достаточно добавить Заодно предупреждение на весь оставшийся пакет: #598 и #599 сейчас тоже конфликтуют с |
Описание
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).Тип изменений
Пустой
cart: []→cart: {}может затронуть клиентов, которые ждут массив. Подробности в заметках ниже.Связанные Issues
Closes #570
Как это было протестировано?
Локальный CI-гейт (без полной установки MODX/MySQL), PHP lint + vueManager jobs из
.github/workflows/ci.yml:npm run lint:ciне запускался: Vue не менялся.composer ci:php/composer test,npm run lint:ci,composer stan/ GitHub Actions CI)Конфигурация тестирования:
feat/issue-570-cart-response-contractотbetaСкриншоты (если применимо)
Не применимо (JSON API).
Чеклист
composer stan/ CI jobPHPStan)npm run lint:ciдля Vue)Лексиконы и Vue не затрагивались. CHANGELOG по правилам репозитория пишется при релизе.
Дополнительные заметки
Проекция живёт в
CartResponseNormalizerна границе Web API. Draft иCartItemManagerне переписывались. СобытияmsOnGetCart/msOnGetStatusCartи SSRrenderна месте.ApiClient.buildUrlкопирует?queryрядом сrouteиctx. Иначеinclude_thumbsпопадал внутрьrouteи не доходил до PHP.Вне scope:
include_order_costs=1, tax/VAT, Manager cart API.Ревью: 1 цикл правок (query thumbs + пустые
optionsкак{}+ bool-флаг на HTTP-границе). Deferred: sanitizingorder_idв legacydata.cart(AC оставляет map ближе кtoArray).