Skip to content

fix(web-api): нормализация options в cart/add - #633

Open
Ibochkarev wants to merge 1 commit into
betafrom
fix/issue-632-cart-add-options-string
Open

fix(web-api): нормализация options в cart/add#633
Ibochkarev wants to merge 1 commit into
betafrom
fix/issue-632-cart-add-options-string

Conversation

@Ibochkarev

Copy link
Copy Markdown
Member

Описание

POST /api/v1/cart/add падал с HTTP 500, если options приходил строкой ("[]", "{}", '{"color":"red"}'): CartController передавал значение в Cart::add(..., array $options) без нормализации, PHP бросал TypeError.

Контроллер теперь принимает array или JSON-строку, декодирует через CartItemManager::normalizeOptions(), а для прочих PHP-типов отвечает 400 (ms3_err_cart_options). Из демо-чанков убран hidden value="[]". Штатный ms3.js не менялся.

Closes #632

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

  • Исправление бага (non-breaking change)

Связанные Issues

Closes #632

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

Локальный CI-гейт (без полной установки MODX/MySQL):

cd core/components/minishop3
php -l src/Controllers/Api/Web/CartController.php   # exit 0
php -l src/Services/Cart/CartItemManager.php        # exit 0
composer test -- --filter='CartItemManagerPureTest|HeadlessStorefrontErrorsTest|HeadlessCartSqliteHttpTest'
# exit 0, 24 tests, 94 assertions
composer ci:php
# exit 0: php -l 627 files, smoke 89, PHPUnit 260 tests / 632 assertions (9 skipped mysql)

Vue не затронут. PHPStan локально не гонялся (нет .phpstan-deps).

  • Ручное тестирование
  • Автоматические тесты (composer ci:php / composer test)
  • Тестирование на разных версиях PHP/MODX

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

  • MiniShop3: 1.13.0-beta1 / ветка fix/issue-632-cart-add-options-string
  • PHP: 8.4.17

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

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

Чеклист

  • Код соответствует стилю проекта
  • Изменения не ломают существующую функциональность
  • Лексиконы добавлены на двух языках (ru/en)
  • PHPStan проходит без новых ошибок (composer stan / CI job PHPStan)
  • ESLint — Vue не затронут
  • CHANGELOG.md — запись на релизе

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

Битый JSON ("{bad") даёт пустые опции и 200, как normalizeOptions() в домене. Невалидный PHP-тип (число, bool) — 400. changeOption без JSON-строк, как раньше.

POST /api/v1/cart/add typed options as array and TypeError'd on
form/JSON strings like "[]". Decode on the HTTP boundary and return
400 for non-array non-string values instead of 500.
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/add отдаёт 500, если options приходит строкой

1 participant