refactor(payments): one canonical catalog order (storefront/offer/admin) + admin active/all toggle #261

Merged
developer merged 1 commits from feature/wallet-catalog-order into development 2026-07-14 08:30:31 +00:00
Owner

Единый канонический порядок каталога для всех трёх мест + тумблер активные/все в админке.

Проблема

Витрина кошелька (и «купить», и «потратить») отдавала продукты в порядке создания — в отличие от админки и оферты, которые уже сортируют. Плюс сам компаратор был продублирован (админка + оферта над двумя типами).

Что сделано

  • Один компаратор compareCatalogRank (+ уже общий valueGroup) поверх маленького ключа-ранга, применён во всех трёх: витрина (projectCatalog), оферта (projectOfferPricing), админка (SortAdminCatalog). Порядок: паки первыми по рублёвой цене, затем values по подгруппам подсказки → без-рекламы → комбо → турнир и по цене в Фишках внутри подгруппы. Подгруппа и полный порядок теперь в одном месте.
  • «Смотреть рекламу за фишки» — отдельный CTA (wallet.rewardChips), рендерится над паками; сортировкой не затронут, остаётся вверху (как просил).
  • Тумблер активные/все в админке: AdminCatalog(ctx, includeInactive), консоль по умолчанию показывает активные, ?all=1 — плюс архивные. Detail/grant-формы грузят все.

Тесты

  • Юнит: TestProjectCatalog_CanonicalOrder (сперва воспроизвёл баг с заглушённым сортом → FAIL, затем зелёный).
  • Интеграция: TestConsoleCatalogActiveToggle (по умолчанию активные, ?all=1 — с архивными).
  • Существующие offer/admin-order тесты не тронуты — поведение сохранено.
  • Локально: gofmt · build · vet · payments+server unit · integration (catalog editor + toggle) — всё зелёное.

Вне этого PR (по твоим вопросам — отдельно обсуждаем)

  • Ценник «фишки за рекламу» — это config-строка, не каталог, и нет админ-UI (расходится с D32).
  • Продукт «no-ads навсегда» — по D32/D33 «навсегда» это отдельный флаг, не атом каталога (осознанно); добавление — дизайн-решение + миграция.
Единый канонический порядок каталога для всех трёх мест + тумблер активные/все в админке. ## Проблема Витрина кошелька (и «купить», и «потратить») отдавала продукты в порядке **создания** — в отличие от админки и оферты, которые уже сортируют. Плюс сам компаратор был **продублирован** (админка + оферта над двумя типами). ## Что сделано - **Один компаратор** `compareCatalogRank` (+ уже общий `valueGroup`) поверх маленького ключа-ранга, применён во всех трёх: витрина (`projectCatalog`), оферта (`projectOfferPricing`), админка (`SortAdminCatalog`). Порядок: паки первыми по рублёвой цене, затем values по подгруппам **подсказки → без-рекламы → комбо → турнир** и по цене в Фишках внутри подгруппы. Подгруппа и полный порядок теперь в одном месте. - **«Смотреть рекламу за фишки»** — отдельный CTA (`wallet.rewardChips`), рендерится над паками; сортировкой не затронут, остаётся вверху (как просил). - **Тумблер активные/все в админке:** `AdminCatalog(ctx, includeInactive)`, консоль по умолчанию показывает активные, `?all=1` — плюс архивные. Detail/grant-формы грузят все. ## Тесты - Юнит: `TestProjectCatalog_CanonicalOrder` (сперва воспроизвёл баг с заглушённым сортом → FAIL, затем зелёный). - Интеграция: `TestConsoleCatalogActiveToggle` (по умолчанию активные, `?all=1` — с архивными). - Существующие offer/admin-order тесты не тронуты — поведение сохранено. - Локально: gofmt · build · vet · payments+server unit · integration (catalog editor + toggle) — всё зелёное. ## Вне этого PR (по твоим вопросам — отдельно обсуждаем) - Ценник «фишки за рекламу» — это config-строка, не каталог, и **нет админ-UI** (расходится с D32). - Продукт «no-ads навсегда» — по D32/D33 «навсегда» это отдельный флаг, не атом каталога (осознанно); добавление — дизайн-решение + миграция.
developer added 1 commit 2026-07-14 08:24:15 +00:00
refactor(payments): one canonical catalog order for storefront, offer, admin; admin active/all toggle
CI / changes (pull_request) Successful in 2s
CI / unit (pull_request) Successful in 11s
CI / integration (pull_request) Successful in 23s
CI / ui (pull_request) Has been skipped
CI / conformance (pull_request) Successful in 11s
CI / gate (pull_request) Successful in 0s
CI / deploy (pull_request) Successful in 1m49s
b6af682381
The wallet storefront listed products in creation order — its purchases and its
chip-exchange values were unsorted, unlike the admin console and the public offer.
Extract the ordering (chip packs first by rouble price, then chip-priced values
grouped hints → no-ads → combo → tournament and by chip price) into one comparator,
compareCatalogRank over a small rank key, and apply it at all three sites
(projectCatalog, projectOfferPricing, SortAdminCatalog) — so the subgroup ranking
(valueGroup) and the full order now live in one place. The rewarded "watch for
chips" CTA is a wallet-driven element rendered above the packs, so it is unaffected
and stays on top.

Also add the admin catalog active/all toggle: AdminCatalog takes includeInactive,
the console shows active products by default and ?all=1 lists archived ones too
(the detail and grant forms keep loading all products).

Tests: a storefront canonical-order unit test (reproduced the unsorted bug first);
an integration test for the active/all toggle. Existing offer/admin order tests
unchanged — behaviour preserved.
owner approved these changes 2026-07-14 08:30:01 +00:00
developer merged commit 81d5383c42 into development 2026-07-14 08:30:31 +00:00
developer deleted branch feature/wallet-catalog-order 2026-07-14 08:30:31 +00:00
Sign in to join this conversation.
No Reviewers
No Label
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: developer/scrabble-game#261