[E9-9] feat(controller): approveModeration + rejectModeration + appsCatalogPendingModerations #85
Closed
claude
wants to merge 3 commits from
feat/E9-9-approve-moderation into apps-catalog
pull from: feat/E9-9-approve-moderation
merge into: C9S:apps-catalog
C9S:main
C9S:dev
C9S:marketplace2
C9S:testnet
C9S:fix/598-51-membership-fee-and-type-cleanup
C9S:feat/capital-canon
C9S:feat/598-supplier-registry
C9S:feature/capital-cpp-private-data-templates
C9S:fix/soviet-install-validation
C9S:feat/ku-selforg
C9S:feat/membership-exit
C9S:feat/marketplace-admin-orders
C9S:fix/capital-share-onproject-event
C9S:ci/independent-env-deploy
C9S:fix/registration-pending-display
C9S:coopID
C9S:feat/expense-chassis-mvp
C9S:fix/zip-utf8-flag
C9S:feat/coopid-auth-ui
C9S:feat/coopid-7-signing-bridge
C9S:feat/coopid-12-recovery-account-from-confirm
C9S:feat/coopid-epic-9-metrics
C9S:feat/coopid-epic-6-access-rules-cleanup
C9S:feat/coopid-epic-12
C9S:feat/coopid-epic-11
C9S:feat/coopid-epic-7
C9S:feat/coopid-epic-9
C9S:feat/coopid-epic-6
C9S:feat/marketplace-process-registry
C9S:feat/marketplace-notifications-map
C9S:feat/marketplace-ku-economy
C9S:savanna
C9S:feat/apps-catalog-finish
C9S:feat/epic-13-billing-package-powerup
C9S:feat/coopid-epic-4
C9S:feat/coopid-epic-3
C9S:feat/blagorost-on-chassis
C9S:feat/coopid-epic-1
C9S:feat/marketplace-coop-stock
C9S:feat/marketplace-live-catalog
C9S:feat/coop-invest-blagorost
C9S:feat/ff-release-flow
C9S:fix/marketplace-offer-instance-not-template
C9S:fix/extension-config-lost-update
C9S:feature/C28-28-email-relay
C9S:feat/E16-onsite-sign-gate
C9S:feat/pwa-version-watch
C9S:fix/participants-registry-status-badges
C9S:feat/E16-coop-categories
C9S:fix/sanitize-blockchain-error-toast
C9S:fix/wallet-withdraw-no-phantom-payment
C9S:fix/agenda-program-offer-links
C9S:feat/notification-center-dc-v3
C9S:fix/chatcoop-livekit-room-name
C9S:feat/delete-inactive-participant
C9S:feat/registration-ledger2-suspense
C9S:feat/registration-refund
C9S:feat/registration-payment-dedup
C9S:perf/factory-parallel-fetch
C9S:feat/E16-sklad-rework
C9S:fix/decision-createproject-tsc
C9S:perf/factory-weasyprint-warm-pool
C9S:feat/E16-korzina-zakaz-agregat
C9S:fix/agenda-pending-new-question
C9S:feat/soviet-negative-consensus
C9S:feat/registration-payment-decline
C9S:feat/coop-standards-audit
C9S:parser2
C9S:feat/mkt-return-chairman-cosign
C9S:feat/registration-fsm
C9S:feat/pwa-reliable-update
C9S:parser2-block-time-and-version
C9S:fix/gorozhane-phantom-cleanup
C9S:fix/remove-bank-kpp
C9S:feat/E9-3b-sub-subscribe
C9S:feat/E10-5-on-chain-watcher
C9S:feat/E10-4-install-pipeline
C9S:feat/E9-3b-ui-publish-package
C9S:feat/E1-tspp-docs-real-text
C9S:feat/E10-3b-dynamic-supergraph
C9S:apps-catalog
C9S:feat/E9-9-3-b-publish-mutation
C9S:feat/sig-v2-export
C9S:feat/E10-1-federation-subgraph
C9S:parser2-epic-4-forks
C9S:feat/decision-authorize-backend
C9S:feat/blagorost-program-expenses-ui
C9S:parser2-epic-6-canonical-storage
C9S:wip/pre-e16-desktop-docs
C9S:feat/E15-min-volume-per-ku
C9S:feat/blagorost-E2-E5-program-expenses
C9S:feat/epic-14-billing-notifications
C9S:blagorost
C9S:feat/E14-explicit-shipment
C9S:feat/marketplace-collective-supply
C9S:feat/blagorost-E1-contract
C9S:feat/C28-21-pg-signed-documents
C9S:provider-billing
C9S:fix/desktop-format-asset-errors
C9S:feat/marketplace-docs
C9S:feat/epic-12-billing-subscriptions
C9S:fix/min-soviet-members-3
C9S:parser2-epic-3-transport
C9S:feat/marketplace2-drop-blocked
C9S:worktree-design-wave1
C9S:feat/notif-mobile-canon
C9S:fix/vue-tsc-desktop
C9S:worktree-marketplace-docs-impl
C9S:feat/chatcoop-hide-matrix-room-id
C9S:feat/epic-8-coop-registry-provider
C9S:parser2-epic-2-idempotency
C9S:feat/chatcoop-secretary-rooms
C9S:feat/remove-l3-blocked
C9S:ci-trial-typecheck-2026-05-23
C9S:fix/controller-revert-transpileonly
C9S:chore/mongo-standalone-local
C9S:chore/ci-unify-release-workflows
C9S:feat/controller-swc-builder
C9S:feat/chatcoop-transcription-memo
C9S:fix/mono-base-ca-certificates
C9S:fix/wallet-withdraw-gateway-timing
C9S:feat/ledger2-burn-blocked-withdraw
C9S:fix/boot-tests-wallet-signagree-v2
C9S:chore/trustees-ownership
C9S:feat/capital-w-cap-gen-cooperative
C9S:chore/re-review-E5-apl-fail-fast
C9S:chore/re-review-E4-fail-fast-tx-hash
C9S:chore/re-review-E3-fix-withdraw-stub
C9S:chore/review-E3-vitrina-fixes
C9S:chore/review-E10-design-fixes
C9S:chore/review-E8-spisanie-fixes
C9S:chore/review-E7-vozvrat-fixes
C9S:chore/review-E6-vydacha-fixes
C9S:chore/review-E5-postavka-fixes
C9S:chore/review-E4-order-fixes
C9S:feat/epic0-onboarding-harness
C9S:chore/marketplace2-sync-dev-and-controller-di
C9S:feat/E11-stol-zakazov-frontend-and-tests
C9S:feat/E11-stol-zakazov-final
C9S:feat/capital-artifacts-access
C9S:fix/floor-asset-display
C9S:feat/epic-9-warehouse-reporting
C9S:feat/598-11-epic-8-writeoff
C9S:feat/E7-garantiynyy-vozvrat
C9S:design
C9S:fix/capital-revert-394-generation-convert-refs
C9S:fix/is-unioned-zod-string-parse
C9S:fix/capital-rename-generation-convert-to-money-invest
C9S:feat/E6-vydacha-payshchiku
C9S:worktree-remove-1081-1082-rename-1080
C9S:feat/init-by-server-from-provider
C9S:feat/E5-postavka-priemka
C9S:feat/E11-techdebt-L12-split-payout
C9S:feat/E4-zakaz
C9S:gh-pages
C9S:feat/E3-vitrina-canon
C9S:feat/E11-S1-ledger2-marketplace-ops
C9S:file-storage
C9S:feat/1-10-marketplace-registration-offer-status
C9S:feat/1-9-marketplace-board-acceptance
C9S:feat/1-8-marketplace-access-matrix
C9S:feat/1-7-marketplace-template-registry
C9S:feat/1-6-marketplace-role-guard
C9S:feat/1-5-marketplace-member-wallet
C9S:feat/1-4-marketplace-onboarding-gate
C9S:feat/1-3-marketplace-access-by-membership
C9S:feat/1-1-install-from-catalog
C9S:ci/lock-tags-only
C9S:onboarding
C9S:reports
C9S:ledger3
C9S:graph-standarts
C9S:feat/ledger-double-entry
C9S:feat/docs-enrichment
C9S:feat/documentation
C9S:feat/marketplace-orders
C9S:feat/interops-extension-system
C9S:cursor/development-environment-setup-2882
C9S:feat/unified-test-pipeline
C9S:fix/security-vulnerabilities
C9S:audio-stream
C9S:project-authorization-on-create
C9S:refactoring
C9S:capital
C9S:element
C9S:ledger
C9S:marketplace
C9S:notifications2
C9S:notifications
C9S:document2
C9S:TSK-900
C9S:TSK-878
C9S:dacom-dark-sun/sprint-4
C9S:uniconstructor/sprint-5
No Reviewers
Labels
No items
No Label
Milestone
No items
No Milestone
Projects
Clear projects
No project
AppsCatalog
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: C9S/mono#85
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Delete Branch "feat/E9-9-approve-moderation"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
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/* в outcomerejectModeration(input)→ mapping HTTP 200/409/* в outcomeReleaseScope
InputType с union-style полями (
type+subnets?/coopnames?); резолвер валидирует соответствиеtype → непустой массив(BadRequestException).Зависимости
feat/E9-demo-app-pilotдо того, как этот endpoint используется e2e.pnpm run generate-schema && pnpm run generate-clientвcomponents/controller/+pnpm run buildвcomponents/sdk/(не запускаю локально — ресурсный потолок).Что не делалось
Зонтик
Merge в
apps-catalog(зонтичный PR mono #64 → dev).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>claude referenced this pull request2026-06-09 12:01:17 +00:00
Замещён консолидированным PR #117 (вся работа apps-catalog/Federation в одной ветке на dev). Закрываю как superseded.
Pull request closed