[E9-9] feat(controller): approveModeration + rejectModeration + appsCatalogPendingModerations #85

Closed
claude wants to merge 3 commits from feat/E9-9-approve-moderation into apps-catalog
Owner

Story 9.9 «Стол восхода: approve pending packages» — backend mono.

GraphQL contract

  • Query.appsCatalogPendingModerations(status?, limit?)[ModerationRequestDTO]
  • Mutation.approveModeration(data)ApproveModerationResultDTO (discriminated: applied | pendingChain | conflict | requiresOverride | failed)
  • Mutation.rejectModeration(data)RejectModerationResultDTO (discriminated: applied | conflict | failed)

Всё под chairman-only (GqlJwtAuthGuard + RolesGuard + AuthRoles).

HTTP-service

3 новых метода на ca-admin endpoints:

  • listSubmittedModerations(status, limit) → degraded mode возвращает []
  • approveModeration(input) → mapping HTTP 200/423/409/403/* в outcome
  • rejectModeration(input) → mapping HTTP 200/409/* в outcome

ReleaseScope

InputType с union-style полями (type + subnets?/coopnames?); резолвер валидирует соответствие type → непустой массив (BadRequestException).

Зависимости

  • Apps-catalog PR #7 (GET /v1/admin/moderation) — должен быть смёрджен в feat/E9-demo-app-pilot до того, как этот endpoint используется e2e.
  • После merge этой ветки потребуется pnpm run generate-schema && pnpm run generate-client в components/controller/ + pnpm run build в components/sdk/ (не запускаю локально — ресурсный потолок).

Что не делалось

  • Desktop UI (#56 / отдельная задача) — стол восхода с QTable + dialog approve/reject.
  • E2E против реального ca-admin — на текущей dev-стенде ApiKey не настроен; smoke после смёрджа PR #7.

Зонтик

Merge в apps-catalog (зонтичный PR mono #64 → dev).

Story 9.9 «Стол восхода: approve pending packages» — backend mono. ## GraphQL contract - `Query.appsCatalogPendingModerations(status?, limit?)` → `[ModerationRequestDTO]` - `Mutation.approveModeration(data)` → `ApproveModerationResultDTO` (discriminated: `applied | pendingChain | conflict | requiresOverride | failed`) - `Mutation.rejectModeration(data)` → `RejectModerationResultDTO` (discriminated: `applied | conflict | failed`) Всё под `chairman`-only (GqlJwtAuthGuard + RolesGuard + AuthRoles). ## HTTP-service 3 новых метода на ca-admin endpoints: - `listSubmittedModerations(status, limit)` → degraded mode возвращает `[]` - `approveModeration(input)` → mapping HTTP 200/423/409/403/* в outcome - `rejectModeration(input)` → mapping HTTP 200/409/* в outcome ## ReleaseScope InputType с union-style полями (`type` + `subnets?`/`coopnames?`); резолвер валидирует соответствие `type → непустой массив` (`BadRequestException`). ## Зависимости - **Apps-catalog PR #7** (GET /v1/admin/moderation) — должен быть смёрджен в `feat/E9-demo-app-pilot` до того, как этот endpoint используется e2e. - После merge этой ветки потребуется `pnpm run generate-schema && pnpm run generate-client` в `components/controller/` + `pnpm run build` в `components/sdk/` (не запускаю локально — ресурсный потолок). ## Что не делалось - Desktop UI (#56 / отдельная задача) — стол восхода с QTable + dialog approve/reject. - E2E против реального ca-admin — на текущей dev-стенде ApiKey не настроен; smoke после смёрджа PR #7. ## Зонтик Merge в `apps-catalog` (зонтичный PR mono #64 → dev).
claude added 3 commits 2026-06-04 14:34:32 +00:00
Story 9.9 «Стол восхода: approve pending packages» — backend-сторона.

GraphQL contract:
- Query.appsCatalogPendingModerations(status?: ModerationStatusEnum, limit?: Int)
  → [ModerationRequestDTO]. По умолчанию SUBMITTED. Chairman-only.
- Mutation.approveModeration(data: ApproveModerationInputDTO!)
  → ApproveModerationResultDTO. Discriminated outcome:
    applied / pendingChain (423) / conflict (409) / requiresOverride (403) / failed.
- Mutation.rejectModeration(data: RejectModerationInputDTO!)
  → RejectModerationResultDTO. Discriminated outcome: applied / conflict / failed.

HTTP-service: 3 новых метода (listSubmittedModerations / approveModeration /
rejectModeration) на ca-admin endpoints, добавленных параллельным
apps-catalog PR #7. Mapping snake_case → camelCase; degraded mode на
list — пустой массив, на mutations — failed с явной причиной (чтобы UI
не вводился в заблуждение «approved»).

ReleaseScope передаётся как InputType с union-style полями
(type + subnets?/coopnames?); резолвер валидирует соответствие type →
непустой массив перед отправкой на ca-admin.

Зависимость: apps-catalog PR #7 (GET /v1/admin/moderation) должен быть
смёрджен в feat/E9-demo-app-pilot до того, как этот endpoint можно
использовать в e2e.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Story 9.3.b-sub: пайщик в десктопе нажимает Подписаться в ExtensionsShowcase.
Backend проксирует это в ca-auth POST /v1/subscriptions/activate с tenant
JWT кооператива-партнёра. ca-auth активирует подписку (trial → active по
free_trial_period_seconds; pay-period после expired); on-chain
apps::regsub подписывает ca-auth от имени каталога-оператора. После
активации pricing-watcher на coopback партнёра подхватит подписку
(Story 9.6).

GraphQL:
- Mutation.subscribePackage(data: SubscribePackageInputDTO!)
  → SubscribePackageResultDTO. Discriminated outcome:
    activated / alreadyActive (409) / clientNotRegistered (403) /
    unavailable (423) / failed.

Защита: chairman кооператива-партнёра (GqlJwtAuthGuard + RolesGuard +
AuthRoles).

Config:
- APPS_CATALOG_AUTH_URL — base URL ca-auth (отдельный от admin).
- APPS_CATALOG_TENANT_JWT — JWT кооператива-партнёра.

Tenant читается ca-auth'ом ТОЛЬКО из JWT — body НЕ может его
переопределить (закрывает «активировать от имени другого tenant'а»).

На degraded-mode (нет AUTH_URL/TENANT_JWT) — mutation возвращает failed
с явной причиной, а не silent no-op.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
ant added this to the AppsCatalog project 2026-06-05 07:51:12 +00:00
Author
Owner

Замещён консолидированным PR #117 (вся работа apps-catalog/Federation в одной ветке на dev). Закрываю как superseded.

Замещён консолидированным PR #117 (вся работа apps-catalog/Federation в одной ветке на dev). Закрываю как superseded.
claude closed this pull request 2026-06-09 12:01:45 +00:00

Pull request closed

Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: C9S/mono#85