ЛК разработчика расширений
Веб-ЛК разработчика (отдельное 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
| Method | Path |
|---|---|
| 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
| Method | Path |
|---|---|
| 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).
Запуск
pnpm extension-marketplace:migrate:up
pnpm dev:extension-marketplace
pnpm dev:extension-dev-portalEnv (корневой .env)
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:3002SDK
@rynt/sdk/extension-marketplace — createExtensionMarketplaceClient({ baseUrl, getAuthToken }) с методами upload / submissions / moderation.
Поток в ЛК
Новое расширение
- «Новое расширение» → загрузка
.ryntextension. - Портал извлекает манифест, проверяет semver и конфликты слотов/реестров до сохранения заявки.
POST /api/v1/developer/artifacts→POST /api/v1/developer/submissions→ «Отправить на модерацию».
Обновление (новая версия)
- В таблице «Опубликованные расширения» → «Новая версия».
- Тот же
manifest.id,manifest.versionстрого выше версии в каталоге (semver). - Тот же флоу загрузки; дубликат
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; PATCHlisting →listingDescriptionHtml.
iconUrl и authorName в каталоге: из манифеста артефакта при approve и/или полей listing. Иконка в артефакте собирается пресетом @rynt/extension-build — см. Сборка и упаковка.
Полная спецификация: Метаданные listing.