Skip to content

ЛК разработчика расширений

Веб-ЛК разработчика (отдельное SPA) — Vue 3, Tailwind, PrimeVue.

Роли

РольУсловиеВозможности
РазработчикЛюбой authenticatedItem KeystoneЗагрузка .ryntextension, черновики, отправка на модерацию
АдминUser.isAdminОчередь модерации, approve / reject

Auth: Bearer = keystonejs-session (тот же sessionToken, что после authenticateUserWithPassword).

S3

ПравилоЗначение
Ключextensions/{uuid}.ryntextension или .zip
Лимит5 МБ
ПубликацияПосле approve в каталоге download_url → публичный URL объекта
ОбновлениеПри approve новой версии удаляется s3_key предыдущей опубликованной latest-версии

Env сервиса: EXT_MARKETPLACE_S3_BUCKET (или AWS_S3_BUCKET), AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_REGION, AWS_S3_ENDPOINT.

API (marketplace-service)

Developer

MethodPath
POST/api/v1/developer/artifacts
GET/api/v1/developer/submissions
GET/api/v1/developer/submissions/:id
GET/api/v1/developer/published-extensions
GET/api/v1/developer/published-extensions/:extensionId
POST/api/v1/developer/submissions
POST/api/v1/developer/submissions/:id/submit
DELETE/api/v1/developer/submissions/:id

Admin

MethodPath
GET/api/v1/admin/submissions
GET/api/v1/admin/submissions/:id
POST/api/v1/admin/submissions/:id/approve
POST/api/v1/admin/submissions/:id/reject

Legacy

POST /api/v1/extensions — только admin (прямая публикация с внешним downloadUrl).

Запуск

bash
pnpm extension-marketplace:migrate:up
pnpm dev:extension-marketplace
pnpm dev:extension-dev-portal

Env (корневой .env)

ini
EXT_MARKETPLACE_KEYSTONE_URL=http://localhost:3000
EXT_MARKETPLACE_PORT=3002
EXT_MARKETPLACE_CORS_ORIGIN=http://localhost:5175
EXT_MARKETPLACE_S3_BUCKET=your-bucket
AWS_ACCESS_KEY_ID=...
AWS_SECRET_ACCESS_KEY=...
AWS_REGION=...
AWS_S3_ENDPOINT=http://localhost:9000

# GraphQL: в dev по умолчанию /api/graphql (Vite proxy → backend :3000)
# VITE_API_URL=http://localhost:3000/api/graphql
VITE_EXTENSION_MARKETPLACE_URL=http://localhost:3002

SDK

@rynt/sdk/extension-marketplacecreateExtensionMarketplaceClient({ baseUrl, getAuthToken }) с методами upload / submissions / moderation.

Поток в ЛК

Новое расширение

  1. «Новое расширение» → загрузка .ryntextension.
  2. Портал извлекает манифест, проверяет semver и конфликты слотов/реестров до сохранения заявки.
  3. POST /api/v1/developer/artifactsPOST /api/v1/developer/submissions → «Отправить на модерацию».

Обновление (новая версия)

  1. В таблице «Опубликованные расширения» → «Новая версия».
  2. Тот же manifest.id, manifest.version строго выше версии в каталоге (semver).
  3. Тот же флоу загрузки; дубликат id@version в каталоге или заявка pending на ту же версию отклоняются при сохранении и при submit.

Проверки на сервере (validateSubmissionBeforeSave): DUPLICATE_VERSION, VERSION_NOT_NEWER, SUBMISSION_ALREADY_PENDING, SLOT_ALREADY_CLAIMED, REGISTRY_ALREADY_DECLARED — не только на этапе модерации.

Listing (описание, иконка, автор)

После публикации разработчик может редактировать rich-описание в ЛК без новой версии артефакта:

  • компонент ListingEditor (TipTap → HTML);
  • экраны PublishedListingView, SubmissionEditorView;
  • PATCH listing → listingDescriptionHtml.

iconUrl и authorName в каталоге: из манифеста артефакта при approve и/или полей listing. Иконка в артефакте собирается пресетом @rynt/extension-build — см. Сборка и упаковка.

Полная спецификация: Метаданные listing.