From e2c45cf0fa44da6d141da8b0d51d0841515c5477 Mon Sep 17 00:00:00 2001 From: Denozordec Date: Sat, 18 Jul 2026 15:42:54 +0700 Subject: [PATCH] =?UTF-8?q?feat(vps):=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D1=82=D1=8C=20permission=20vps:spaces:admin=20=D0=B8=20d?= =?UTF-8?q?ocs=20Spaces?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Каталог RBAC и секция Spaces в integrate-vps-tracker для multi-user пространств. Co-authored-by: Cursor --- docs/integrate-vps-tracker.md | 16 ++++++++++++++-- packages/shared/src/contracts/auth.ts | 3 +++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/docs/integrate-vps-tracker.md b/docs/integrate-vps-tracker.md index 34fe95a..820aab3 100644 --- a/docs/integrate-vps-tracker.md +++ b/docs/integrate-vps-tracker.md @@ -81,11 +81,23 @@ pnpm --filter web dev # :5173 | `vps:payments:read` | GET payments, balance-ledger | `/payments`, `/balance` | | `vps:payments:write` | мутации payments / ledger | формы платежей | | `vps:sync:write` | POST `/api/sync/*`, GET sync status | `/sync-journal`, кнопка sync | -| `vps:settings:admin` | `/api/settings`, backup, audit, migrate | `/settings`, `/audit` | +| `vps:spaces:admin` | управление всеми пространствами, grants из main | space switcher (все spaces), share/assign | +| `vps:settings:admin` | `/api/settings`, backup, audit, migrate | `/settings`, `/audit`, `/spaces` | + +## Пространства (spaces) + +Данные VPS Tracker изолированы по `spaceId`. Заголовок **`X-Space-Id`**. + +- **space-main** — основное (админский пул); существующие данные мигрируют сюда. +- **personal** — автосоздание `space-user-{userId}` при первом входе. +- **Share (ACL)** — `POST /api/spaces/:id/vps/:vpsId/share` — VPS остаётся в исходном space. +- **Assign** — `POST /api/spaces/:id/vps/:vpsId/assign` — перенос; `providerAccountId` сбрасывается. +- Участники: `GET/POST/PATCH/DELETE /api/spaces/:id/members` (userId из auth-portal). +- Env: `VPS_MAIN_SPACE_OWNER_USER_ID` — owner для main при bootstrap. Без app `vps` в JWT `apps` → **403** на весь `/api/*` (кроме health и CFDM integration). -`AUTH_REQUIRED=false` — auth выключен (удобно для локальной разработки без portal). +`AUTH_REQUIRED=false` — auth выключен (удобно для локальной разработки без portal); данные в `space-main`. ## Troubleshooting diff --git a/packages/shared/src/contracts/auth.ts b/packages/shared/src/contracts/auth.ts index 0dbef9a..728a568 100644 --- a/packages/shared/src/contracts/auth.ts +++ b/packages/shared/src/contracts/auth.ts @@ -80,6 +80,9 @@ export const PERMISSION_CATALOG: AppPermissionCatalog[] = [ section('accounts', 'Аккаунты', 'Аккаунты провайдеров'), section('payments', 'Платежи', 'Платежи и баланс'), section('sync', 'Синхронизация', 'Запуск sync', ['write']), + section('spaces', 'Пространства', 'Управление пространствами и выдачей доступа', [ + 'admin', + ]), section('settings', 'Настройки', 'Настройки приложения', ['admin']), ], },