Repository navigation
[Feature] Category-scoped PUT для inline-edit product data (вместо body category_id) #455
Copy link
Copy link
Closed
Labels
enhancementNew feature or requestNew feature or request
Description
Описание функции
Добавить category-scoped REST-маршрут для мутаций product data из грида «Товары категории», чтобы scope брался из URL, а не из опциональных полей тела запроса.
Предлагаемый контракт:
PUT /api/mgr/categories/{categoryId}/products/{productId}/data
Query/body: nested (0|1) + поля для обновления (как сейчас в PUT /product-data/{id}).
Проблема, которую решает
#444 / #454 закрывают IDOR inline-edit через opt-in проверку: клиент шлёт category_id + nested в body PUT /api/mgr/product-data/{id}.
Недостатки текущего подхода:
- Scope client-controlled — backend доверяет body-параметрам, а не контексту маршрута.
- Общий endpoint смешивает два сценария: category grid inline-edit и global save из
ProductDataFields.vue(без category). - Асимметрия с остальными мутациями грида (
/categories/{id}/products/multiple,sort,publish), которые уже category-scoped.
Category-scoped route делает границу категории структурной: нельзя «забыть» передать scope или подменить только id товара.
Предлагаемое решение
- Маршрут в
config/routes/manager.php:PUT /categories/{id}/products/{productId}/data→ новый метод (напримерCategoryProductsController::updateProductDataили thin delegate).
- Scope: обязательный
{categoryId}из URL +nestedиз query/body; проверка черезCategoryProductsListService::isProductInCategoryScope()(уже в fix(product-data): category scope для inline-edit PUT #454). - Vue:
useCategoryProductsInlineEditпереключить на новый URL вместо/product-data/{id}+ bodycategory_id. - Legacy:
PUT /product-data/{id}оставить дляProductDataFields.vueбез category scope (globalmsproduct_save). - Опционально: deprecate
category_id/nestedв body глобальногоproduct-dataпосле миграции клиентов.
Альтернативы
- Оставить body-param scope из fix(product-data): category scope для inline-edit PUT #454 (минимальный diff, уже работает).
- Обязательный
category_idна всехPUT /product-data/{id}+ явный флагscope=globalдля карточки товара.
Примеры использования
Inline-edit в гриде категории 42 (nested):
PUT /api/mgr/categories/42/products/1001/data
Content-Type: application/json
{ "nested": 1, "price": 1990 }Карточка товара (без category context) — без изменений:
PUT /api/mgr/product-data/1001
Content-Type: application/json
{ "price": 1990, "article": "SKU-1" }Критерии приёмки
- Новый маршрут с
PermissionMiddleware(msproduct_save) и scope-check по URL categoryId. - 403 + lexicon при product вне scope (direct / nested).
- Vue category grid использует category-scoped route;
ProductDataFields— старый route. - Smoke/regression test на scope policy (можно расширить
CategoryProductScopePolicyTest). - Документация Manager API (если есть) обновлена.
Дополнительный контекст
Metadata
Metadata
Assignees
Labels
enhancementNew feature or requestNew feature or request
Activity
feat(mgr-api): category-scoped PUT for grid inline-edit product data
feat(mgr-api): category-scoped PUT for grid inline-edit product data
feat(mgr-api): category-scoped PUT for grid inline-edit product data
test(vue): expect category-scoped inline-edit PUT URL
feat(mgr-api): category-scoped PUT for grid inline-edit product data
test(vue): expect category-scoped inline-edit PUT URL
feat(mgr-api): category-scoped PUT for grid inline-edit product data
test(vue): expect category-scoped inline-edit PUT URL
feat(mgr-api): category-scoped PUT for grid inline-edit product data
test(vue): expect category-scoped inline-edit PUT URL
feat(mgr-api): category-scoped PUT for grid inline-edit product data
test(vue): expect category-scoped inline-edit PUT URL
feat(mgr-api): category-scoped PUT for grid inline-edit product data
test(vue): expect category-scoped inline-edit PUT URL
feat(mgr-api): category-scoped PUT for grid inline-edit product data
test(vue): expect category-scoped inline-edit PUT URL
feat(mgr-api): category-scoped PUT for grid inline-edit product data
test(vue): expect category-scoped inline-edit PUT URL
feat(mgr-api): category-scoped PUT для inline-edit product data (#474)
chore: sync beta with upstream modx-pro/MiniShop3 (#1)