Skip to content

fix(web-api): normalize options JSON string in cart/change-option - #638

Open
Ibochkarev wants to merge 1 commit into
betafrom
fix/issue-635-cart-change-option-options-string
Open

fix(web-api): normalize options JSON string in cart/change-option#638
Ibochkarev wants to merge 1 commit into
betafrom
fix/issue-635-cart-change-option-options-string

Conversation

@Ibochkarev

Copy link
Copy Markdown
Member

Описание

POST /api/v1/cart/change-option принимает options как JSON-строку (например "{\"size\":\"L\"}"), а не только как объект. Нормализация через CartItemManager::normalizeOptions() на HTTP-границе, по тому же принципу, что и cart/add в #632/#633.

Невалидный PHP-тип (42, true) → 400 с ms3_err_cart_options. Пустая карта после decode → 400 с ms3_cart_change_options_error (как раньше).

Тип изменений

  • Исправление бага (non-breaking change)
  • Новая функциональность (non-breaking change)
  • Breaking change (изменение, ломающее обратную совместимость)
  • Рефакторинг (без изменения функциональности)
  • Документация
  • Другое (опишите):

Связанные Issues

Closes #635

Связано: #632, #633 (симметрия cart/add).

Как это было протестировано?

cd core/components/minishop3
composer ci:php   # exit 0 — php -l (627 files), smoke (89), PHPUnit 256 tests

Новые тесты в HeadlessStorefrontErrorsTest:

  • testChangeOptionJsonStringOptionsReturns200

  • testChangeOptionInvalidOptionsTypeReturns400

  • Ручное тестирование

  • Автоматические тесты (composer ci:php / composer test, npm run lint:ci, composer stan / GitHub Actions CI)

  • Тестирование на разных версиях PHP/MODX

Конфигурация тестирования:

  • MiniShop3: ветка fix/issue-635-cart-change-option-options-string
  • MODX: journey stub (PHPUnit integration)
  • PHP: 8.4.17

Скриншоты (если применимо)

Не применимо (API).

Чеклист

  • Код соответствует стилю проекта
  • Добавлены/обновлены комментарии в сложных местах
  • Изменения не ломают существующую функциональность
  • Лексиконы добавлены на двух языках (ru/en)
  • PHPStan проходит без новых ошибок (composer stan / CI job PHPStan)
  • ESLint проходит без ошибок (npm run lint:ci для Vue)
  • Обновлён CHANGELOG.md (для значимых изменений)

Дополнительные заметки

CartItemManager::normalizeOptions() сделан static, чтобы контроллер мог вызывать его без инстанса MiniShop3 (в journey-тестах JourneyMs3 не наследует MiniShop3). CartMutationHandler::add по-прежнему вызывает $this->itemManager->normalizeOptions() — DI-подмена ms3_cart_item_manager сохраняется.

Невалидная JSON-строка ("{bad") по-прежнему даёт пустой map и ms3_cart_change_options_error — поведение как у пустого [], в scope issue не менялось.

Closes #635 — headless clients can send options as a JSON string on
change-option, matching the cart/add contract from #632/#633.
@Ibochkarev
Ibochkarev requested a review from biz87 August 25, 2026 05:00
@Ibochkarev Ibochkarev added the bug Something isn't working label Aug 25, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug] POST /api/v1/cart/change-option не принимает options как JSON-строку

1 participant