Repository navigation
feat(web-api): msCustomerGroup и ACL групп ресурсов для авторизованных - #677
Conversation
dc060c5 to
15355bc
Compare
|
По существу PR готов — проверил все девять пунктов, критичных проблем нет. Не вливаю только потому, что база (#666) уходит на доработку, и есть неразрешённый конфликт с #681. Подробности ниже. Что подтвердилосьРеализован именно выбранный вариант.
Аноним идёт ровно прежним путём. При отсутствии токен-сервиса, отсутствующем или истёкшем токене, заблокированном покупателе, покупателе без группы, неактивной группе и Существующие покупатели не ломаются. В публичный ответ ничего не утекает. И Миграция и схема согласованы. Роуты закрыты Отдельно отмечу решение по кэшу — оно лучше того, что я предполагал в issue. Резолв не кэшируется персистентно, а сегментом ключа кэша фасетов служит хеш от текущего набора разрешённых групп. При смене группы покупателя или правке ACL ключ меняется сам на следующем запросе, ручная инвалидация не нужна. Вопрос из #669 про «где хранить и когда сбрасывать» закрыт элегантно. N+1 нет — фильтр остаётся условием запроса, а Числа: мерж с актуальной Что мешает влить прямо сейчасБаза уходит на доработку. В #666 нашёлся баг: ресурс, состоящий в нескольких группах ресурсов, скрывается, даже если одна из групп открыта анониму — членство в MODX работает как ИЛИ, а SQL проверяет попарно внутри одной строки членства. Ваш Конфликт с #681. Вы оба стоите на ветке #666 и по-разному переписываете То же и с самим Нужно ваше решение, как свести Мелочи, на усмотрение
|
15355bc to
f99931d
Compare
|
Сведено с #681 и пофикшенным #666. Порядок мержа: #666 → #681 → #677 (база PR переключена на API в одной точке входа
Multi-group (#666): Мелочи из ревью
|
|
Уточнение по базе: GitHub не даёт сменить base у stacked PR ( |
f99931d to
0f20d00
Compare
0f20d00 to
f0d16f9
Compare
|
Слой проверен, дизайн тот же, что одобрен в прошлый раз. Вливать можно только после исправления #666: Ветку с разрешёнными группами я прогнал там же: с правильным квотированием покупатель с грантом видит ресурс в «закрытой A + разрешённой F» и «только в F», аноним — нет. Резолвер ищет ACL через критерии xPDO ( Что подтвердилось
Замечания
Конфликт с #681Порядок #666 → #681 → #677. После вливания #681 здесь будут конфликты в трёх файлах:
|
|
@biz87 Спасибо. База подтянута с tip #666 ( Блокер MySQL: Один список как в ядре: у резолвера убран свой blocked_until: при Упрощения vs ядро: в докблоке резолвера явно: не смотрим policy view/load, не сравниваем authority. Тесты:
Локально: visibility/resolver/controller smoke + PHPUnit SQL 13/13. Live MySQL — без DSN, жду CI. |
f0d16f9 to
58e67dd
Compare
58e67dd to
9947858
Compare
|
Проверил. Квотирование Блокер: запрос резолвера не выполняетсяВ $c->where([
'context_key' => $contextKey,
'OR:context_key' => '',
'OR:context_key:IS' => null,
]);xPDO ( ( `modAccessResourceGroup`.`context_key` = 'web' AND `modAccessResourceGroup`.`OR` CONTEXT_KEY '' OR `modAccessResourceGroup`.`context_key` IS NULL )MySQL/MariaDB отвечают Проверил на dev-базе (MariaDB), строки ACL созданы через Исправление — ключ из трёх частей: 'OR:context_key:=' => '',С ним на тех же данных резолвер вернул ожидаемые группы для Заодно: при Тест, который это ловитЮнит-тест резолвера мокает Не блокер
ПорядокGitHub после вливания #666 сам перебазировал этот PR на |
|
Починил. Блокер. Тест. Не блокер. Комментарий про Live MySQL локально без DSN. Жду |
* fix(storefront): respect resource groups in Fenom snippets Reuse CatalogResourceGroupVisibility for ms3_products (INNER JOIN ON to avoid pdoTools where false-positives), gallery/options product lookups, and cart validation. Extend pdoTools cache keys with RG+context. * fix(phpstan): type snippet \$modx and drop premature msProduct phpdoc PHPStan failed on #681: bare modX vs MODX\Revolution\modX for CatalogResourceGroupVisibility, and (int) cast after @var msProduct in ms3_gallery. * fix(storefront): drop dead pdoTools cache suffix; keep cart on apply() Fetch::run() never reads cacheKey, so the _rg suffix was misleading. validateProduct stays on apply() so #677 can upgrade to applyForRequest; isVisible remains for Fenom &product= lookups. Rebased onto #666 multi-group SQL. * docs(storefront): Record ms3_cart RG visibility decision Document that cart listing skips RG re-check after add (#681 review), and align smoke quote() stub with MySQL backslash escaping. * fix(storefront): pin class_key in isVisible getCount getCount skips derivative criteria that getObject applies, so a raw id must not match a non-catalog resource if callers skip the snippet preload.
Authenticated catalog visitors resolve allowed resource groups via a customer group → modUserGroup link, reusing the #666 SQL visibility gate.
Two-part OR:context_key is parsed as a field named OR, so the ACL query 1064s and the resolver returns no groups. Log prepare/execute failures and cover the query on live MySQL, including empty context_key.
The #669 migration booted a second modX from config.core.php, which is absent in CI testbench, so createObjectContainer never ran and Phinx still marked the version applied. Reuse ms3MigrationBootstrap like option groups and list the model in PackageModels.
|
Перебазировал на актуальный Конфликты по плану из ревью:
Smoke visibility/resolver/controller + PHPUnit SQL 13/13 зелёные. Merge-tree против |
1aa5462 to
d3ca4ce
Compare
Описание
Продолжение #659/#666: анонимный фильтр групп ресурсов уже скрывает закрытые разделы, но авторизованный
msCustomerдля MODX всё ещё гость. Добавлена сущностьmsCustomerGroupсо ссылкой наmodUserGroup; видимость каталога считается черезaccess_resource_groupsи тот же SQL-контур, без второго реестра прав и безmodUserна каждого покупателя.Depends on #666 (база PR — ветка
feat/issue-659-catalog-resource-groups).Тип изменений
Связанные Issues
Closes #669
Depends on #666 / Refs #659
Как это было протестировано?
После деплоя:
phinx migrate(таблицаms3_customer_groups+customer_group_id).composer ci:php/composer test,npm run lint:ci,composer stan/ GitHub Actions CI)Конфигурация тестирования:
feat/issue-669-customer-resource-groupsповерх feat(web-api): учитывать ACL групп ресурсов в публичном каталоге #666Скриншоты (если применимо)
Чеклист
composer stan/ CI jobPHPStan)npm run lint:ciдля Vue)Дополнительные заметки
MVP: одна группа на покупателя, без Vue UI, без чистки корзины при потере доступа. Manager API:
/api/mgr/customer-groups+customer_group_idвPUT /customers/{id}. Web profile не отдаёт и не пишетcustomer_group_id. Blocked/inactive покупатель остаётся на anonymous-гейте. После merge #666 перенацелить PR наbeta.