@neohm/nestend 3.1.5 → 3.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +85 -14
- package/dist/admin/controllers/admin.api.key.controller.d.ts +24 -0
- package/dist/admin/controllers/admin.api.key.controller.d.ts.map +1 -0
- package/dist/admin/controllers/admin.api.key.controller.js +119 -0
- package/dist/admin/controllers/admin.api.key.controller.js.map +1 -0
- package/dist/admin/controllers/admin.scheduled.task.controller.d.ts +1 -1
- package/dist/admin/controllers/admin.scope.controller.d.ts +24 -0
- package/dist/admin/controllers/admin.scope.controller.d.ts.map +1 -0
- package/dist/admin/controllers/admin.scope.controller.js +106 -0
- package/dist/admin/controllers/admin.scope.controller.js.map +1 -0
- package/dist/admin/controllers/admin.tenant.controller.d.ts +5 -6
- package/dist/admin/controllers/admin.tenant.controller.d.ts.map +1 -1
- package/dist/admin/controllers/admin.tenant.controller.js +17 -11
- package/dist/admin/controllers/admin.tenant.controller.js.map +1 -1
- package/dist/admin/controllers/admin.tenant.user.controller.d.ts +4 -6
- package/dist/admin/controllers/admin.tenant.user.controller.d.ts.map +1 -1
- package/dist/admin/controllers/admin.tenant.user.controller.js +5 -8
- package/dist/admin/controllers/admin.tenant.user.controller.js.map +1 -1
- package/dist/admin/controllers/admin.user.controller.d.ts +1 -1
- package/dist/admin/controllers/system.role.controller.d.ts +24 -0
- package/dist/admin/controllers/system.role.controller.d.ts.map +1 -0
- package/dist/admin/controllers/system.role.controller.js +106 -0
- package/dist/admin/controllers/system.role.controller.js.map +1 -0
- package/dist/admin/dtos/add.api.key.dto.d.ts +7 -0
- package/dist/admin/dtos/add.api.key.dto.d.ts.map +1 -0
- package/dist/admin/dtos/add.api.key.dto.js +55 -0
- package/dist/admin/dtos/add.api.key.dto.js.map +1 -0
- package/dist/admin/dtos/add.scope.dto.d.ts +7 -0
- package/dist/admin/dtos/add.scope.dto.d.ts.map +1 -0
- package/dist/admin/dtos/add.scope.dto.js +47 -0
- package/dist/admin/dtos/add.scope.dto.js.map +1 -0
- package/dist/admin/dtos/add.system.role.dto.d.ts +8 -0
- package/dist/admin/dtos/add.system.role.dto.d.ts.map +1 -0
- package/dist/admin/dtos/add.system.role.dto.js +56 -0
- package/dist/admin/dtos/add.system.role.dto.js.map +1 -0
- package/dist/admin/dtos/add.tenant.dto.d.ts +1 -0
- package/dist/admin/dtos/add.tenant.dto.d.ts.map +1 -1
- package/dist/admin/dtos/add.tenant.dto.js +12 -0
- package/dist/admin/dtos/add.tenant.dto.js.map +1 -1
- package/dist/admin/dtos/api.key.list.dto.d.ts +4 -0
- package/dist/admin/dtos/api.key.list.dto.d.ts.map +1 -0
- package/dist/admin/dtos/api.key.list.dto.js +8 -0
- package/dist/admin/dtos/api.key.list.dto.js.map +1 -0
- package/dist/admin/dtos/scope.list.dto.d.ts +4 -0
- package/dist/admin/dtos/scope.list.dto.d.ts.map +1 -0
- package/dist/admin/dtos/scope.list.dto.js +8 -0
- package/dist/admin/dtos/scope.list.dto.js.map +1 -0
- package/dist/admin/es6.classes.d.ts +14 -4
- package/dist/admin/es6.classes.d.ts.map +1 -1
- package/dist/admin/es6.classes.js +27 -1
- package/dist/admin/es6.classes.js.map +1 -1
- package/dist/admin/libraries/api.key.data.processor.d.ts +16 -0
- package/dist/admin/libraries/api.key.data.processor.d.ts.map +1 -0
- package/dist/admin/libraries/api.key.data.processor.js +59 -0
- package/dist/admin/libraries/api.key.data.processor.js.map +1 -0
- package/dist/admin/libraries/api.key.list.processor.d.ts +15 -0
- package/dist/admin/libraries/api.key.list.processor.d.ts.map +1 -0
- package/dist/admin/libraries/api.key.list.processor.js +48 -0
- package/dist/admin/libraries/api.key.list.processor.js.map +1 -0
- package/dist/admin/libraries/client.user.data.processor.d.ts +3 -6
- package/dist/admin/libraries/client.user.data.processor.d.ts.map +1 -1
- package/dist/admin/libraries/client.user.data.processor.js +11 -30
- package/dist/admin/libraries/client.user.data.processor.js.map +1 -1
- package/dist/admin/libraries/scope.data.processor.d.ts +13 -0
- package/dist/admin/libraries/scope.data.processor.d.ts.map +1 -0
- package/dist/admin/libraries/scope.data.processor.js +43 -0
- package/dist/admin/libraries/scope.data.processor.js.map +1 -0
- package/dist/admin/libraries/scope.list.processor.d.ts +15 -0
- package/dist/admin/libraries/scope.list.processor.d.ts.map +1 -0
- package/dist/admin/libraries/scope.list.processor.js +29 -0
- package/dist/admin/libraries/scope.list.processor.js.map +1 -0
- package/dist/admin/libraries/system.role.data.processor.d.ts +10 -0
- package/dist/admin/libraries/system.role.data.processor.d.ts.map +1 -0
- package/dist/admin/libraries/system.role.data.processor.js +41 -0
- package/dist/admin/libraries/system.role.data.processor.js.map +1 -0
- package/dist/admin/libraries/tenant.data.processor.d.ts +5 -6
- package/dist/admin/libraries/tenant.data.processor.d.ts.map +1 -1
- package/dist/admin/libraries/tenant.data.processor.js +41 -28
- package/dist/admin/libraries/tenant.data.processor.js.map +1 -1
- package/dist/admin/libraries/tenant.delete.processor.d.ts.map +1 -1
- package/dist/admin/libraries/tenant.delete.processor.js +14 -0
- package/dist/admin/libraries/tenant.delete.processor.js.map +1 -1
- package/dist/admin/services/admin.access.service.d.ts +2 -0
- package/dist/admin/services/admin.access.service.d.ts.map +1 -1
- package/dist/admin/services/admin.access.service.js +3 -0
- package/dist/admin/services/admin.access.service.js.map +1 -1
- package/dist/admin/types/admin.types.d.ts +10 -4
- package/dist/admin/types/admin.types.d.ts.map +1 -1
- package/dist/auth/auth.module.d.ts.map +1 -1
- package/dist/auth/auth.module.js +17 -3
- package/dist/auth/auth.module.js.map +1 -1
- package/dist/auth/entities/api.key.entity.d.ts +4 -1
- package/dist/auth/entities/api.key.entity.d.ts.map +1 -1
- package/dist/auth/entities/api.key.entity.js +13 -3
- package/dist/auth/entities/api.key.entity.js.map +1 -1
- package/dist/auth/entities/tenant.scope.entity.d.ts +10 -0
- package/dist/auth/entities/tenant.scope.entity.d.ts.map +1 -0
- package/dist/auth/entities/tenant.scope.entity.js +41 -0
- package/dist/auth/entities/tenant.scope.entity.js.map +1 -0
- package/dist/auth/enums/api.key.default.enum.d.ts +2 -1
- package/dist/auth/enums/api.key.default.enum.d.ts.map +1 -1
- package/dist/auth/enums/api.key.default.enum.js +1 -0
- package/dist/auth/enums/api.key.default.enum.js.map +1 -1
- package/dist/auth/es6.classes.d.ts +3 -1
- package/dist/auth/es6.classes.d.ts.map +1 -1
- package/dist/auth/es6.classes.js +4 -0
- package/dist/auth/es6.classes.js.map +1 -1
- package/dist/auth/guards/api.key.guard.js +1 -1
- package/dist/auth/guards/api.key.guard.js.map +1 -1
- package/dist/auth/helpers/api.key.context.d.ts +6 -1
- package/dist/auth/helpers/api.key.context.d.ts.map +1 -1
- package/dist/auth/helpers/api.key.context.js +11 -2
- package/dist/auth/helpers/api.key.context.js.map +1 -1
- package/dist/auth/middlewares/api.key.middleware.d.ts +1 -0
- package/dist/auth/middlewares/api.key.middleware.d.ts.map +1 -1
- package/dist/auth/middlewares/api.key.middleware.js +17 -5
- package/dist/auth/middlewares/api.key.middleware.js.map +1 -1
- package/dist/auth/services/api.key.service.d.ts +17 -3
- package/dist/auth/services/api.key.service.d.ts.map +1 -1
- package/dist/auth/services/api.key.service.js +102 -7
- package/dist/auth/services/api.key.service.js.map +1 -1
- package/dist/auth/services/auth.service.d.ts +4 -1
- package/dist/auth/services/auth.service.d.ts.map +1 -1
- package/dist/auth/services/auth.service.js +19 -15
- package/dist/auth/services/auth.service.js.map +1 -1
- package/dist/auth/services/role.service.d.ts +9 -0
- package/dist/auth/services/role.service.d.ts.map +1 -0
- package/dist/auth/services/role.service.js +40 -0
- package/dist/auth/services/role.service.js.map +1 -0
- package/dist/auth/services/scope.service.d.ts +10 -0
- package/dist/auth/services/scope.service.d.ts.map +1 -0
- package/dist/auth/services/scope.service.js +50 -0
- package/dist/auth/services/scope.service.js.map +1 -0
- package/dist/auth/types/api.key.types.d.ts +16 -1
- package/dist/auth/types/api.key.types.d.ts.map +1 -1
- package/dist/common/types/common.response.types.d.ts +10 -0
- package/dist/common/types/common.response.types.d.ts.map +1 -1
- package/dist/constants/entity.constants.d.ts +1 -0
- package/dist/constants/entity.constants.d.ts.map +1 -1
- package/dist/constants/entity.constants.js +1 -0
- package/dist/constants/entity.constants.js.map +1 -1
- package/dist/constants/entity.maps.d.ts +2 -0
- package/dist/constants/entity.maps.d.ts.map +1 -1
- package/dist/constants/entity.maps.js +2 -0
- package/dist/constants/entity.maps.js.map +1 -1
- package/dist/constants/job.constants.d.ts +2 -0
- package/dist/constants/job.constants.d.ts.map +1 -1
- package/dist/constants/job.constants.js +2 -0
- package/dist/constants/job.constants.js.map +1 -1
- package/dist/constants/job.maps.d.ts.map +1 -1
- package/dist/constants/job.maps.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -3
- package/dist/index.js.map +1 -1
- package/dist/migrations/1749600000017.CreateSysApiKeysTable.d.ts.map +1 -1
- package/dist/migrations/1749600000017.CreateSysApiKeysTable.js +8 -1
- package/dist/migrations/1749600000017.CreateSysApiKeysTable.js.map +1 -1
- package/dist/migrations/1749600000027.CreateSysTenantScopesTable.d.ts +6 -0
- package/dist/migrations/1749600000027.CreateSysTenantScopesTable.d.ts.map +1 -0
- package/dist/migrations/1749600000027.CreateSysTenantScopesTable.js +36 -0
- package/dist/migrations/1749600000027.CreateSysTenantScopesTable.js.map +1 -0
- package/dist/notification/es6.classes.d.ts +3 -1
- package/dist/notification/es6.classes.d.ts.map +1 -1
- package/dist/notification/es6.classes.js +3 -1
- package/dist/notification/es6.classes.js.map +1 -1
- package/dist/notification/jobs/tenant.onboarded.mail.job.d.ts +15 -0
- package/dist/notification/jobs/tenant.onboarded.mail.job.d.ts.map +1 -0
- package/dist/notification/jobs/tenant.onboarded.mail.job.js +56 -0
- package/dist/notification/jobs/tenant.onboarded.mail.job.js.map +1 -0
- package/dist/notification/jobs/tenant.user.onboarded.mail.job.d.ts +15 -0
- package/dist/notification/jobs/tenant.user.onboarded.mail.job.d.ts.map +1 -0
- package/dist/notification/jobs/tenant.user.onboarded.mail.job.js +56 -0
- package/dist/notification/jobs/tenant.user.onboarded.mail.job.js.map +1 -0
- package/dist/notification/notification.module.d.ts.map +1 -1
- package/dist/notification/notification.module.js +7 -0
- package/dist/notification/notification.module.js.map +1 -1
- package/dist/notification/types/email.notification.types.d.ts +12 -0
- package/dist/notification/types/email.notification.types.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/admin/dtos/add.user.role.dto.d.ts +0 -4
- package/dist/admin/dtos/add.user.role.dto.d.ts.map +0 -1
- package/dist/admin/dtos/add.user.role.dto.js +0 -22
- package/dist/admin/dtos/add.user.role.dto.js.map +0 -1
package/README.md
CHANGED
|
@@ -106,7 +106,8 @@ these are free to change without a breaking release.
|
|
|
106
106
|
| Scheduled events | `SystemScheduledTaskEntity`, `ScheduledEventEntity`, `ScheduleKind`, `ScheduleSpec`, `IsCronExpression` | schedule definitions in `sys_scheduled_tasks` → events in `sys_scheduled_events`; interval / cron / once specs with timezones, drift-free slots, horizon materialisation, catch-up + overlap policies, fire-once dispatch with backoff, cadence via `SCHEDULED_EVENT_MIN` |
|
|
107
107
|
| Auth | `AuthModule`, `AuthService.validateRole()`, `Auth`, `JwtMiddleware` | imperative auth (open by default); JwtMiddleware resolves the user into `Auth`'s AsyncLocalStorage context per request; access + rotating refresh tokens; session-based logout invalidation (`sys_auth_sessions`); Google SSO via ID token at `POST /auth/google` |
|
|
108
108
|
| Admin auth | `AdminAuthService.validateRole()`, `AdminAuth`, `AdminJwtMiddleware` (endpoints at `/admin/auth`) | fully separate stack for back-office admins — own users table (`sys_admin_users`), own roles (`sys_admin_roles`/`sys_auser_roles`), own sessions/refresh tokens (shared tables, `is_admin` flag) |
|
|
109
|
-
| API keys | `ApiKeyService`, `ApiKeyGuard` / `ApiKeyMiddleware`, `@ApiKeyScopes()`, `
|
|
109
|
+
| API keys | `ApiKeyService`, `ApiKeyGuard` / `ApiKeyMiddleware`, `@ApiKeyScopes()`, `ApiKeyContext` | hashed keys in `sys_api_keys` (admin-owned), one tenant per key, expiry/revocation, `x-api-key` header; `validateAccess(scope)` returns the tenant the key acts for |
|
|
110
|
+
| Scopes | `ScopeService`, `AuthService.validateAccess()`, `ScopeEntity`, `TenantScopeEntity`, `ApiScopeEntity` | one feature named once in `sys_scopes`, then granted per organization (`sys_tenant_scopes`) or per API key (`sys_api_scopes`) — never an array on the principal |
|
|
110
111
|
| Multi-tenancy | `TenantModule`, `TenantEntity`, `CommonTenantEntity`, `TenantContextService`, `TenantContextMiddleware` | AsyncLocalStorage tenant context; resolve by header, slug, or domain; tenants are onboarded by admins (`TenantEntity.creator` → `AdminUserEntity`) |
|
|
111
112
|
| Admin | `AdminModule` (its controllers, DTOs and processors are internal — import the module and hit the endpoints), `GlobalAdminRoles` | back-office APIs: tenant onboarding, client/admin user registration (single + bulk, no role granting), tenant + scheduled-task listing; 4-tier `GlobalAdminRoles` gate over `sys_admin_roles`; Swagger at `/docs` (hidden in production) |
|
|
112
113
|
| Notifications | `NotificationModule`, `NotificationService`, `FcmPushNotificationService` | in-app rows + FCM push (optional `firebase-admin`); device token registry |
|
|
@@ -182,6 +183,17 @@ active session. Pass a role identifier to gate on a specific role:
|
|
|
182
183
|
`validateRole('tenant.editor')`. This keeps authorization next to your business
|
|
183
184
|
logic, so layering tenant/plan/role checks is just more code.
|
|
184
185
|
|
|
186
|
+
For a feature that a whole organization is either enabled for or not, use
|
|
187
|
+
`validateAccess(scopeIdentifier, roleIdentifier?)`: it first checks that the
|
|
188
|
+
caller's tenant holds that scope (`sys_tenant_scopes` against the `sys_scopes`
|
|
189
|
+
catalogue), then delegates to `validateRole()`. One call answers "is this feature
|
|
190
|
+
sold to them?" and "is this person allowed to use it?" in that order.
|
|
191
|
+
|
|
192
|
+
```ts
|
|
193
|
+
const { user } = await this.authService.validateAccess('billing.invoices');
|
|
194
|
+
const { user } = await this.authService.validateAccess('billing.invoices', 'tenant.editor');
|
|
195
|
+
```
|
|
196
|
+
|
|
185
197
|
`AuthController` (mounted at `/auth`) exposes the ready-made flows: `POST
|
|
186
198
|
/auth/login`, `/auth/google`, `/auth/register`, `/auth/refresh`, `/auth/logout`,
|
|
187
199
|
`/auth/change-password`, and `GET /auth/me`. Passwords are hashed/verified via
|
|
@@ -261,7 +273,7 @@ admin with the `admin` role can grant `sys_admin_roles` to other admins via
|
|
|
261
273
|
|
|
262
274
|
| Variable | Default | Description |
|
|
263
275
|
| ------------------- | ------- | ------------------------------------------------------------------------------------- |
|
|
264
|
-
| `ENCRYPTION_SECRET` | — | **Required** when `EncryptionService` is used. AES-256-GCM key material. Min 32 chars |
|
|
276
|
+
| `ENCRYPTION_SECRET` | — | **Required** when `EncryptionService` is used — which now includes issuing API keys (`key_encrypted`). AES-256-GCM key material. Min 32 chars |
|
|
265
277
|
|
|
266
278
|
### Cache (Redis)
|
|
267
279
|
|
|
@@ -553,9 +565,35 @@ a subscriber only starts firing once something constructs it.
|
|
|
553
565
|
|
|
554
566
|
### API Keys
|
|
555
567
|
|
|
556
|
-
| Variable | Default | Description
|
|
557
|
-
| --------------------- | ----------- |
|
|
558
|
-
| `API_KEY_HEADER_NAME` | `x-api-key` | Request header carrying the API key
|
|
568
|
+
| Variable | Default | Description |
|
|
569
|
+
| --------------------- | ----------- | ---------------------------------------------------------------- |
|
|
570
|
+
| `API_KEY_HEADER_NAME` | `x-api-key` | Request header carrying the API key |
|
|
571
|
+
| `ENCRYPTION_SECRET` | — | **Required to issue keys** — `key_encrypted` is AES-256-GCM |
|
|
572
|
+
|
|
573
|
+
A key is stored three ways: its sha256 hash in `key_hash` (what lookups match), a
|
|
574
|
+
short visible prefix in `key_prefix`, and the key itself encrypted in
|
|
575
|
+
`key_encrypted`. That last one makes a key recoverable after issuing, so a lost key
|
|
576
|
+
does not force a reissue and a redeploy — `revealApiKey(uuid)` returns it, and
|
|
577
|
+
`apiKeyDetail(uuid, reveal)` folds it into the detail as `key`. The column is
|
|
578
|
+
`select: false` like `UserEntity.password`, so the ciphertext never rides along on a
|
|
579
|
+
read. Note what it costs: a key is no longer irrecoverable by construction, so treat
|
|
580
|
+
reaching either method as equivalent to holding the key — which is why
|
|
581
|
+
`GET /admin/api-keys/:id` reveals it from the global admin role up and not to a
|
|
582
|
+
content reader.
|
|
583
|
+
|
|
584
|
+
A key belongs to one tenant and holds its scopes as `sys_api_scopes` rows against
|
|
585
|
+
the `sys_scopes` catalogue — there is no scopes array on the key, and a key grants
|
|
586
|
+
nothing it was not given (a granted `*` is the only blanket). `ApiKeyMiddleware`
|
|
587
|
+
resolves the key, its tenant and its scope identifiers once per request into
|
|
588
|
+
`ApiKeyContext`; enforce from there:
|
|
589
|
+
|
|
590
|
+
```ts
|
|
591
|
+
const { tenant } = this.apiKeyService.validateAccess('orders:read');
|
|
592
|
+
// tenant is the sys_tenants row the key acts for — never taken from the payload
|
|
593
|
+
```
|
|
594
|
+
|
|
595
|
+
`ApiKeyGuard`/`@ApiKeyScopes()` remain available for guard-based enforcement;
|
|
596
|
+
`hasScope()` is `async` now that grants are rows.
|
|
559
597
|
|
|
560
598
|
### Email Notifications (AWS SES)
|
|
561
599
|
|
|
@@ -757,18 +795,51 @@ pass the actor to a processor.
|
|
|
757
795
|
|
|
758
796
|
### Endpoints
|
|
759
797
|
|
|
760
|
-
| Route
|
|
761
|
-
|
|
|
762
|
-
| `POST /admin/tenants`
|
|
763
|
-
| `POST /admin/tenants/list`
|
|
764
|
-
| `
|
|
765
|
-
| `POST /admin/
|
|
766
|
-
| `POST /admin/users
|
|
767
|
-
| `POST /admin/
|
|
768
|
-
| `POST /admin/
|
|
798
|
+
| Route | Min. role | Handler |
|
|
799
|
+
| ---------------------------------------- | --------------- | ----------------------------------------------------------- |
|
|
800
|
+
| `POST /admin/tenants` | super admin | `TenantDataProcessor` (upsert — send `id` to update) |
|
|
801
|
+
| `POST /admin/tenants/list` | content reader | `TenantListProcessor` |
|
|
802
|
+
| `GET /admin/tenants/:id` | content reader | the row plus its `scopes` |
|
|
803
|
+
| `POST /admin/tenants/:id/delete` | super admin | `TenantDeleteProcessor` |
|
|
804
|
+
| `POST /admin/tenant-users` | admin | `ClientUserDataProcessor` |
|
|
805
|
+
| `POST /admin/tenant-users/bulk` | admin | `BulkUserDataProcessor` |
|
|
806
|
+
| `POST /admin/tenant-users/list` | content reader | `ClientUserListProcessor` |
|
|
807
|
+
| `GET /admin/tenant-users/:id` | content reader | the row |
|
|
808
|
+
| `POST /admin/tenant-users/:id/delete` | admin | `ClientUserDeleteProcessor` |
|
|
809
|
+
| `POST /admin/users` | super admin | `AdminUserDataProcessor` |
|
|
810
|
+
| `POST /admin/users/list` | content reader | `AdminUserListProcessor` |
|
|
811
|
+
| `GET /admin/users/:id` | content reader | the row |
|
|
812
|
+
| `POST /admin/users/:id/delete` | super admin | `AdminUserDeleteProcessor` |
|
|
813
|
+
| `POST /admin/roles/list` | admin | `AdminRoleListProcessor` |
|
|
814
|
+
| `POST /admin/roles/tenant/list` | admin | `RoleListProcessor` |
|
|
815
|
+
| `POST /admin/scheduled-tasks` | content manager | `ScheduledTaskDataProcessor` (upsert — send `id` to update) |
|
|
816
|
+
| `POST /admin/scheduled-tasks/list` | content reader | `ScheduledTaskListProcessor` |
|
|
817
|
+
| `GET /admin/scheduled-tasks/:id` | content reader | the row |
|
|
818
|
+
| `POST /admin/scheduled-tasks/:id/delete` | content manager | `ScheduledTaskDeleteProcessor` |
|
|
819
|
+
| `POST /admin/scopes` | content manager | `ScopeDataProcessor` (upsert — send `id` to update) |
|
|
820
|
+
| `POST /admin/scopes/list` | content reader | `ScopeListProcessor` |
|
|
821
|
+
| `GET /admin/scopes/:id` | content reader | the row |
|
|
822
|
+
| `POST /admin/scopes/:id/delete` | content manager | `ScopeService.deleteScope` (cascades to every grant) |
|
|
823
|
+
| `POST /admin/api-keys` | admin | `ApiKeyDataProcessor` — returns `{ raw_key, api_key }` |
|
|
824
|
+
| `POST /admin/api-keys/list` | content reader | `ApiKeyListProcessor` |
|
|
825
|
+
| `GET /admin/api-keys/:id` | content reader | the row, its `scopes`, and `key` from admin up |
|
|
826
|
+
| `POST /admin/api-keys/:id/disable` | admin | `ApiKeyService.disableApiKey` (reversible) |
|
|
827
|
+
| `POST /admin/api-keys/:id/delete` | admin | `ApiKeyService.deleteApiKey` (soft, and revokes) |
|
|
769
828
|
|
|
770
829
|
List endpoints are `POST .../list` with the filter payload in the body (a
|
|
771
830
|
`CommonListFilterDto`) — see [List Endpoints & Filtering](#list-endpoints--filtering).
|
|
831
|
+
Deletes and the API-key disable are single-action, so they sit on the domain service
|
|
832
|
+
rather than in a processor; processors are for the writes that validate a payload.
|
|
833
|
+
|
|
834
|
+
**Scopes and grants.** A scope is defined once in `sys_scopes` (content manager),
|
|
835
|
+
then granted to the principals that hold it. `AddTenantDto.scope_ids` carries the
|
|
836
|
+
tenant's whole scope set — `setScopes()` grants what is new and soft-removes what is
|
|
837
|
+
gone, so an omitted list revokes them all (a picker has no other way to clear its
|
|
838
|
+
last selection); every other optional field on that DTO still keeps its stored value.
|
|
839
|
+
An API key can only be granted scopes its tenant already holds, so a key never
|
|
840
|
+
out-ranks the organization it acts for. The key comes back in the issue response as
|
|
841
|
+
`raw_key`, and afterwards from `GET /admin/api-keys/:id` as `key` — for a global
|
|
842
|
+
admin only.
|
|
772
843
|
|
|
773
844
|
Auth endpoints for admins themselves (`login`, `refresh`, `logout`, `me`) live
|
|
774
845
|
at `/admin/auth` (`AdminAuthController`) — see
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { SqlService } from '../../common/services/sql.service';
|
|
2
|
+
import { ApiKeyService } from '../../auth/services/api.key.service';
|
|
3
|
+
import { AdminAccessService } from '../services/admin.access.service';
|
|
4
|
+
import { CommonParamsDto } from '../../common/dtos/common.params.dto';
|
|
5
|
+
import { AddApiKeyDto } from '../dtos/add.api.key.dto';
|
|
6
|
+
import { ApiKeyListDto } from '../dtos/api.key.list.dto';
|
|
7
|
+
export declare class AdminApiKeyController {
|
|
8
|
+
private readonly adminAccessService;
|
|
9
|
+
private readonly apiKeyService;
|
|
10
|
+
private readonly sqlService;
|
|
11
|
+
constructor(adminAccessService: AdminAccessService, apiKeyService: ApiKeyService, sqlService: SqlService);
|
|
12
|
+
issue(dto: AddApiKeyDto): Promise<import("../types/admin.types").IssuedApiKey>;
|
|
13
|
+
list(dto: ApiKeyListDto): Promise<{
|
|
14
|
+
records: import("../..").SqlRow[];
|
|
15
|
+
total: number;
|
|
16
|
+
page: number;
|
|
17
|
+
limit: number;
|
|
18
|
+
total_pages: number;
|
|
19
|
+
}>;
|
|
20
|
+
detail({ id }: CommonParamsDto): Promise<import("../..").ApiKeyDetail>;
|
|
21
|
+
disable({ id }: CommonParamsDto): Promise<import("../..").DisableResult>;
|
|
22
|
+
remove({ id }: CommonParamsDto): Promise<import("../..").DeleteResult>;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=admin.api.key.controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin.api.key.controller.d.ts","sourceRoot":"","sources":["../../../src/admin/controllers/admin.api.key.controller.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AAEpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAGtE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAOzD,qBAGa,qBAAqB;IAE9B,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,UAAU;gBAFV,kBAAkB,EAAE,kBAAkB,EACtC,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,UAAU;IASnC,KAAK,CAAS,GAAG,EAAE,YAAY;IAW/B,IAAI,CAAS,GAAG,EAAE,aAAa;;;;;;;IAW/B,MAAM,CAAU,EAAE,EAAE,EAAE,EAAE,eAAe;IAgBvC,OAAO,CAAU,EAAE,EAAE,EAAE,EAAE,eAAe;IAWxC,MAAM,CAAU,EAAE,EAAE,EAAE,EAAE,eAAe;CAI9C"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.AdminApiKeyController = void 0;
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
17
|
+
const swagger_1 = require("@nestjs/swagger");
|
|
18
|
+
const sql_service_1 = require("../../common/services/sql.service");
|
|
19
|
+
const api_key_service_1 = require("../../auth/services/api.key.service");
|
|
20
|
+
const global_admin_roles_enum_1 = require("../../auth/enums/global.admin.roles.enum");
|
|
21
|
+
const admin_access_service_1 = require("../services/admin.access.service");
|
|
22
|
+
const common_params_dto_1 = require("../../common/dtos/common.params.dto");
|
|
23
|
+
const api_key_data_processor_1 = require("../libraries/api.key.data.processor");
|
|
24
|
+
const api_key_list_processor_1 = require("../libraries/api.key.list.processor");
|
|
25
|
+
const add_api_key_dto_1 = require("../dtos/add.api.key.dto");
|
|
26
|
+
const api_key_list_dto_1 = require("../dtos/api.key.list.dto");
|
|
27
|
+
let AdminApiKeyController = class AdminApiKeyController {
|
|
28
|
+
constructor(adminAccessService, apiKeyService, sqlService) {
|
|
29
|
+
this.adminAccessService = adminAccessService;
|
|
30
|
+
this.apiKeyService = apiKeyService;
|
|
31
|
+
this.sqlService = sqlService;
|
|
32
|
+
}
|
|
33
|
+
async issue(dto) {
|
|
34
|
+
const { user } = await this.adminAccessService.validateAdmin();
|
|
35
|
+
return new api_key_data_processor_1.ApiKeyDataProcessor(user, this.apiKeyService).process(dto);
|
|
36
|
+
}
|
|
37
|
+
async list(dto) {
|
|
38
|
+
await this.adminAccessService.validateContentReader();
|
|
39
|
+
return new api_key_list_processor_1.ApiKeyListProcessor(this.sqlService).process(dto);
|
|
40
|
+
}
|
|
41
|
+
async detail({ id }) {
|
|
42
|
+
const access = await this.adminAccessService.validateContentReader();
|
|
43
|
+
const reveal = this.adminAccessService.holdsAtLeast(access, global_admin_roles_enum_1.GlobalAdminRoles.GLOBAL_ADMIN);
|
|
44
|
+
return this.apiKeyService.apiKeyDetail(id, reveal);
|
|
45
|
+
}
|
|
46
|
+
async disable({ id }) {
|
|
47
|
+
const { user } = await this.adminAccessService.validateAdmin();
|
|
48
|
+
return this.apiKeyService.disableApiKey(id, user.id);
|
|
49
|
+
}
|
|
50
|
+
async remove({ id }) {
|
|
51
|
+
const { user } = await this.adminAccessService.validateAdmin();
|
|
52
|
+
return this.apiKeyService.deleteApiKey(id, user.id);
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
exports.AdminApiKeyController = AdminApiKeyController;
|
|
56
|
+
__decorate([
|
|
57
|
+
(0, common_1.Post)(),
|
|
58
|
+
(0, swagger_1.ApiOperation)({
|
|
59
|
+
summary: 'Issue an API key for a tenant.',
|
|
60
|
+
description: 'Create-only — `raw_key` is the full key and is returned exactly once, since only its hash is stored. A key can only be granted scopes its tenant already holds. Requires at least the global admin role.',
|
|
61
|
+
}),
|
|
62
|
+
__param(0, (0, common_1.Body)()),
|
|
63
|
+
__metadata("design:type", Function),
|
|
64
|
+
__metadata("design:paramtypes", [add_api_key_dto_1.AddApiKeyDto]),
|
|
65
|
+
__metadata("design:returntype", Promise)
|
|
66
|
+
], AdminApiKeyController.prototype, "issue", null);
|
|
67
|
+
__decorate([
|
|
68
|
+
(0, common_1.Post)('list'),
|
|
69
|
+
(0, swagger_1.ApiOperation)({
|
|
70
|
+
summary: 'List, search and filter API keys.',
|
|
71
|
+
description: 'Rows carry `key_prefix` rather than the key itself, and `scopes` as the granted `{ id, identifier, name }` objects. Requires at least the global content reader role.',
|
|
72
|
+
}),
|
|
73
|
+
__param(0, (0, common_1.Body)()),
|
|
74
|
+
__metadata("design:type", Function),
|
|
75
|
+
__metadata("design:paramtypes", [api_key_list_dto_1.ApiKeyListDto]),
|
|
76
|
+
__metadata("design:returntype", Promise)
|
|
77
|
+
], AdminApiKeyController.prototype, "list", null);
|
|
78
|
+
__decorate([
|
|
79
|
+
(0, common_1.Get)(':id'),
|
|
80
|
+
(0, swagger_1.ApiOperation)({
|
|
81
|
+
summary: 'One API key, in full.',
|
|
82
|
+
description: 'Carries the owning tenant and the `scopes` granted to the key. Requires at least the global content reader role — but `key`, the decrypted raw key, is only included from the global admin role up: it is a live credential, and reading a record is not the same permission as holding it. A key issued before keys were stored recoverably has no `key` at all.',
|
|
83
|
+
}),
|
|
84
|
+
__param(0, (0, common_1.Param)()),
|
|
85
|
+
__metadata("design:type", Function),
|
|
86
|
+
__metadata("design:paramtypes", [common_params_dto_1.CommonParamsDto]),
|
|
87
|
+
__metadata("design:returntype", Promise)
|
|
88
|
+
], AdminApiKeyController.prototype, "detail", null);
|
|
89
|
+
__decorate([
|
|
90
|
+
(0, common_1.Post)(':id/disable'),
|
|
91
|
+
(0, swagger_1.ApiOperation)({
|
|
92
|
+
summary: 'Disable an API key.',
|
|
93
|
+
description: 'Turns the key off (`is_active` false) without destroying it: validation stops accepting it, while the row keeps its scopes and its history. Requires at least the global admin role.',
|
|
94
|
+
}),
|
|
95
|
+
__param(0, (0, common_1.Param)()),
|
|
96
|
+
__metadata("design:type", Function),
|
|
97
|
+
__metadata("design:paramtypes", [common_params_dto_1.CommonParamsDto]),
|
|
98
|
+
__metadata("design:returntype", Promise)
|
|
99
|
+
], AdminApiKeyController.prototype, "disable", null);
|
|
100
|
+
__decorate([
|
|
101
|
+
(0, common_1.Post)(':id/delete'),
|
|
102
|
+
(0, swagger_1.ApiOperation)({
|
|
103
|
+
summary: 'Delete an API key.',
|
|
104
|
+
description: 'Soft delete: the row keeps its data with `deleted_at` set and drops out of every listing. It is revoked in the same transaction, along with its scope grants — key validation matches on `is_active`/`revoked_at`, so a row that only left the listings would keep authenticating requests. Requires at least the global admin role.',
|
|
105
|
+
}),
|
|
106
|
+
__param(0, (0, common_1.Param)()),
|
|
107
|
+
__metadata("design:type", Function),
|
|
108
|
+
__metadata("design:paramtypes", [common_params_dto_1.CommonParamsDto]),
|
|
109
|
+
__metadata("design:returntype", Promise)
|
|
110
|
+
], AdminApiKeyController.prototype, "remove", null);
|
|
111
|
+
exports.AdminApiKeyController = AdminApiKeyController = __decorate([
|
|
112
|
+
(0, swagger_1.ApiTags)('Admin - API Keys'),
|
|
113
|
+
(0, swagger_1.ApiBearerAuth)(),
|
|
114
|
+
(0, common_1.Controller)('api/admin/api-keys'),
|
|
115
|
+
__metadata("design:paramtypes", [admin_access_service_1.AdminAccessService,
|
|
116
|
+
api_key_service_1.ApiKeyService,
|
|
117
|
+
sql_service_1.SqlService])
|
|
118
|
+
], AdminApiKeyController);
|
|
119
|
+
//# sourceMappingURL=admin.api.key.controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin.api.key.controller.js","sourceRoot":"","sources":["../../../src/admin/controllers/admin.api.key.controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,6 +17,6 @@ export declare class AdminScheduledTaskController {
|
|
|
17
17
|
total_pages: number;
|
|
18
18
|
}>;
|
|
19
19
|
detail({ id }: CommonParamsDto): Promise<SystemScheduledTaskEntity>;
|
|
20
|
-
remove({ id }: CommonParamsDto): Promise<import("
|
|
20
|
+
remove({ id }: CommonParamsDto): Promise<import("../..").DeleteResult>;
|
|
21
21
|
}
|
|
22
22
|
//# sourceMappingURL=admin.scheduled.task.controller.d.ts.map
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { SqlService } from '../../common/services/sql.service';
|
|
2
|
+
import { AdminAccessService } from '../services/admin.access.service';
|
|
3
|
+
import { CommonParamsDto } from '../../common/dtos/common.params.dto';
|
|
4
|
+
import { ScopeService } from '../../auth/services/scope.service';
|
|
5
|
+
import { AddScopeDto } from '../dtos/add.scope.dto';
|
|
6
|
+
import { ScopeListDto } from '../dtos/scope.list.dto';
|
|
7
|
+
import { ScopeEntity } from '../../auth/entities/scope.entity';
|
|
8
|
+
export declare class AdminScopeController {
|
|
9
|
+
private readonly adminAccessService;
|
|
10
|
+
private readonly scopeService;
|
|
11
|
+
private readonly sqlService;
|
|
12
|
+
constructor(adminAccessService: AdminAccessService, scopeService: ScopeService, sqlService: SqlService);
|
|
13
|
+
save(dto: AddScopeDto): Promise<ScopeEntity>;
|
|
14
|
+
list(dto: ScopeListDto): Promise<{
|
|
15
|
+
records: import("../..").SqlRow[];
|
|
16
|
+
total: number;
|
|
17
|
+
page: number;
|
|
18
|
+
limit: number;
|
|
19
|
+
total_pages: number;
|
|
20
|
+
}>;
|
|
21
|
+
detail({ id }: CommonParamsDto): Promise<ScopeEntity>;
|
|
22
|
+
remove({ id }: CommonParamsDto): Promise<import("../..").DeleteResult>;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=admin.scope.controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin.scope.controller.d.ts","sourceRoot":"","sources":["../../../src/admin/controllers/admin.scope.controller.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAGjE,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAQ/D,qBAGa,oBAAoB;IAE7B,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,UAAU;gBAFV,kBAAkB,EAAE,kBAAkB,EACtC,YAAY,EAAE,YAAY,EAC1B,UAAU,EAAE,UAAU;IASnC,IAAI,CAAS,GAAG,EAAE,WAAW;IAU7B,IAAI,CAAS,GAAG,EAAE,YAAY;;;;;;;IAU9B,MAAM,CAAU,EAAE,EAAE,EAAE,EAAE,eAAe;IAevC,MAAM,CAAU,EAAE,EAAE,EAAE,EAAE,eAAe;CAI9C"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.AdminScopeController = void 0;
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
17
|
+
const swagger_1 = require("@nestjs/swagger");
|
|
18
|
+
const sql_service_1 = require("../../common/services/sql.service");
|
|
19
|
+
const admin_access_service_1 = require("../services/admin.access.service");
|
|
20
|
+
const common_params_dto_1 = require("../../common/dtos/common.params.dto");
|
|
21
|
+
const scope_service_1 = require("../../auth/services/scope.service");
|
|
22
|
+
const scope_data_processor_1 = require("../libraries/scope.data.processor");
|
|
23
|
+
const scope_list_processor_1 = require("../libraries/scope.list.processor");
|
|
24
|
+
const add_scope_dto_1 = require("../dtos/add.scope.dto");
|
|
25
|
+
const scope_list_dto_1 = require("../dtos/scope.list.dto");
|
|
26
|
+
const scope_entity_1 = require("../../auth/entities/scope.entity");
|
|
27
|
+
let AdminScopeController = class AdminScopeController {
|
|
28
|
+
constructor(adminAccessService, scopeService, sqlService) {
|
|
29
|
+
this.adminAccessService = adminAccessService;
|
|
30
|
+
this.scopeService = scopeService;
|
|
31
|
+
this.sqlService = sqlService;
|
|
32
|
+
}
|
|
33
|
+
async save(dto) {
|
|
34
|
+
const { user } = await this.adminAccessService.validateContentManager();
|
|
35
|
+
return new scope_data_processor_1.ScopeDataProcessor(user).process(dto);
|
|
36
|
+
}
|
|
37
|
+
async list(dto) {
|
|
38
|
+
await this.adminAccessService.validateContentReader();
|
|
39
|
+
return new scope_list_processor_1.ScopeListProcessor(this.sqlService).process(dto);
|
|
40
|
+
}
|
|
41
|
+
async detail({ id }) {
|
|
42
|
+
await this.adminAccessService.validateContentReader();
|
|
43
|
+
const scope = await scope_entity_1.ScopeEntity.findOne({ where: { id } });
|
|
44
|
+
if (!scope)
|
|
45
|
+
throw new common_1.NotFoundException('No scope exists for this id');
|
|
46
|
+
return scope;
|
|
47
|
+
}
|
|
48
|
+
async remove({ id }) {
|
|
49
|
+
const { user } = await this.adminAccessService.validateContentManager();
|
|
50
|
+
return this.scopeService.deleteScope(id, user.id);
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
exports.AdminScopeController = AdminScopeController;
|
|
54
|
+
__decorate([
|
|
55
|
+
(0, common_1.Post)(),
|
|
56
|
+
(0, swagger_1.ApiOperation)({
|
|
57
|
+
summary: 'Define a scope, or update an existing one.',
|
|
58
|
+
description: 'Send an `id` to edit that scope; omit it to define a new one. `identifier` is what code checks and is unique across the catalogue. Requires at least the global content manager role.',
|
|
59
|
+
}),
|
|
60
|
+
__param(0, (0, common_1.Body)()),
|
|
61
|
+
__metadata("design:type", Function),
|
|
62
|
+
__metadata("design:paramtypes", [add_scope_dto_1.AddScopeDto]),
|
|
63
|
+
__metadata("design:returntype", Promise)
|
|
64
|
+
], AdminScopeController.prototype, "save", null);
|
|
65
|
+
__decorate([
|
|
66
|
+
(0, common_1.Post)('list'),
|
|
67
|
+
(0, swagger_1.ApiOperation)({
|
|
68
|
+
summary: 'List, search and filter scopes.',
|
|
69
|
+
description: 'Requires at least the global content reader role.',
|
|
70
|
+
}),
|
|
71
|
+
__param(0, (0, common_1.Body)()),
|
|
72
|
+
__metadata("design:type", Function),
|
|
73
|
+
__metadata("design:paramtypes", [scope_list_dto_1.ScopeListDto]),
|
|
74
|
+
__metadata("design:returntype", Promise)
|
|
75
|
+
], AdminScopeController.prototype, "list", null);
|
|
76
|
+
__decorate([
|
|
77
|
+
(0, common_1.Get)(':id'),
|
|
78
|
+
(0, swagger_1.ApiOperation)({
|
|
79
|
+
summary: 'One scope, in full.',
|
|
80
|
+
description: 'Requires at least the global content reader role.',
|
|
81
|
+
}),
|
|
82
|
+
__param(0, (0, common_1.Param)()),
|
|
83
|
+
__metadata("design:type", Function),
|
|
84
|
+
__metadata("design:paramtypes", [common_params_dto_1.CommonParamsDto]),
|
|
85
|
+
__metadata("design:returntype", Promise)
|
|
86
|
+
], AdminScopeController.prototype, "detail", null);
|
|
87
|
+
__decorate([
|
|
88
|
+
(0, common_1.Post)(':id/delete'),
|
|
89
|
+
(0, swagger_1.ApiOperation)({
|
|
90
|
+
summary: 'Delete a scope.',
|
|
91
|
+
description: 'Soft delete: the row keeps its data with `deleted_at` set and drops out of every listing. Every grant of it goes too — the tenant rows in `sys_tenant_scopes` and the API-key rows in `sys_api_scopes` — so no principal keeps a feature the catalogue no longer defines. Requires at least the global content manager role.',
|
|
92
|
+
}),
|
|
93
|
+
__param(0, (0, common_1.Param)()),
|
|
94
|
+
__metadata("design:type", Function),
|
|
95
|
+
__metadata("design:paramtypes", [common_params_dto_1.CommonParamsDto]),
|
|
96
|
+
__metadata("design:returntype", Promise)
|
|
97
|
+
], AdminScopeController.prototype, "remove", null);
|
|
98
|
+
exports.AdminScopeController = AdminScopeController = __decorate([
|
|
99
|
+
(0, swagger_1.ApiTags)('Admin - Scopes'),
|
|
100
|
+
(0, swagger_1.ApiBearerAuth)(),
|
|
101
|
+
(0, common_1.Controller)('api/admin/scopes'),
|
|
102
|
+
__metadata("design:paramtypes", [admin_access_service_1.AdminAccessService,
|
|
103
|
+
scope_service_1.ScopeService,
|
|
104
|
+
sql_service_1.SqlService])
|
|
105
|
+
], AdminScopeController);
|
|
106
|
+
//# sourceMappingURL=admin.scope.controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin.scope.controller.js","sourceRoot":"","sources":["../../../src/admin/controllers/admin.scope.controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,15 +3,14 @@ import { AdminAccessService } from '../services/admin.access.service';
|
|
|
3
3
|
import { CommonParamsDto } from '../../common/dtos/common.params.dto';
|
|
4
4
|
import { AddTenantDto } from '../dtos/add.tenant.dto';
|
|
5
5
|
import { TenantListDto } from '../dtos/tenant.list.dto';
|
|
6
|
-
import {
|
|
7
|
-
import { SystemPropertyService } from '../../common/services/system.property.service';
|
|
6
|
+
import { TenantOnboardedMailJob } from '../../notification/jobs/tenant.onboarded.mail.job';
|
|
8
7
|
import { TenantEntity } from '../../tenant/entities/tenant.entity';
|
|
8
|
+
import { TenantDetail } from '../types/admin.types';
|
|
9
9
|
export declare class AdminTenantController {
|
|
10
10
|
private readonly adminAccessService;
|
|
11
11
|
private readonly sqlService;
|
|
12
|
-
private readonly
|
|
13
|
-
|
|
14
|
-
constructor(adminAccessService: AdminAccessService, sqlService: SqlService, emailNotificationService: EmailNotificationService, systemPropertyService: SystemPropertyService);
|
|
12
|
+
private readonly tenantOnboardedMailJob;
|
|
13
|
+
constructor(adminAccessService: AdminAccessService, sqlService: SqlService, tenantOnboardedMailJob: TenantOnboardedMailJob);
|
|
15
14
|
onboard(dto: AddTenantDto): Promise<TenantEntity>;
|
|
16
15
|
list(dto: TenantListDto): Promise<{
|
|
17
16
|
records: import("../..").SqlRow[];
|
|
@@ -20,7 +19,7 @@ export declare class AdminTenantController {
|
|
|
20
19
|
limit: number;
|
|
21
20
|
total_pages: number;
|
|
22
21
|
}>;
|
|
23
|
-
detail({ id }: CommonParamsDto): Promise<
|
|
22
|
+
detail({ id }: CommonParamsDto): Promise<TenantDetail>;
|
|
24
23
|
remove({ id }: CommonParamsDto): Promise<import("../types/admin.types").DeleteResult>;
|
|
25
24
|
}
|
|
26
25
|
//# sourceMappingURL=admin.tenant.controller.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin.tenant.controller.d.ts","sourceRoot":"","sources":["../../../src/admin/controllers/admin.tenant.controller.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAItE,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"admin.tenant.controller.d.ts","sourceRoot":"","sources":["../../../src/admin/controllers/admin.tenant.controller.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAItE,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,mDAAmD,CAAC;AAC3F,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAEnE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,qBAGa,qBAAqB;IAE9B,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,sBAAsB;gBAFtB,kBAAkB,EAAE,kBAAkB,EACtC,UAAU,EAAE,UAAU,EACtB,sBAAsB,EAAE,sBAAsB;IAS3D,OAAO,CAAS,GAAG,EAAE,YAAY;IAajC,IAAI,CAAS,GAAG,EAAE,aAAa;;;;;;;IAW/B,MAAM,CAAU,EAAE,EAAE,EAAE,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC;IA2B/D,MAAM,CAAU,EAAE,EAAE,EAAE,EAAE,eAAe;CAI9C"}
|
|
@@ -23,19 +23,18 @@ const tenant_delete_processor_1 = require("../libraries/tenant.delete.processor"
|
|
|
23
23
|
const tenant_list_processor_1 = require("../libraries/tenant.list.processor");
|
|
24
24
|
const add_tenant_dto_1 = require("../dtos/add.tenant.dto");
|
|
25
25
|
const tenant_list_dto_1 = require("../dtos/tenant.list.dto");
|
|
26
|
-
const
|
|
27
|
-
const system_property_service_1 = require("../../common/services/system.property.service");
|
|
26
|
+
const tenant_onboarded_mail_job_1 = require("../../notification/jobs/tenant.onboarded.mail.job");
|
|
28
27
|
const tenant_entity_1 = require("../../tenant/entities/tenant.entity");
|
|
28
|
+
const tenant_scope_entity_1 = require("../../auth/entities/tenant.scope.entity");
|
|
29
29
|
let AdminTenantController = class AdminTenantController {
|
|
30
|
-
constructor(adminAccessService, sqlService,
|
|
30
|
+
constructor(adminAccessService, sqlService, tenantOnboardedMailJob) {
|
|
31
31
|
this.adminAccessService = adminAccessService;
|
|
32
32
|
this.sqlService = sqlService;
|
|
33
|
-
this.
|
|
34
|
-
this.systemPropertyService = systemPropertyService;
|
|
33
|
+
this.tenantOnboardedMailJob = tenantOnboardedMailJob;
|
|
35
34
|
}
|
|
36
35
|
async onboard(dto) {
|
|
37
36
|
const { user } = await this.adminAccessService.validateSuperAdmin();
|
|
38
|
-
return new tenant_data_processor_1.TenantDataProcessor(user, this.
|
|
37
|
+
return new tenant_data_processor_1.TenantDataProcessor(user, this.tenantOnboardedMailJob).process(dto);
|
|
39
38
|
}
|
|
40
39
|
async list(dto) {
|
|
41
40
|
await this.adminAccessService.validateContentReader();
|
|
@@ -46,7 +45,15 @@ let AdminTenantController = class AdminTenantController {
|
|
|
46
45
|
const tenant = await tenant_entity_1.TenantEntity.findOne({ where: { id } });
|
|
47
46
|
if (!tenant)
|
|
48
47
|
throw new common_1.NotFoundException('No tenant exists for this id');
|
|
49
|
-
|
|
48
|
+
const tenantScopes = await tenant_scope_entity_1.TenantScopeEntity.find({
|
|
49
|
+
where: { tenant_id: id },
|
|
50
|
+
relations: { scope: true },
|
|
51
|
+
});
|
|
52
|
+
return Object.assign(tenant, {
|
|
53
|
+
scopes: tenantScopes
|
|
54
|
+
.map((tenantScope) => tenantScope.scope)
|
|
55
|
+
.filter((scope) => !!scope),
|
|
56
|
+
});
|
|
50
57
|
}
|
|
51
58
|
async remove({ id }) {
|
|
52
59
|
const { user } = await this.adminAccessService.validateSuperAdmin();
|
|
@@ -58,7 +65,7 @@ __decorate([
|
|
|
58
65
|
(0, common_1.Post)(),
|
|
59
66
|
(0, swagger_1.ApiOperation)({
|
|
60
67
|
summary: 'Onboard a new client tenant, or update an existing one.',
|
|
61
|
-
description:
|
|
68
|
+
description: "Send an `id` to edit that tenant; omit it to onboard a new one. Omitted optional fields keep their stored value, except `scope_ids` — that list replaces the tenant's scope grants, so an omitted one revokes them all. An edit never re-runs onboarding — `onboarded_at`, `created_by` and the welcome email belong to first registration. Requires the global super admin role.",
|
|
62
69
|
}),
|
|
63
70
|
__param(0, (0, common_1.Body)()),
|
|
64
71
|
__metadata("design:type", Function),
|
|
@@ -80,7 +87,7 @@ __decorate([
|
|
|
80
87
|
(0, common_1.Get)(':id'),
|
|
81
88
|
(0, swagger_1.ApiOperation)({
|
|
82
89
|
summary: 'One tenant, in full.',
|
|
83
|
-
description: 'Everything the listing leaves out — address, attributes and the
|
|
90
|
+
description: 'Everything the listing leaves out — address, attributes, the onboarding trail and the `scopes` enabled for the tenant. Requires at least the global reader role.',
|
|
84
91
|
}),
|
|
85
92
|
__param(0, (0, common_1.Param)()),
|
|
86
93
|
__metadata("design:type", Function),
|
|
@@ -104,7 +111,6 @@ exports.AdminTenantController = AdminTenantController = __decorate([
|
|
|
104
111
|
(0, common_1.Controller)('api/admin/tenants'),
|
|
105
112
|
__metadata("design:paramtypes", [admin_access_service_1.AdminAccessService,
|
|
106
113
|
sql_service_1.SqlService,
|
|
107
|
-
|
|
108
|
-
system_property_service_1.SystemPropertyService])
|
|
114
|
+
tenant_onboarded_mail_job_1.TenantOnboardedMailJob])
|
|
109
115
|
], AdminTenantController);
|
|
110
116
|
//# sourceMappingURL=admin.tenant.controller.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin.tenant.controller.js","sourceRoot":"","sources":["../../../src/admin/controllers/admin.tenant.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAOwB;AACxB,6CAAuE;AACvE,mEAA+D;AAC/D,2EAAsE;AACtE,2EAAsE;AACtE,8EAAyE;AACzE,kFAA6E;AAC7E,8EAAyE;AACzE,2DAAsD;AACtD,6DAAwD;AACxD,
|
|
1
|
+
{"version":3,"file":"admin.tenant.controller.js","sourceRoot":"","sources":["../../../src/admin/controllers/admin.tenant.controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,16 +5,14 @@ import { AddClientUserDto } from '../dtos/add.client.user.dto';
|
|
|
5
5
|
import { ClientUserListDto } from '../dtos/client.user.list.dto';
|
|
6
6
|
import { AdminAccessService } from '../services/admin.access.service';
|
|
7
7
|
import { TenantService } from '../../tenant/services/tenant.service';
|
|
8
|
-
import {
|
|
9
|
-
import { SystemPropertyService } from '../../common/services/system.property.service';
|
|
8
|
+
import { TenantUserOnboardedMailJob } from '../../notification/jobs/tenant.user.onboarded.mail.job';
|
|
10
9
|
import { SqlService } from '../../common/services/sql.service';
|
|
11
10
|
export declare class AdminTenantUserController {
|
|
12
11
|
protected readonly adminAccessService: AdminAccessService;
|
|
13
12
|
protected readonly tenantService: TenantService;
|
|
14
|
-
protected readonly
|
|
15
|
-
protected readonly systemPropertyService: SystemPropertyService;
|
|
13
|
+
protected readonly tenantUserOnboardedMailJob: TenantUserOnboardedMailJob;
|
|
16
14
|
protected readonly sqlService: SqlService;
|
|
17
|
-
constructor(adminAccessService: AdminAccessService, tenantService: TenantService,
|
|
15
|
+
constructor(adminAccessService: AdminAccessService, tenantService: TenantService, tenantUserOnboardedMailJob: TenantUserOnboardedMailJob, sqlService: SqlService);
|
|
18
16
|
clientUserDetail({ id }: CommonParamsDto): Promise<UserEntity>;
|
|
19
17
|
addClientUser(dto: AddClientUserDto): Promise<UserEntity>;
|
|
20
18
|
addClientUsersBulk(dto: AddBulkUsersDto): Promise<import("../types/admin.types").BulkUserResult>;
|
|
@@ -25,6 +23,6 @@ export declare class AdminTenantUserController {
|
|
|
25
23
|
limit: number;
|
|
26
24
|
total_pages: number;
|
|
27
25
|
}>;
|
|
28
|
-
removeClientUser(id: string): Promise<import("
|
|
26
|
+
removeClientUser(id: string): Promise<import("../..").DeleteResult>;
|
|
29
27
|
}
|
|
30
28
|
//# sourceMappingURL=admin.tenant.user.controller.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin.tenant.user.controller.d.ts","sourceRoot":"","sources":["../../../src/admin/controllers/admin.tenant.user.controller.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAE7D,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAKjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AACrE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"admin.tenant.user.controller.d.ts","sourceRoot":"","sources":["../../../src/admin/controllers/admin.tenant.user.controller.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAE7D,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAKjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AACrE,OAAO,EAAE,0BAA0B,EAAE,MAAM,wDAAwD,CAAC;AACpG,OAAO,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAE/D,qBACa,yBAAyB;IAElC,SAAS,CAAC,QAAQ,CAAC,kBAAkB,EAAE,kBAAkB;IACzD,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,aAAa;IAC/C,SAAS,CAAC,QAAQ,CAAC,0BAA0B,EAAE,0BAA0B;IACzE,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,UAAU;gBAHtB,kBAAkB,EAAE,kBAAkB,EACtC,aAAa,EAAE,aAAa,EAC5B,0BAA0B,EAAE,0BAA0B,EACtD,UAAU,EAAE,UAAU;IASrC,gBAAgB,CAAU,EAAE,EAAE,EAAE,EAAE,eAAe;IAiBjD,aAAa,CAAS,GAAG,EAAE,gBAAgB;IAa3C,kBAAkB,CAAS,GAAG,EAAE,eAAe;IAW/C,eAAe,CAAS,GAAG,EAAE,iBAAiB;;;;;;;IAW9C,gBAAgB,CAA6B,EAAE,EAAE,MAAM;CAI9D"}
|