[9.3.b umbrella] Mutation.publishPackage + publishRelease — proxy на ca-admin #72

Closed
claude wants to merge 0 commits from feat/E9-9-3-b-publish-mutation into apps-catalog
Owner

Summary

Umbrella PR на стол разработчика 9.3.b (backend часть): две GraphQL-мутации в apps-catalog-proxy, обе подписываются ca-admin'ом от имени chairman'а кооператива-оператора каталога (voskhod на dev) — поэтому в input'е нет session-ключей пайщика.

Stories

ID Story Action Commit
9.3.b-pub Mutation.publishPackage on-chain apps::regpkg a07b5f8d60
9.3.b-rel Mutation.publishRelease on-chain apps::setrelease f698e39cb8

Discriminated outcomes

publishPackage:

  • applied — пакет зарегистрирован on-chain;
  • conflict — HTTP 409 (пакет уже есть или дубль request_id);
  • failed — network/auth/degraded.

publishRelease:

  • applied (+ optional transactionId) — релиз создан on-chain;
  • invalidManifest — HTTP 422 INVALID_MANIFEST (Zod-валидация на ca-admin провалилась);
  • failed — прочие.

Что НЕ делаем в этом PR

  • Multipart upload install.js — под архитектуру E10 install.js устарел: расширения публикуются как npm-package + docker-image в Nexus отдельной процедурой (npm publish / docker push) через scoped JWT от CA-auth.
  • schema.gql / Zeus client — codegen за пределами этого PR (mono-канон: pnpm generate-schema + generate-client + sdk build отдельным коммитом).
  • Frontend (DeveloperPublishReleasePage.vue + DeveloperMyPackagesPage.vue) — story 9.3.b-ui (#56) после codegen'а.

Test plan

  • tsc --noEmit — backend pass
  • codegen schema → Zeus → sdk build (вне PR, mono-канон)
  • Smoke: publishPackage(@voskhod/test-2) → applied; повтор → conflict
  • Smoke: publishRelease(@voskhod/test-2 @ 1.0.0, manifest={...}) → applied; невалидный manifest → invalidManifest
  • Без APPS_CATALOG_API_KEY → failed с явным сообщением

🤖 Generated with Claude Code

## Summary Umbrella PR на стол разработчика 9.3.b (backend часть): две GraphQL-мутации в `apps-catalog-proxy`, обе подписываются ca-admin'ом от имени chairman'а кооператива-оператора каталога (voskhod на dev) — поэтому в input'е нет session-ключей пайщика. ### Stories | ID | Story | Action | Commit | |----|-------|--------|--------| | 9.3.b-pub | `Mutation.publishPackage` | on-chain `apps::regpkg` | a07b5f8d603 | | 9.3.b-rel | `Mutation.publishRelease` | on-chain `apps::setrelease` | f698e39cb8f | ### Discriminated outcomes **publishPackage:** - `applied` — пакет зарегистрирован on-chain; - `conflict` — HTTP 409 (пакет уже есть или дубль `request_id`); - `failed` — network/auth/degraded. **publishRelease:** - `applied` (+ optional `transactionId`) — релиз создан on-chain; - `invalidManifest` — HTTP 422 INVALID_MANIFEST (Zod-валидация на ca-admin провалилась); - `failed` — прочие. ### Что НЕ делаем в этом PR - **Multipart upload install.js** — под архитектуру E10 install.js устарел: расширения публикуются как npm-package + docker-image в Nexus отдельной процедурой (`npm publish` / `docker push`) через scoped JWT от CA-auth. - **schema.gql / Zeus client** — codegen за пределами этого PR (mono-канон: `pnpm generate-schema` + `generate-client` + `sdk build` отдельным коммитом). - **Frontend (DeveloperPublishReleasePage.vue + DeveloperMyPackagesPage.vue)** — story 9.3.b-ui (#56) после codegen'а. ## Test plan - [x] tsc --noEmit — backend pass - [ ] codegen schema → Zeus → sdk build (вне PR, mono-канон) - [ ] Smoke: `publishPackage(@voskhod/test-2)` → applied; повтор → conflict - [ ] Smoke: `publishRelease(@voskhod/test-2 @ 1.0.0, manifest={...})` → applied; невалидный manifest → invalidManifest - [ ] Без APPS_CATALOG_API_KEY → failed с явным сообщением 🤖 Generated with [Claude Code](https://claude.com/claude-code)
claude added 1 commit 2026-06-03 19:00:06 +00:00
Story 9.3.b-pub стола разработчика — мутация для воскходовского
chairman'а: координаты пакета (@scope/name + owner + compatible_subnets)
прокидываются на ca-admin POST /v1/admin/package, который сам
подписывает on-chain action apps::regpkg от имени chairman'а
кооператива-оператора каталога.

Backend (apps-catalog-proxy):
- PublishPackageInputDTO / PublishPackageResultDTO — GraphQL InputType +
  ObjectType (camelCase для Zeus, без snake-case утечек).
- AppsCatalogHttpService.registerPackage(): POST на /v1/admin/package;
  discriminated outcome (applied | conflict | failed) — мапит 409 в
  conflict, прочие axios-ошибки в failed; degraded-mode (без
  APPS_CATALOG_API_KEY) возвращает failed с явным сообщением, чтобы UI
  не вводился в заблуждение «опубликовано».
- AppsCatalogProxyResolver.publishPackage(): @UseGuards(GqlJwtAuthGuard,
  RolesGuard) + @AuthRoles(['chairman']) — мутация доступна только
  председателю кооператива.

Multipart upload install.js под архитектуру E10 НЕ делаем: расширения
теперь публикуются как npm-package + docker-image в Nexus отдельной
процедурой (`npm publish` / `docker push`) через scoped JWT от
CA-auth. Эта мутация — только on-chain маркер «такой пакет
существует»; релизы с manifest'ом — story 9.3.b-rel.

schema.gql / Zeus client — codegen за пределами этого PR (mono-каноном
pnpm generate-schema + generate-client + sdk build делается отдельным
коммитом, чтобы PR с backend changes не зависел от пересборки SDK
артефактов).

Frontend — отдельной story 9.3.b-ui: DeveloperPublishReleasePage.vue
сейчас заглушка, форму подключим после codegen'а Zeus.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
claude added 1 commit 2026-06-03 19:03:42 +00:00
Story 9.3.b-rel — мутация выкладки нового релиза ранее зарегистрированного
пакета. Прокидывает manifest + версию + tarball_sha256 на ca-admin
POST /v1/admin/releases, который сам валидирует manifest Zod-схемой
(PackageManifestSchema) и подписывает on-chain apps::setrelease от
имени chairman'а кооператива-оператора каталога.

Backend (apps-catalog-proxy):
- PublishReleaseInputDTO / PublishReleaseResultDTO — GraphQL Input/Object;
  manifest как GraphQLJSON (произвольная структура валидируется на
  ca-admin'е).
- AppsCatalogHttpService.createRelease(): POST /v1/admin/releases;
  discriminated outcome — applied (с опциональным transaction_id) |
  invalidManifest (HTTP 422 INVALID_MANIFEST мапится явно, чтобы UI
  показывал валидационную ошибку отдельно от network/auth) | failed
  для прочих.
- AppsCatalogProxyResolver.publishRelease(): @AuthRoles(['chairman']).

Под архитектуру E10 manifest содержит ссылки на артефакты в Nexus:
- coopenomics.backend.image — docker-image (subgraph расширения);
- coopenomics.frontend.tarball — npm tarball (desktop-bundle).

Сам manifest НЕ валидируется на стороне controller'а — это делает
ca-admin (там Zod-схема и она же будет расширена для package.json
полей в story 10.7).

Frontend (форма Опубликовать релиз) — отдельной story 9.3.b-ui после
codegen'а Zeus.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
claude changed title from [9.3.b-pub] Mutation.publishPackage — on-chain регистрация пакета через ca-admin to [9.3.b umbrella] Mutation.publishPackage + publishRelease — proxy на ca-admin 2026-06-03 19:04:01 +00:00
Author
Owner

Свёрнут в зонтичный PR #64 (apps-catalog) — все коммиты вмержены merge-commit-ом, история по фичам сохранена. Закрываю как rolled-into-umbrella.

Свёрнут в зонтичный PR #64 (apps-catalog) — все коммиты вмержены merge-commit-ом, история по фичам сохранена. Закрываю как rolled-into-umbrella.
claude closed this pull request 2026-06-04 04:55:05 +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#72