[E16] Категории кооператива: собственные категории + вкл/выкл доступности #104

Merged
ant merged 4 commits from feat/E16-coop-categories into marketplace2 2026-06-05 18:29:08 +00:00
Owner

Перенос фичи кастомных категорий кооператива в marketplace2.

Контекст: PR #58 (корзина+агрегат) слит в marketplace2 раньше, а три коммита кастомных категорий добавлены в ветку korzina ПОСЛЕ того мерджа — в baseline их не было. Здесь они перенесены поверх свежего marketplace2 (где уже склад #102), zeus перегенерирован для согласования склада+категорий.

Что внутри (3 коммита)

  • feat: категории кооператива — собственные (кастомные) категории сверх baseline-набора + вкл/выкл доступности по канону (страница «Доступные категории» переверстана: тоглы доступности, добавление/удаление своих категорий).
  • fix: страница и форма создания предложения тянут категории кооператива (baseline + свои); снят хардкод диапазона 1–9.
  • fix: снят @Max(9) с category_id в DTO — кастомные категории (id>9) не проходили валидацию.

Backend

  • Новый marketplaceListCoopCategories / marketplaceCreateCustomCategory / marketplaceDeleteCustomCategory; колонка coopname в marketplace_category (NULL=baseline, set=кастомная, id>9); bootstrap-миграция v10.

Codegen

generate-schema (84 резолвера) → generate-client → sdk build, зелёные; zeus закоммичен, schema.gql gitignored.

🤖 Generated with Claude Code

Перенос фичи кастомных категорий кооператива в marketplace2. Контекст: PR #58 (корзина+агрегат) слит в marketplace2 раньше, а три коммита кастомных категорий добавлены в ветку korzina ПОСЛЕ того мерджа — в baseline их не было. Здесь они перенесены поверх свежего marketplace2 (где уже склад #102), zeus перегенерирован для согласования склада+категорий. ### Что внутри (3 коммита) - **feat:** категории кооператива — собственные (кастомные) категории сверх baseline-набора + вкл/выкл доступности по канону (страница «Доступные категории» переверстана: тоглы доступности, добавление/удаление своих категорий). - **fix:** страница и форма создания предложения тянут категории кооператива (baseline + свои); снят хардкод диапазона 1–9. - **fix:** снят @Max(9) с category_id в DTO — кастомные категории (id>9) не проходили валидацию. ### Backend - Новый `marketplaceListCoopCategories` / `marketplaceCreateCustomCategory` / `marketplaceDeleteCustomCategory`; колонка `coopname` в marketplace_category (NULL=baseline, set=кастомная, id>9); bootstrap-миграция v10. ### Codegen generate-schema (84 резолвера) → generate-client → sdk build, зелёные; zeus закоммичен, schema.gql gitignored. 🤖 Generated with Claude Code
claude added 4 commits 2026-06-05 18:25:16 +00:00
Переосмысление экрана «Доступные категории» в управление списком категорий
кооператива: список = общие baseline-категории + собственные категории
кооператива; доступность для публикации задаётся включением/выключением.

Backend (controller):
- marketplace_category: колонка coopname (владелец кастомной категории; NULL
  у baseline) + миграция bootstrap-v10 (bump schema_version под synchronize).
- repo/service: listForCoop (baseline + свои), createCustom (id/sort поверх
  максимума, проверка дубля имени), deleteCustom (только свои, baseline защищён).
- AvailableCategoryAdminResolver: query marketplaceListCoopCategories,
  мутации marketplaceCreateCustomCategory / marketplaceDeleteCustomCategory
  (удаление каскадно снимает категорию из whitelist).

SDK: обёртки ListCoopCategories, CreateCustomCategory, DeleteCustomCategory,
ReplaceAvailableItems, ClearAvailableCategories + регенерация zeus-клиента.

Frontend (desktop): страница переверстана по канону — убраны бесполезные
KPI-плитки, canon-таблица с тумблерами вкл/выкл, бейдж «Базовая/Своя»,
удаление своих категорий, добавление через диалог, действия в шапке.
Whitelist-семантика: все включены = пустой whitelist (открытый каталог);
выключение строит whitelist из оставшихся; нельзя выключить последнюю.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Категории кооператива не доезжали до потребителей: форма создания предложения,
каталог и карточки показывали только 9 baseline-категорий, а публикация в
кастомную категорию падала бы на бэке.

Backend (controller):
- marketplaceListCategories теперь отдаёт полный список кооператива (baseline +
  собственные) — для каталога и резолва имени категории у опубликованных Offer'ов;
  не фильтруется по доступности (имя нужно и у выключенной категории).
- новый query marketplaceListAvailableCategories — категории, доступные для
  публикации (список кооператива минус выключенные whitelist'ом); для формы offer'а.
- MarketplaceOfferService.ensureCategoryExists: снят хардкод BASELINE_CATEGORY_IDS
  (1–9) — принимается любая категория кооператива (baseline/своя), плюс проверка
  доступности (whitelist) при создании/редактировании предложения.

SDK: обёртка ListAvailableCategories + регенерация zeus-клиента.

Frontend (desktop): форма создания предложения тянет marketplaceListAvailableCategories
(доступные категории), каталог через marketplaceListCategories автоматически
получает кастомные категории (резолв имён).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Создание/редактирование предложения падало с «category_id must not be greater
than 9»: class-validator @Max(9) на DTO резал кастомные категории кооператива
(их id нумеруются поверх baseline, т.е. > 9). Это второй слой ограничения 1–9
помимо снятого ранее хардкода в сервисе.

- marketplace-offer-input.dto: убран @Max(9) у category_id в create и update.
- marketplace-catalog.dto: убран @Max(9) у фильтра category_id (фильтрация
  каталога по кастомной категории) + чистка осиротевшего импорта Max и описания.

@Min(1)/@IsInt сохранены. Только runtime-валидация — GraphQL-схема не меняется.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
ant approved these changes 2026-06-05 18:29:04 +00:00
ant merged commit ae068bb9b1 into marketplace2 2026-06-05 18:29:08 +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: C9S/mono#104