@neohm/nestend 2.0.4 → 3.0.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 +77 -28
- package/dist/admin/controllers/admin.user.controller.d.ts +1 -1
- package/dist/admin/controllers/admin.user.controller.js +4 -4
- package/dist/admin/controllers/admin.user.controller.js.map +1 -1
- package/dist/admin/dtos/add.admin.user.dto.d.ts +6 -2
- package/dist/admin/dtos/add.admin.user.dto.d.ts.map +1 -1
- package/dist/admin/dtos/add.admin.user.dto.js +33 -3
- package/dist/admin/dtos/add.admin.user.dto.js.map +1 -1
- package/dist/admin/dtos/base.user.dto.d.ts +0 -1
- package/dist/admin/dtos/base.user.dto.d.ts.map +1 -1
- package/dist/admin/dtos/base.user.dto.js +0 -11
- package/dist/admin/dtos/base.user.dto.js.map +1 -1
- package/dist/admin/es6.classes.d.ts +2 -1
- package/dist/admin/es6.classes.d.ts.map +1 -1
- package/dist/admin/es6.classes.js +24 -3
- package/dist/admin/es6.classes.js.map +1 -1
- package/dist/admin/libraries/admin.user.data.processor.d.ts +11 -4
- package/dist/admin/libraries/admin.user.data.processor.d.ts.map +1 -1
- package/dist/admin/libraries/admin.user.data.processor.js +55 -17
- package/dist/admin/libraries/admin.user.data.processor.js.map +1 -1
- package/dist/admin/libraries/bulk.user.data.processor.d.ts +1 -1
- package/dist/admin/libraries/bulk.user.data.processor.d.ts.map +1 -1
- package/dist/admin/libraries/bulk.user.data.processor.js +2 -13
- package/dist/admin/libraries/bulk.user.data.processor.js.map +1 -1
- package/dist/admin/libraries/client.user.data.processor.d.ts +1 -1
- package/dist/admin/libraries/client.user.data.processor.d.ts.map +1 -1
- package/dist/admin/libraries/client.user.data.processor.js +2 -6
- package/dist/admin/libraries/client.user.data.processor.js.map +1 -1
- package/dist/admin/libraries/scheduled.task.data.processor.d.ts +3 -3
- package/dist/admin/libraries/scheduled.task.data.processor.d.ts.map +1 -1
- package/dist/admin/libraries/scheduled.task.data.processor.js.map +1 -1
- package/dist/admin/libraries/tenant.data.processor.d.ts +2 -2
- package/dist/admin/libraries/tenant.data.processor.d.ts.map +1 -1
- package/dist/admin/libraries/tenant.data.processor.js.map +1 -1
- package/dist/admin/libraries/user.data.processor.d.ts +0 -11
- package/dist/admin/libraries/user.data.processor.d.ts.map +1 -1
- package/dist/admin/libraries/user.data.processor.js +0 -44
- package/dist/admin/libraries/user.data.processor.js.map +1 -1
- package/dist/admin/services/admin.access.service.d.ts +8 -8
- package/dist/admin/services/admin.access.service.d.ts.map +1 -1
- package/dist/admin/services/admin.access.service.js +8 -8
- package/dist/admin/services/admin.access.service.js.map +1 -1
- package/dist/auth/auth.module.d.ts.map +1 -1
- package/dist/auth/auth.module.js +17 -5
- package/dist/auth/auth.module.js.map +1 -1
- package/dist/auth/controllers/admin.auth.controller.d.ts +20 -0
- package/dist/auth/controllers/admin.auth.controller.d.ts.map +1 -0
- package/dist/auth/controllers/admin.auth.controller.js +95 -0
- package/dist/auth/controllers/admin.auth.controller.js.map +1 -0
- package/dist/auth/controllers/auth.controller.d.ts.map +1 -1
- package/dist/auth/controllers/auth.controller.js +7 -4
- package/dist/auth/controllers/auth.controller.js.map +1 -1
- package/dist/auth/dtos/admin.login.dto.d.ts +5 -0
- package/dist/auth/dtos/admin.login.dto.d.ts.map +1 -0
- package/dist/auth/dtos/admin.login.dto.js +30 -0
- package/dist/auth/dtos/admin.login.dto.js.map +1 -0
- package/dist/auth/entities/admin.user.entity.d.ts +11 -0
- package/dist/auth/entities/admin.user.entity.d.ts.map +1 -0
- package/dist/auth/entities/admin.user.entity.js +47 -0
- package/dist/auth/entities/admin.user.entity.js.map +1 -0
- package/dist/auth/entities/api.key.entity.d.ts +2 -2
- package/dist/auth/entities/api.key.entity.d.ts.map +1 -1
- package/dist/auth/entities/api.key.entity.js +2 -2
- package/dist/auth/entities/api.key.entity.js.map +1 -1
- package/dist/auth/entities/api.scope.entity.d.ts +13 -0
- package/dist/auth/entities/api.scope.entity.d.ts.map +1 -0
- package/dist/auth/entities/api.scope.entity.js +51 -0
- package/dist/auth/entities/api.scope.entity.js.map +1 -0
- package/dist/auth/entities/scope.entity.d.ts +7 -0
- package/dist/auth/entities/scope.entity.d.ts.map +1 -0
- package/dist/auth/entities/scope.entity.js +34 -0
- package/dist/auth/entities/scope.entity.js.map +1 -0
- package/dist/auth/entities/system.admin.role.entity.d.ts +11 -0
- package/dist/auth/entities/system.admin.role.entity.d.ts.map +1 -0
- package/dist/auth/entities/system.admin.role.entity.js +46 -0
- package/dist/auth/entities/system.admin.role.entity.js.map +1 -0
- package/dist/auth/entities/system.admin.user.role.entity.d.ts +10 -0
- package/dist/auth/entities/system.admin.user.role.entity.d.ts.map +1 -0
- package/dist/auth/entities/system.admin.user.role.entity.js +41 -0
- package/dist/auth/entities/system.admin.user.role.entity.js.map +1 -0
- package/dist/auth/entities/system.auth.session.entity.d.ts +9 -0
- package/dist/auth/entities/system.auth.session.entity.d.ts.map +1 -0
- package/dist/auth/entities/system.auth.session.entity.js +42 -0
- package/dist/auth/entities/system.auth.session.entity.js.map +1 -0
- package/dist/auth/entities/system.refresh.token.entity.d.ts +1 -0
- package/dist/auth/entities/system.refresh.token.entity.d.ts.map +1 -1
- package/dist/auth/entities/system.refresh.token.entity.js +4 -0
- package/dist/auth/entities/system.refresh.token.entity.js.map +1 -1
- package/dist/auth/entities/system.role.entity.d.ts +3 -4
- package/dist/auth/entities/system.role.entity.d.ts.map +1 -1
- package/dist/auth/entities/system.role.entity.js +5 -8
- package/dist/auth/entities/system.role.entity.js.map +1 -1
- package/dist/auth/es6.classes.d.ts +6 -4
- package/dist/auth/es6.classes.d.ts.map +1 -1
- package/dist/auth/es6.classes.js +32 -6
- package/dist/auth/es6.classes.js.map +1 -1
- package/dist/auth/helpers/admin.auth.d.ts +6 -0
- package/dist/auth/helpers/admin.auth.d.ts.map +1 -0
- package/dist/auth/helpers/admin.auth.js +29 -0
- package/dist/auth/helpers/admin.auth.js.map +1 -0
- package/dist/auth/helpers/api.key.context.d.ts +6 -0
- package/dist/auth/helpers/api.key.context.d.ts.map +1 -0
- package/dist/auth/helpers/api.key.context.js +15 -0
- package/dist/auth/helpers/api.key.context.js.map +1 -0
- package/dist/auth/helpers/auth.d.ts +6 -0
- package/dist/auth/helpers/auth.d.ts.map +1 -0
- package/dist/auth/helpers/auth.js +27 -0
- package/dist/auth/helpers/auth.js.map +1 -0
- package/dist/auth/middlewares/admin.jwt.middleware.d.ts +10 -0
- package/dist/auth/middlewares/admin.jwt.middleware.d.ts.map +1 -0
- package/dist/auth/middlewares/admin.jwt.middleware.js +59 -0
- package/dist/auth/middlewares/admin.jwt.middleware.js.map +1 -0
- package/dist/auth/middlewares/api.key.middleware.d.ts +10 -0
- package/dist/auth/middlewares/api.key.middleware.d.ts.map +1 -0
- package/dist/auth/middlewares/api.key.middleware.js +47 -0
- package/dist/auth/middlewares/api.key.middleware.js.map +1 -0
- package/dist/auth/middlewares/jwt.middleware.d.ts +10 -0
- package/dist/auth/middlewares/jwt.middleware.d.ts.map +1 -0
- package/dist/auth/middlewares/jwt.middleware.js +59 -0
- package/dist/auth/middlewares/jwt.middleware.js.map +1 -0
- package/dist/auth/services/admin.auth.service.d.ts +19 -0
- package/dist/auth/services/admin.auth.service.d.ts.map +1 -0
- package/dist/auth/services/admin.auth.service.js +160 -0
- package/dist/auth/services/admin.auth.service.js.map +1 -0
- package/dist/auth/services/auth.service.d.ts +4 -5
- package/dist/auth/services/auth.service.d.ts.map +1 -1
- package/dist/auth/services/auth.service.js +41 -35
- package/dist/auth/services/auth.service.js.map +1 -1
- package/dist/auth/types/auth.types.d.ts +7 -4
- package/dist/auth/types/auth.types.d.ts.map +1 -1
- package/dist/common/consumers/job.consumer.d.ts +1 -0
- package/dist/common/consumers/job.consumer.d.ts.map +1 -1
- package/dist/common/consumers/job.consumer.js +7 -2
- package/dist/common/consumers/job.consumer.js.map +1 -1
- package/dist/common/controllers/common.controller.js +1 -1
- package/dist/common/controllers/common.controller.js.map +1 -1
- package/dist/common/entities/common.admin.entity.d.ts +7 -0
- package/dist/common/entities/common.admin.entity.d.ts.map +1 -0
- package/dist/common/entities/common.admin.entity.js +28 -0
- package/dist/common/entities/common.admin.entity.js.map +1 -0
- package/dist/common/entities/root.entity.d.ts.map +1 -1
- package/dist/common/entities/root.entity.js +11 -2
- package/dist/common/entities/root.entity.js.map +1 -1
- package/dist/constants/entity.constants.d.ts +6 -0
- package/dist/constants/entity.constants.d.ts.map +1 -1
- package/dist/constants/entity.constants.js +6 -0
- package/dist/constants/entity.constants.js.map +1 -1
- package/dist/constants/entity.maps.d.ts +12 -0
- package/dist/constants/entity.maps.d.ts.map +1 -1
- package/dist/constants/entity.maps.js +12 -0
- package/dist/constants/entity.maps.js.map +1 -1
- package/dist/global/filters/global.exception.filter.d.ts.map +1 -1
- package/dist/global/filters/global.exception.filter.js +6 -2
- package/dist/global/filters/global.exception.filter.js.map +1 -1
- package/dist/global/utilities/migration.utility.d.ts +4 -0
- package/dist/global/utilities/migration.utility.d.ts.map +1 -1
- package/dist/global/utilities/migration.utility.js +70 -8
- package/dist/global/utilities/migration.utility.js.map +1 -1
- package/dist/index.d.ts +26 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +55 -8
- package/dist/index.js.map +1 -1
- package/dist/migrations/1749600000003.CreateSysRolesTable.d.ts.map +1 -1
- package/dist/migrations/1749600000003.CreateSysRolesTable.js +3 -4
- package/dist/migrations/1749600000003.CreateSysRolesTable.js.map +1 -1
- package/dist/migrations/1749600000021.CreateSysAdminUsersTable.d.ts +6 -0
- package/dist/migrations/1749600000021.CreateSysAdminUsersTable.d.ts.map +1 -0
- package/dist/migrations/1749600000021.CreateSysAdminUsersTable.js +23 -0
- package/dist/migrations/1749600000021.CreateSysAdminUsersTable.js.map +1 -0
- package/dist/migrations/1749600000022.CreateSysAdminRolesTable.d.ts +6 -0
- package/dist/migrations/1749600000022.CreateSysAdminRolesTable.d.ts.map +1 -0
- package/dist/migrations/1749600000022.CreateSysAdminRolesTable.js +21 -0
- package/dist/migrations/1749600000022.CreateSysAdminRolesTable.js.map +1 -0
- package/dist/migrations/1749600000023.CreateSysAdminUserRolesJoinTable.d.ts +6 -0
- package/dist/migrations/1749600000023.CreateSysAdminUserRolesJoinTable.d.ts.map +1 -0
- package/dist/migrations/1749600000023.CreateSysAdminUserRolesJoinTable.js +34 -0
- package/dist/migrations/1749600000023.CreateSysAdminUserRolesJoinTable.js.map +1 -0
- package/dist/migrations/1749600000024.CreateSysAuthSessionsTable.d.ts +6 -0
- package/dist/migrations/1749600000024.CreateSysAuthSessionsTable.d.ts.map +1 -0
- package/dist/migrations/1749600000024.CreateSysAuthSessionsTable.js +22 -0
- package/dist/migrations/1749600000024.CreateSysAuthSessionsTable.js.map +1 -0
- package/dist/migrations/1749600000025.CreateSysScopesTable.d.ts +6 -0
- package/dist/migrations/1749600000025.CreateSysScopesTable.d.ts.map +1 -0
- package/dist/migrations/1749600000025.CreateSysScopesTable.js +25 -0
- package/dist/migrations/1749600000025.CreateSysScopesTable.js.map +1 -0
- package/dist/migrations/1749600000026.CreateSysApiScopesTable.d.ts +6 -0
- package/dist/migrations/1749600000026.CreateSysApiScopesTable.d.ts.map +1 -0
- package/dist/migrations/1749600000026.CreateSysApiScopesTable.js +39 -0
- package/dist/migrations/1749600000026.CreateSysApiScopesTable.js.map +1 -0
- package/dist/migrations/1749600000027.RetargetSysApiKeysCreatedByToAdminUsers.d.ts +8 -0
- package/dist/migrations/1749600000027.RetargetSysApiKeysCreatedByToAdminUsers.d.ts.map +1 -0
- package/dist/migrations/1749600000027.RetargetSysApiKeysCreatedByToAdminUsers.js +31 -0
- package/dist/migrations/1749600000027.RetargetSysApiKeysCreatedByToAdminUsers.js.map +1 -0
- package/dist/migrations/1749600000028.RetargetSysTenantsCreatedByToAdminUsers.d.ts +8 -0
- package/dist/migrations/1749600000028.RetargetSysTenantsCreatedByToAdminUsers.d.ts.map +1 -0
- package/dist/migrations/1749600000028.RetargetSysTenantsCreatedByToAdminUsers.js +31 -0
- package/dist/migrations/1749600000028.RetargetSysTenantsCreatedByToAdminUsers.js.map +1 -0
- package/dist/migrations/1749600000029.AddIsAdminToSysRefreshTokensTable.d.ts +7 -0
- package/dist/migrations/1749600000029.AddIsAdminToSysRefreshTokensTable.d.ts.map +1 -0
- package/dist/migrations/1749600000029.AddIsAdminToSysRefreshTokensTable.js +31 -0
- package/dist/migrations/1749600000029.AddIsAdminToSysRefreshTokensTable.js.map +1 -0
- package/dist/tenant/entities/tenant.entity.d.ts +2 -3
- package/dist/tenant/entities/tenant.entity.d.ts.map +1 -1
- package/dist/tenant/entities/tenant.entity.js +2 -6
- package/dist/tenant/entities/tenant.entity.js.map +1 -1
- package/package.json +1 -1
- package/dist/auth/middlewares/auth.context.middleware.d.ts +0 -10
- package/dist/auth/middlewares/auth.context.middleware.d.ts.map +0 -1
- package/dist/auth/middlewares/auth.context.middleware.js +0 -37
- package/dist/auth/middlewares/auth.context.middleware.js.map +0 -1
- package/dist/auth/services/auth.context.service.d.ts +0 -9
- package/dist/auth/services/auth.context.service.d.ts.map +0 -1
- package/dist/auth/services/auth.context.service.js +0 -33
- package/dist/auth/services/auth.context.service.js.map +0 -1
package/README.md
CHANGED
|
@@ -84,14 +84,15 @@ app.useGlobalInterceptors(
|
|
|
84
84
|
|
|
85
85
|
| Area | Key exports | Notes |
|
|
86
86
|
| ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
87
|
-
| Entities | `RootEntity`, `CommonEntity`, `UserEntity`, `SystemRoleEntity`, ...
|
|
88
|
-
| Migrations | `CreateSysUsersTable...` (
|
|
87
|
+
| Entities | `RootEntity`, `CommonEntity`, `CommonAdminEntity`, `UserEntity`, `AdminUserEntity`, `SystemRoleEntity`, `SystemAdminRoleEntity`, ... | uuid PK, soft deletes, `created_by`, jsonb `attributes`; entity-level `findOneOrNew`, `softDelete`, `hardDelete`, `restore`, `paginate` statics |
|
|
88
|
+
| Migrations | `CreateSysUsersTable...` (29 files), `MigrationUtility`, `SeederUtility` | fluent `this.string()`, `this.numeric()`, `addRecord()` seeding |
|
|
89
89
|
| Queue | `QueueModule`, `QueueService`, `CommonJob`, `JobConsumer` | BullMQ `@Processor`/`WorkerHost` consumer; auto-discovered jobs, duplicate prevention, recurring schedulers, 1-day TTL, retries, failures persisted to `sys_failed_jobs` |
|
|
90
90
|
| Scheduled events | `SystemScheduledTaskEntity`, `ScheduledEventEntity`, `SetScheduledEventJob`, `DispatchScheduledEventJob` | schedule definitions in `sys_scheduled_tasks` → events in `sys_scheduled_events`; worker-driven materialisation + dispatch via `SCHEDULED_EVENT_*` env |
|
|
91
|
-
| Auth | `AuthModule`, `AuthService.
|
|
92
|
-
|
|
|
93
|
-
|
|
|
94
|
-
|
|
|
91
|
+
| Auth | `AuthModule`, `AuthService.validateRole()`, `Auth`, `JwtMiddleware`, `GoogleAuthService` | 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` |
|
|
92
|
+
| Admin auth | `AdminAuthService.validateRole()`, `AdminAuth`, `AdminJwtMiddleware`, `AdminAuthController` (`/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) |
|
|
93
|
+
| API keys | `ApiKeyService`, `ApiKeyGuard` / `ApiKeyMiddleware`, `@ApiKeyScopes()`, `ScopeEntity`, `ApiScopeEntity` | hashed keys in `sys_api_keys` (admin-owned), scopes, expiry/revocation, `x-api-key` header; normalized scopes catalogue in `sys_scopes`/`sys_api_scopes` |
|
|
94
|
+
| Multi-tenancy | `TenantModule`, `TenantEntity`, `TenantCommonEntity`, `TenantContextService`, `TenantContextMiddleware` | AsyncLocalStorage tenant context; resolve by header, slug, or domain; tenants are onboarded by admins (`TenantEntity.creator` → `AdminUserEntity`) |
|
|
95
|
+
| Admin | `AdminModule`, `AdminAccessService`, `TenantDataProcessor`, `ClientUserDataProcessor`, `BulkUserDataProcessor`, `AdminUserDataProcessor`, list processors | 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) |
|
|
95
96
|
| Notifications | `NotificationModule`, `NotificationService`, `FcmPushNotificationService` | in-app rows + FCM push (optional `firebase-admin`); device token registry |
|
|
96
97
|
| Email (SES) | `EmailNotificationService`, `ProcessEmailNotification`, `EmailTemplateEntity`, `EmailNotificationLogEntity` | templates in `sys_email_templates` rendered by a remote service, dispatched via SES per recipient (to/cc/bcc); logged to `sys_email_notification_logs` outside production; dispatch skipped when `AWS_SES_FROM_ADDRESS` unset |
|
|
97
98
|
| Audit | `AuditService` | `saveAuditLog(old, new)` with changed-value diffing into `sys_audit_logs` |
|
|
@@ -156,16 +157,23 @@ queries to the primary.
|
|
|
156
157
|
#### Authentication (imperative)
|
|
157
158
|
|
|
158
159
|
Controllers are **open by default**; you authenticate explicitly inside the
|
|
159
|
-
handler with `AuthService.
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
`
|
|
163
|
-
|
|
160
|
+
handler with `AuthService.validateRole()`. It reads the current user from
|
|
161
|
+
`Auth`'s `AsyncLocalStorage` context — populated once per request by
|
|
162
|
+
`JwtMiddleware`, which verifies the bearer token and checks that its session
|
|
163
|
+
(`sys_auth_sessions`) hasn't been invalidated (logout) or expired — and returns
|
|
164
|
+
the user row with its roles, throwing `AccessException` (403) when there's no
|
|
165
|
+
active session. Pass a role identifier to gate on a specific role:
|
|
166
|
+
`validateRole('tenant.editor')`. This keeps authorization next to your business
|
|
167
|
+
logic, so layering tenant/plan/role checks is just more code.
|
|
164
168
|
|
|
165
169
|
`AuthController` (mounted at `/auth`) exposes the ready-made flows: `POST
|
|
166
170
|
/auth/login`, `/auth/google`, `/auth/register`, `/auth/refresh`, `/auth/logout`,
|
|
167
171
|
`/auth/change-password`, and `GET /auth/me`. Passwords are hashed/verified via
|
|
168
|
-
`AuthUtility` (bcrypt); the write flows use the processor lifecycle.
|
|
172
|
+
`AuthUtility` (bcrypt); the write flows use the processor lifecycle. Every
|
|
173
|
+
`issueTokens()` call (login or refresh) creates a fresh `sys_auth_sessions` row
|
|
174
|
+
and embeds its identifier in the access token as `sid`; `logout()` revokes the
|
|
175
|
+
refresh token and invalidates that session, so a still-unexpired access token
|
|
176
|
+
stops working immediately.
|
|
169
177
|
|
|
170
178
|
**Google SSO** — the client posts a Google ID token as `{ id_token }` to
|
|
171
179
|
`POST /auth/google`. `GoogleAuthService` verifies it against Google's tokeninfo
|
|
@@ -181,27 +189,54 @@ export class ReportController {
|
|
|
181
189
|
|
|
182
190
|
@Get()
|
|
183
191
|
async list() {
|
|
184
|
-
const { user, roles } = await this.authService.
|
|
192
|
+
const { user, roles } = await this.authService.validateRole();
|
|
185
193
|
// ...custom checks: roles, tenant membership, subscription, ownership
|
|
186
194
|
}
|
|
187
195
|
}
|
|
188
196
|
```
|
|
189
197
|
|
|
190
|
-
Wire the middleware once in your app so the
|
|
198
|
+
Wire the middleware once in your app so the user is resolved per request
|
|
191
199
|
(mirrors `TenantContextMiddleware`):
|
|
192
200
|
|
|
193
201
|
```ts
|
|
194
202
|
export class AppModule implements NestModule {
|
|
195
203
|
configure(consumer: MiddlewareConsumer) {
|
|
196
|
-
consumer.apply(
|
|
204
|
+
consumer.apply(JwtMiddleware).forRoutes('*'); // Express 5: e.g. '{*splat}'
|
|
197
205
|
}
|
|
198
206
|
}
|
|
199
207
|
```
|
|
200
208
|
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
default path
|
|
209
|
+
Read the current user anywhere without going through `AuthService` via the
|
|
210
|
+
`Auth` static class: `Auth.user()` / `Auth.session()`. The Passport
|
|
211
|
+
`JwtStrategy`/`JwtAuthGuard` remain available if you prefer guard-based
|
|
212
|
+
protection on specific routes, but they're no longer the default path, and
|
|
213
|
+
they aren't wired to `sys_auth_sessions` invalidation.
|
|
214
|
+
|
|
215
|
+
#### Admin authentication (separate stack)
|
|
216
|
+
|
|
217
|
+
Back-office admins are a **fully separate principal** from tenant users — own
|
|
218
|
+
table (`sys_admin_users`), own roles (`sys_admin_roles`/`sys_auser_roles`), own
|
|
219
|
+
context helper (`AdminAuth`), own middleware (`AdminJwtMiddleware`), own service
|
|
220
|
+
(`AdminAuthService`), mirroring everything above:
|
|
221
|
+
|
|
222
|
+
```ts
|
|
223
|
+
export class AppModule implements NestModule {
|
|
224
|
+
configure(consumer: MiddlewareConsumer) {
|
|
225
|
+
consumer.apply(JwtMiddleware).forRoutes('*');
|
|
226
|
+
consumer.apply(AdminJwtMiddleware).forRoutes('admin/*');
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
`AdminAuthController` (mounted at `/admin/auth`) exposes `POST login` (body:
|
|
232
|
+
`email_or_username`, `password`), `POST refresh`, `POST logout`, `GET me`.
|
|
233
|
+
`AdminAccessService` (used by the back-office admin APIs, see
|
|
234
|
+
[Admin Module](#admin-module)) is built on `AdminAuthService.validateRole()` and gates
|
|
235
|
+
against the `GlobalAdminRoles` hierarchy stored in
|
|
236
|
+
`sys_admin_roles.identifier`. Admins **cannot** grant `sys_roles` to tenant
|
|
237
|
+
users — that's a planned tenant-side self-service feature, not yet built; an
|
|
238
|
+
admin with the `admin` role can grant `sys_admin_roles` to other admins via
|
|
239
|
+
`POST /admin/users/admins`.
|
|
205
240
|
|
|
206
241
|
### Encryption
|
|
207
242
|
|
|
@@ -522,19 +557,21 @@ processor.
|
|
|
522
557
|
### Roles
|
|
523
558
|
|
|
524
559
|
Global roles (`GlobalAdminRoles`) are ordered by seniority — a senior role
|
|
525
|
-
satisfies any junior requirement
|
|
560
|
+
satisfies any junior requirement. They're held by admins only
|
|
561
|
+
(`sys_admin_users`, via `sys_auser_roles`) — never by tenant users:
|
|
526
562
|
|
|
527
|
-
| Role (`
|
|
528
|
-
|
|
|
563
|
+
| Role (`sys_admin_roles.identifier`) | Capability |
|
|
564
|
+
| ------------------------------------ | ---------------------------------------------------- |
|
|
529
565
|
| `global.super.admin` | View/change/delete everything, including tenant info |
|
|
530
566
|
| `global.admin` | Tenant listing and admin-user management |
|
|
531
567
|
| `global.content.manager` | View/change/edit everything except tenant info |
|
|
532
568
|
| `global.content.reader` | Read-only access to non-tenant content |
|
|
533
569
|
|
|
534
570
|
`AdminAccessService` exposes `validateSuperAdmin()`, `validateAdmin()`,
|
|
535
|
-
`validateContentManager()` and `validateContentReader()`. Each authenticates
|
|
536
|
-
caller and returns `{ user, roles }`
|
|
537
|
-
|
|
571
|
+
`validateContentManager()` and `validateContentReader()`. Each authenticates
|
|
572
|
+
the caller via `AdminAuthService.validateRole()` and returns `{ user, roles }`
|
|
573
|
+
(an `AdminUserEntity` plus its `SystemAdminRoleEntity[]`) so the controller can
|
|
574
|
+
pass the actor to a processor.
|
|
538
575
|
|
|
539
576
|
### Endpoints
|
|
540
577
|
|
|
@@ -551,6 +588,10 @@ processor.
|
|
|
551
588
|
List endpoints are `POST .../list` with the filter payload in the body (a
|
|
552
589
|
`CommonListFilterDto`) — see [List Endpoints & Filtering](#list-endpoints--filtering).
|
|
553
590
|
|
|
591
|
+
Auth endpoints for admins themselves (`login`, `refresh`, `logout`, `me`) live
|
|
592
|
+
at `/admin/auth` (`AdminAuthController`) — see
|
|
593
|
+
[Admin authentication](#admin-authentication-separate-stack) — not in this module.
|
|
594
|
+
|
|
554
595
|
### Flow
|
|
555
596
|
|
|
556
597
|
```ts
|
|
@@ -562,10 +603,18 @@ async onboard(@Body() dto: AddTenantDto) {
|
|
|
562
603
|
```
|
|
563
604
|
|
|
564
605
|
Data processors extend `CommonDataProcessor` and are created per request
|
|
565
|
-
(`new XxxDataProcessor(
|
|
606
|
+
(`new XxxDataProcessor(...deps).process(dto)`); list processors return a
|
|
566
607
|
`PaginatedResult`. Bulk registration validates the entire batch before any insert.
|
|
567
|
-
|
|
568
|
-
|
|
608
|
+
|
|
609
|
+
Admins (`sys_admin_users`) and client users (`sys_users`) are **entirely
|
|
610
|
+
separate tables**, not a discriminator on a shared one.
|
|
611
|
+
`ClientUserDataProcessor`/`BulkUserDataProcessor` create `sys_users` rows with
|
|
612
|
+
**no role granting** — an admin creating a client user cannot also grant it
|
|
613
|
+
`sys_roles`, since `sys_user_roles.created_by` references `sys_users` only and
|
|
614
|
+
an admin has no row there. Tenant users granting roles to other tenant users
|
|
615
|
+
is a planned self-service feature, not yet built. `AdminUserDataProcessor`
|
|
616
|
+
creates `sys_admin_users` rows and grants `sys_admin_roles` via
|
|
617
|
+
`sys_auser_roles`.
|
|
569
618
|
|
|
570
619
|
### API docs (Swagger)
|
|
571
620
|
|
|
@@ -9,6 +9,6 @@ export declare class AdminUserController {
|
|
|
9
9
|
constructor(adminAccessService: AdminAccessService, tenantService: TenantService);
|
|
10
10
|
addClientUser(dto: AddClientUserDto): Promise<import("../..").UserEntity>;
|
|
11
11
|
addClientUsersBulk(dto: AddBulkUsersDto): Promise<import("../libraries/bulk.user.data.processor").BulkUserResult>;
|
|
12
|
-
addAdminUser(dto: AddAdminUserDto): Promise<import("../..").
|
|
12
|
+
addAdminUser(dto: AddAdminUserDto): Promise<import("../..").AdminUserEntity>;
|
|
13
13
|
}
|
|
14
14
|
//# sourceMappingURL=admin.user.controller.d.ts.map
|
|
@@ -29,12 +29,12 @@ let AdminUserController = class AdminUserController {
|
|
|
29
29
|
this.tenantService = tenantService;
|
|
30
30
|
}
|
|
31
31
|
async addClientUser(dto) {
|
|
32
|
-
|
|
33
|
-
return new client_user_data_processor_1.ClientUserDataProcessor(
|
|
32
|
+
await this.adminAccessService.validateSuperAdmin();
|
|
33
|
+
return new client_user_data_processor_1.ClientUserDataProcessor(this.tenantService).process(dto);
|
|
34
34
|
}
|
|
35
35
|
async addClientUsersBulk(dto) {
|
|
36
|
-
|
|
37
|
-
return new bulk_user_data_processor_1.BulkUserDataProcessor(
|
|
36
|
+
await this.adminAccessService.validateSuperAdmin();
|
|
37
|
+
return new bulk_user_data_processor_1.BulkUserDataProcessor(this.tenantService).process(dto);
|
|
38
38
|
}
|
|
39
39
|
async addAdminUser(dto) {
|
|
40
40
|
const { user } = await this.adminAccessService.validateAdmin();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin.user.controller.js","sourceRoot":"","sources":["../../../src/admin/controllers/admin.user.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAwD;AACxD,6CAAuE;AACvE,yEAAqE;AACrE,2EAAsE;AACtE,wFAAkF;AAClF,oFAA8E;AAC9E,sFAAgF;AAChF,qEAA+D;AAC/D,mEAA6D;AAC7D,mEAA6D;AAKtD,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IAC9B,YACmB,kBAAsC,EACtC,aAA4B;QAD5B,uBAAkB,GAAlB,kBAAkB,CAAoB;QACtC,kBAAa,GAAb,aAAa,CAAe;IAC5C,CAAC;IAOE,AAAN,KAAK,CAAC,aAAa,CAAS,GAAqB;QAC/C,MAAM,
|
|
1
|
+
{"version":3,"file":"admin.user.controller.js","sourceRoot":"","sources":["../../../src/admin/controllers/admin.user.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAwD;AACxD,6CAAuE;AACvE,yEAAqE;AACrE,2EAAsE;AACtE,wFAAkF;AAClF,oFAA8E;AAC9E,sFAAgF;AAChF,qEAA+D;AAC/D,mEAA6D;AAC7D,mEAA6D;AAKtD,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IAC9B,YACmB,kBAAsC,EACtC,aAA4B;QAD5B,uBAAkB,GAAlB,kBAAkB,CAAoB;QACtC,kBAAa,GAAb,aAAa,CAAe;IAC5C,CAAC;IAOE,AAAN,KAAK,CAAC,aAAa,CAAS,GAAqB;QAC/C,MAAM,IAAI,CAAC,kBAAkB,CAAC,kBAAkB,EAAE,CAAC;QACnD,OAAO,IAAI,oDAAuB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACtE,CAAC;IAOK,AAAN,KAAK,CAAC,kBAAkB,CAAS,GAAoB;QACnD,MAAM,IAAI,CAAC,kBAAkB,CAAC,kBAAkB,EAAE,CAAC;QACnD,OAAO,IAAI,gDAAqB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACpE,CAAC;IAOK,AAAN,KAAK,CAAC,YAAY,CAAS,GAAoB;QAC7C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,aAAa,EAAE,CAAC;QAC/D,OAAO,IAAI,kDAAsB,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACvD,CAAC;CACF,CAAA;AAnCY,kDAAmB;AAWxB;IALL,IAAA,aAAI,EAAC,SAAS,CAAC;IACf,IAAA,sBAAY,EAAC;QACZ,OAAO,EAAE,gDAAgD;QACzD,WAAW,EAAE,uCAAuC;KACrD,CAAC;IACmB,WAAA,IAAA,aAAI,GAAE,CAAA;;qCAAM,sCAAgB;;wDAGhD;AAOK;IALL,IAAA,aAAI,EAAC,cAAc,CAAC;IACpB,IAAA,sBAAY,EAAC;QACZ,OAAO,EAAE,8CAA8C;QACvD,WAAW,EAAE,uCAAuC;KACrD,CAAC;IACwB,WAAA,IAAA,aAAI,GAAE,CAAA;;qCAAM,oCAAe;;6DAGpD;AAOK;IALL,IAAA,aAAI,EAAC,QAAQ,CAAC;IACd,IAAA,sBAAY,EAAC;QACZ,OAAO,EAAE,iCAAiC;QAC1C,WAAW,EAAE,0CAA0C;KACxD,CAAC;IACkB,WAAA,IAAA,aAAI,GAAE,CAAA;;qCAAM,oCAAe;;uDAG9C;8BAlCU,mBAAmB;IAH/B,IAAA,iBAAO,EAAC,eAAe,CAAC;IACxB,IAAA,uBAAa,GAAE;IACf,IAAA,mBAAU,EAAC,aAAa,CAAC;qCAGe,yCAAkB;QACvB,8BAAa;GAHpC,mBAAmB,CAmC/B"}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
export declare class AddAdminUserDto {
|
|
2
|
+
name: string;
|
|
3
|
+
email: string;
|
|
4
|
+
username: string;
|
|
5
|
+
password: string;
|
|
3
6
|
role_ids: string[];
|
|
7
|
+
attributes?: Record<string, any>;
|
|
4
8
|
}
|
|
5
9
|
//# sourceMappingURL=add.admin.user.dto.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.admin.user.dto.d.ts","sourceRoot":"","sources":["../../../src/admin/dtos/add.admin.user.dto.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"add.admin.user.dto.d.ts","sourceRoot":"","sources":["../../../src/admin/dtos/add.admin.user.dto.ts"],"names":[],"mappings":"AAcA,qBAAa,eAAe;IAI1B,IAAI,EAAE,MAAM,CAAC;IAKb,KAAK,EAAE,MAAM,CAAC;IAKd,QAAQ,EAAE,MAAM,CAAC;IAMjB,QAAQ,EAAE,MAAM,CAAC;IAUjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IAKnB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAClC"}
|
|
@@ -12,19 +12,49 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
12
12
|
exports.AddAdminUserDto = void 0;
|
|
13
13
|
const class_validator_1 = require("class-validator");
|
|
14
14
|
const swagger_1 = require("@nestjs/swagger");
|
|
15
|
-
|
|
16
|
-
class AddAdminUserDto extends base_user_dto_1.BaseUserDto {
|
|
15
|
+
class AddAdminUserDto {
|
|
17
16
|
}
|
|
18
17
|
exports.AddAdminUserDto = AddAdminUserDto;
|
|
18
|
+
__decorate([
|
|
19
|
+
(0, swagger_1.ApiProperty)({ example: 'Jane Doe' }),
|
|
20
|
+
(0, class_validator_1.IsString)(),
|
|
21
|
+
(0, class_validator_1.MaxLength)(255),
|
|
22
|
+
__metadata("design:type", String)
|
|
23
|
+
], AddAdminUserDto.prototype, "name", void 0);
|
|
24
|
+
__decorate([
|
|
25
|
+
(0, swagger_1.ApiProperty)({ example: 'jane@company.com' }),
|
|
26
|
+
(0, class_validator_1.IsEmail)(),
|
|
27
|
+
(0, class_validator_1.MaxLength)(255),
|
|
28
|
+
__metadata("design:type", String)
|
|
29
|
+
], AddAdminUserDto.prototype, "email", void 0);
|
|
30
|
+
__decorate([
|
|
31
|
+
(0, swagger_1.ApiProperty)({ example: 'jane.doe' }),
|
|
32
|
+
(0, class_validator_1.IsString)(),
|
|
33
|
+
(0, class_validator_1.MaxLength)(255),
|
|
34
|
+
__metadata("design:type", String)
|
|
35
|
+
], AddAdminUserDto.prototype, "username", void 0);
|
|
36
|
+
__decorate([
|
|
37
|
+
(0, swagger_1.ApiProperty)({ example: 'S3curePass!', minLength: 8 }),
|
|
38
|
+
(0, class_validator_1.IsString)(),
|
|
39
|
+
(0, class_validator_1.MinLength)(8),
|
|
40
|
+
(0, class_validator_1.MaxLength)(72),
|
|
41
|
+
__metadata("design:type", String)
|
|
42
|
+
], AddAdminUserDto.prototype, "password", void 0);
|
|
19
43
|
__decorate([
|
|
20
44
|
(0, swagger_1.ApiProperty)({
|
|
21
45
|
type: [String],
|
|
22
46
|
format: 'uuid',
|
|
23
|
-
description: '
|
|
47
|
+
description: 'sys_admin_roles UUIDs to grant the admin user.',
|
|
24
48
|
}),
|
|
25
49
|
(0, class_validator_1.IsArray)(),
|
|
26
50
|
(0, class_validator_1.ArrayMinSize)(1),
|
|
27
51
|
(0, class_validator_1.IsUUID)('all', { each: true }),
|
|
28
52
|
__metadata("design:type", Array)
|
|
29
53
|
], AddAdminUserDto.prototype, "role_ids", void 0);
|
|
54
|
+
__decorate([
|
|
55
|
+
(0, swagger_1.ApiPropertyOptional)({ type: 'object', additionalProperties: true }),
|
|
56
|
+
(0, class_validator_1.IsOptional)(),
|
|
57
|
+
(0, class_validator_1.IsObject)(),
|
|
58
|
+
__metadata("design:type", Object)
|
|
59
|
+
], AddAdminUserDto.prototype, "attributes", void 0);
|
|
30
60
|
//# sourceMappingURL=add.admin.user.dto.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.admin.user.dto.js","sourceRoot":"","sources":["../../../src/admin/dtos/add.admin.user.dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"add.admin.user.dto.js","sourceRoot":"","sources":["../../../src/admin/dtos/add.admin.user.dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qDAUyB;AACzB,6CAAmE;AAGnE,MAAa,eAAe;CAoC3B;AApCD,0CAoCC;AAhCC;IAHC,IAAA,qBAAW,EAAC,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;IACpC,IAAA,0BAAQ,GAAE;IACV,IAAA,2BAAS,EAAC,GAAG,CAAC;;6CACF;AAKb;IAHC,IAAA,qBAAW,EAAC,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC5C,IAAA,yBAAO,GAAE;IACT,IAAA,2BAAS,EAAC,GAAG,CAAC;;8CACD;AAKd;IAHC,IAAA,qBAAW,EAAC,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;IACpC,IAAA,0BAAQ,GAAE;IACV,IAAA,2BAAS,EAAC,GAAG,CAAC;;iDACE;AAMjB;IAJC,IAAA,qBAAW,EAAC,EAAE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IACrD,IAAA,0BAAQ,GAAE;IACV,IAAA,2BAAS,EAAC,CAAC,CAAC;IACZ,IAAA,2BAAS,EAAC,EAAE,CAAC;;iDACG;AAUjB;IARC,IAAA,qBAAW,EAAC;QACX,IAAI,EAAE,CAAC,MAAM,CAAC;QACd,MAAM,EAAE,MAAM;QACd,WAAW,EAAE,gDAAgD;KAC9D,CAAC;IACD,IAAA,yBAAO,GAAE;IACT,IAAA,8BAAY,EAAC,CAAC,CAAC;IACf,IAAA,wBAAM,EAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;;iDACX;AAKnB;IAHC,IAAA,6BAAmB,EAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAAC;IACnE,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,GAAE;;mDACsB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.user.dto.d.ts","sourceRoot":"","sources":["../../../src/admin/dtos/base.user.dto.ts"],"names":[],"mappings":"AAiBA,qBAAa,WAAW;IAItB,SAAS,EAAE,MAAM,CAAC;IAKlB,KAAK,EAAE,MAAM,CAAC;IAMd,QAAQ,EAAE,MAAM,CAAC;IAMjB,OAAO,CAAC,EAAE,MAAM,CAAC;IAMjB,YAAY,CAAC,EAAE,MAAM,CAAC;IAMtB,OAAO,CAAC,EAAE,MAAM,CAAC;IAKjB,MAAM,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"base.user.dto.d.ts","sourceRoot":"","sources":["../../../src/admin/dtos/base.user.dto.ts"],"names":[],"mappings":"AAiBA,qBAAa,WAAW;IAItB,SAAS,EAAE,MAAM,CAAC;IAKlB,KAAK,EAAE,MAAM,CAAC;IAMd,QAAQ,EAAE,MAAM,CAAC;IAMjB,OAAO,CAAC,EAAE,MAAM,CAAC;IAMjB,YAAY,CAAC,EAAE,MAAM,CAAC;IAMtB,OAAO,CAAC,EAAE,MAAM,CAAC;IAKjB,MAAM,CAAC,EAAE,OAAO,CAAC;IAKjB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAClC"}
|
|
@@ -61,17 +61,6 @@ __decorate([
|
|
|
61
61
|
(0, class_validator_1.IsBoolean)(),
|
|
62
62
|
__metadata("design:type", Boolean)
|
|
63
63
|
], BaseUserDto.prototype, "active", void 0);
|
|
64
|
-
__decorate([
|
|
65
|
-
(0, swagger_1.ApiPropertyOptional)({
|
|
66
|
-
type: [String],
|
|
67
|
-
format: 'uuid',
|
|
68
|
-
description: 'sys_roles UUIDs to grant the user.',
|
|
69
|
-
}),
|
|
70
|
-
(0, class_validator_1.IsOptional)(),
|
|
71
|
-
(0, class_validator_1.IsArray)(),
|
|
72
|
-
(0, class_validator_1.IsUUID)('all', { each: true }),
|
|
73
|
-
__metadata("design:type", Array)
|
|
74
|
-
], BaseUserDto.prototype, "role_ids", void 0);
|
|
75
64
|
__decorate([
|
|
76
65
|
(0, swagger_1.ApiPropertyOptional)({ type: 'object', additionalProperties: true }),
|
|
77
66
|
(0, class_validator_1.IsOptional)(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.user.dto.js","sourceRoot":"","sources":["../../../src/admin/dtos/base.user.dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"base.user.dto.js","sourceRoot":"","sources":["../../../src/admin/dtos/base.user.dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qDAQyB;AACzB,6CAAmE;AAQnE,MAAa,WAAW;CA4CvB;AA5CD,kCA4CC;AAxCC;IAHC,IAAA,qBAAW,EAAC,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;IACpC,IAAA,0BAAQ,GAAE;IACV,IAAA,2BAAS,EAAC,GAAG,CAAC;;8CACG;AAKlB;IAHC,IAAA,qBAAW,EAAC,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC;IACzC,IAAA,yBAAO,GAAE;IACT,IAAA,2BAAS,EAAC,GAAG,CAAC;;0CACD;AAMd;IAJC,IAAA,qBAAW,EAAC,EAAE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IACrD,IAAA,0BAAQ,GAAE;IACV,IAAA,2BAAS,EAAC,CAAC,CAAC;IACZ,IAAA,2BAAS,EAAC,EAAE,CAAC;;6CACG;AAMjB;IAJC,IAAA,6BAAmB,EAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACtC,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,GAAE;IACV,IAAA,2BAAS,EAAC,EAAE,CAAC;;4CACG;AAMjB;IAJC,IAAA,6BAAmB,EAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IACxC,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,GAAE;IACV,IAAA,2BAAS,EAAC,EAAE,CAAC;;iDACQ;AAMtB;IAJC,IAAA,6BAAmB,EAAC,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;IAC9C,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,GAAE;IACV,IAAA,2BAAS,EAAC,EAAE,CAAC;;4CACG;AAKjB;IAHC,IAAA,6BAAmB,EAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACtC,IAAA,4BAAU,GAAE;IACZ,IAAA,2BAAS,GAAE;;2CACK;AAKjB;IAHC,IAAA,6BAAmB,EAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAAC;IACnE,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,GAAE;;+CACsB"}
|
|
@@ -9,6 +9,7 @@ import { ScheduledTaskDataProcessor } from './libraries/scheduled.task.data.proc
|
|
|
9
9
|
import { ScheduledTaskListProcessor } from './libraries/scheduled.task.list.processor';
|
|
10
10
|
import { TenantDataProcessor } from './libraries/tenant.data.processor';
|
|
11
11
|
import { TenantListProcessor } from './libraries/tenant.list.processor';
|
|
12
|
+
import { AddAdminUserDto } from './dtos/add.admin.user.dto';
|
|
12
13
|
import { ScheduleIntervalDto } from './dtos/add.scheduled.task.dto';
|
|
13
14
|
import { AddTenantDto } from './dtos/add.tenant.dto';
|
|
14
15
|
import { BaseUserDto } from './dtos/base.user.dto';
|
|
@@ -17,7 +18,7 @@ export declare const es6Classes: {
|
|
|
17
18
|
controllers: (typeof AdminScheduledTaskController | typeof AdminTenantController | typeof AdminUserController)[];
|
|
18
19
|
services: readonly [typeof AdminAccessService];
|
|
19
20
|
libraries: (typeof ScheduledTaskDataProcessor | typeof ScheduledTaskListProcessor | typeof TenantDataProcessor | typeof TenantListProcessor | typeof ClientUserDataProcessor | typeof BulkUserDataProcessor | typeof AdminUserDataProcessor)[];
|
|
20
|
-
dtos: (typeof ScheduleIntervalDto | typeof ScheduledTaskListDto | typeof AddTenantDto | typeof BaseUserDto)[];
|
|
21
|
+
dtos: (typeof ScheduleIntervalDto | typeof ScheduledTaskListDto | typeof AddTenantDto | typeof BaseUserDto | typeof AddAdminUserDto)[];
|
|
21
22
|
jobs: any[];
|
|
22
23
|
subscribers: any[];
|
|
23
24
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"es6.classes.d.ts","sourceRoot":"","sources":["../../src/admin/es6.classes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,+CAA+C,CAAC;AAC7F,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AACjF,OAAO,EAAE,0BAA0B,EAAE,MAAM,2CAA2C,CAAC;AACvF,OAAO,EAAE,0BAA0B,EAAE,MAAM,2CAA2C,CAAC;AACvF,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"es6.classes.d.ts","sourceRoot":"","sources":["../../src/admin/es6.classes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,+CAA+C,CAAC;AAC7F,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AACjF,OAAO,EAAE,0BAA0B,EAAE,MAAM,2CAA2C,CAAC;AACvF,OAAO,EAAE,0BAA0B,EAAE,MAAM,2CAA2C,CAAC;AACvF,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAG5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAGtE,eAAO,MAAM,UAAU;;;;;;;CA4BtB,CAAC"}
|
|
@@ -21,10 +21,31 @@ const base_user_dto_1 = require("./dtos/base.user.dto");
|
|
|
21
21
|
const scheduled_task_list_dto_1 = require("./dtos/scheduled.task.list.dto");
|
|
22
22
|
const tenant_list_dto_1 = require("./dtos/tenant.list.dto");
|
|
23
23
|
exports.es6Classes = {
|
|
24
|
-
controllers: [
|
|
24
|
+
controllers: [
|
|
25
|
+
admin_scheduled_task_controller_1.AdminScheduledTaskController,
|
|
26
|
+
admin_tenant_controller_1.AdminTenantController,
|
|
27
|
+
admin_user_controller_1.AdminUserController,
|
|
28
|
+
],
|
|
25
29
|
services: [admin_access_service_1.AdminAccessService],
|
|
26
|
-
libraries: [
|
|
27
|
-
|
|
30
|
+
libraries: [
|
|
31
|
+
admin_user_data_processor_1.AdminUserDataProcessor,
|
|
32
|
+
bulk_user_data_processor_1.BulkUserDataProcessor,
|
|
33
|
+
client_user_data_processor_1.ClientUserDataProcessor,
|
|
34
|
+
scheduled_task_data_processor_1.ScheduledTaskDataProcessor,
|
|
35
|
+
scheduled_task_list_processor_1.ScheduledTaskListProcessor,
|
|
36
|
+
tenant_data_processor_1.TenantDataProcessor,
|
|
37
|
+
tenant_list_processor_1.TenantListProcessor,
|
|
38
|
+
],
|
|
39
|
+
dtos: [
|
|
40
|
+
add_admin_user_dto_1.AddAdminUserDto,
|
|
41
|
+
add_bulk_users_dto_1.BulkUserItemDto,
|
|
42
|
+
add_client_user_dto_1.AddClientUserDto,
|
|
43
|
+
add_scheduled_task_dto_1.ScheduleIntervalDto,
|
|
44
|
+
add_tenant_dto_1.AddTenantDto,
|
|
45
|
+
base_user_dto_1.BaseUserDto,
|
|
46
|
+
scheduled_task_list_dto_1.ScheduledTaskListDto,
|
|
47
|
+
tenant_list_dto_1.TenantListDto,
|
|
48
|
+
],
|
|
28
49
|
jobs: [],
|
|
29
50
|
subscribers: [],
|
|
30
51
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"es6.classes.js","sourceRoot":"","sources":["../../src/admin/es6.classes.ts"],"names":[],"mappings":";;;AAAA,mGAA6F;AAC7F,mFAA8E;AAC9E,+EAA0E;AAC1E,0EAAqE;AACrE,qFAA+E;AAC/E,mFAA6E;AAC7E,uFAAiF;AACjF,6FAAuF;AACvF,6FAAuF;AACvF,6EAAwE;AACxE,6EAAwE;AACxE,kEAA4D;AAC5D,kEAA4D;AAC5D,oEAA8D;AAC9D,0EAAoE;AACpE,0DAAqD;AACrD,wDAAmD;AACnD,4EAAsE;AACtE,4DAAuD;AAE1C,QAAA,UAAU,GAAG;IACxB,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"es6.classes.js","sourceRoot":"","sources":["../../src/admin/es6.classes.ts"],"names":[],"mappings":";;;AAAA,mGAA6F;AAC7F,mFAA8E;AAC9E,+EAA0E;AAC1E,0EAAqE;AACrE,qFAA+E;AAC/E,mFAA6E;AAC7E,uFAAiF;AACjF,6FAAuF;AACvF,6FAAuF;AACvF,6EAAwE;AACxE,6EAAwE;AACxE,kEAA4D;AAC5D,kEAA4D;AAC5D,oEAA8D;AAC9D,0EAAoE;AACpE,0DAAqD;AACrD,wDAAmD;AACnD,4EAAsE;AACtE,4DAAuD;AAE1C,QAAA,UAAU,GAAG;IACxB,WAAW,EAAE;QACX,8DAA4B;QAC5B,+CAAqB;QACrB,2CAAmB;KACpB;IACD,QAAQ,EAAE,CAAC,yCAAkB,CAAU;IACvC,SAAS,EAAE;QACT,kDAAsB;QACtB,gDAAqB;QACrB,oDAAuB;QACvB,0DAA0B;QAC1B,0DAA0B;QAC1B,2CAAmB;QACnB,2CAAmB;KACpB;IACD,IAAI,EAAE;QACJ,oCAAe;QACf,oCAAe;QACf,sCAAgB;QAChB,4CAAmB;QACnB,6BAAY;QACZ,2BAAW;QACX,8CAAoB;QACpB,+BAAa;KACd;IACD,IAAI,EAAE,EAAE;IACR,WAAW,EAAE,EAAE;CAChB,CAAC"}
|
|
@@ -1,10 +1,17 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { CommonDataProcessor } from '../../common/libraries/common.data.processor';
|
|
2
|
+
import { AdminUserEntity } from '../../auth/entities/admin.user.entity';
|
|
3
3
|
import { AddAdminUserDto } from '../dtos/add.admin.user.dto';
|
|
4
|
-
export declare class AdminUserDataProcessor extends
|
|
4
|
+
export declare class AdminUserDataProcessor extends CommonDataProcessor {
|
|
5
|
+
private readonly actor;
|
|
5
6
|
protected payload: AddAdminUserDto;
|
|
6
|
-
|
|
7
|
+
constructor(actor: AdminUserEntity);
|
|
8
|
+
process(payload: AddAdminUserDto): Promise<AdminUserEntity>;
|
|
7
9
|
private validate;
|
|
8
10
|
private create;
|
|
11
|
+
private assertEmailAvailable;
|
|
12
|
+
private assertUsernameAvailable;
|
|
13
|
+
private resolveAdminRoles;
|
|
14
|
+
private grantAdminRoles;
|
|
15
|
+
private stripSecrets;
|
|
9
16
|
}
|
|
10
17
|
//# sourceMappingURL=admin.user.data.processor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin.user.data.processor.d.ts","sourceRoot":"","sources":["../../../src/admin/libraries/admin.user.data.processor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"admin.user.data.processor.d.ts","sourceRoot":"","sources":["../../../src/admin/libraries/admin.user.data.processor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,8CAA8C,CAAC;AACnF,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAGxE,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAG7D,qBAAa,sBAAuB,SAAQ,mBAAmB;IAGjD,OAAO,CAAC,QAAQ,CAAC,KAAK;IAFlC,SAAS,CAAC,OAAO,EAAE,eAAe,CAAC;gBAEN,KAAK,EAAE,eAAe;IAI7C,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;YAMnD,QAAQ;YAQR,MAAM;YAiBN,oBAAoB;YAQpB,uBAAuB;YASvB,iBAAiB;YAiBjB,eAAe;IAc7B,OAAO,CAAC,YAAY;CAIrB"}
|
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.AdminUserDataProcessor = void 0;
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
|
|
4
|
+
const typeorm_1 = require("typeorm");
|
|
5
|
+
const common_data_processor_1 = require("../../common/libraries/common.data.processor");
|
|
6
|
+
const admin_user_entity_1 = require("../../auth/entities/admin.user.entity");
|
|
7
|
+
const system_admin_role_entity_1 = require("../../auth/entities/system.admin.role.entity");
|
|
8
|
+
const system_admin_user_role_entity_1 = require("../../auth/entities/system.admin.user.role.entity");
|
|
9
|
+
class AdminUserDataProcessor extends common_data_processor_1.CommonDataProcessor {
|
|
10
|
+
constructor(actor) {
|
|
11
|
+
super();
|
|
12
|
+
this.actor = actor;
|
|
13
|
+
}
|
|
8
14
|
async process(payload) {
|
|
9
15
|
this.payload = payload;
|
|
10
16
|
await this.validate();
|
|
@@ -12,27 +18,59 @@ class AdminUserDataProcessor extends user_data_processor_1.UserDataProcessor {
|
|
|
12
18
|
}
|
|
13
19
|
async validate() {
|
|
14
20
|
await this.assertEmailAvailable(this.payload.email);
|
|
15
|
-
await this.
|
|
16
|
-
|
|
17
|
-
});
|
|
21
|
+
await this.assertUsernameAvailable(this.payload.username);
|
|
22
|
+
await this.resolveAdminRoles(this.payload.role_ids, 'role_ids');
|
|
18
23
|
this.throwExceptionOnError();
|
|
19
24
|
}
|
|
20
25
|
async create() {
|
|
21
26
|
const body = this.payload;
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
full_name: body.full_name,
|
|
27
|
+
const adminUser = admin_user_entity_1.AdminUserEntity.create({
|
|
28
|
+
name: body.name,
|
|
25
29
|
email: body.email,
|
|
30
|
+
username: body.username,
|
|
26
31
|
password: body.password,
|
|
27
|
-
country: body.country,
|
|
28
|
-
contact_code: body.contact_code,
|
|
29
|
-
contact: body.contact,
|
|
30
|
-
active: body.active ?? true,
|
|
31
32
|
attributes: body.attributes ?? {},
|
|
32
33
|
});
|
|
33
|
-
await
|
|
34
|
-
await this.
|
|
35
|
-
return this.stripSecrets(
|
|
34
|
+
await adminUser.save();
|
|
35
|
+
await this.grantAdminRoles(adminUser.id, body.role_ids);
|
|
36
|
+
return this.stripSecrets(adminUser);
|
|
37
|
+
}
|
|
38
|
+
async assertEmailAvailable(email, field = 'email') {
|
|
39
|
+
const existing = await admin_user_entity_1.AdminUserEntity.findOne({ where: { email } });
|
|
40
|
+
if (existing)
|
|
41
|
+
this.setColumnError(field, 'Email is already registered');
|
|
42
|
+
}
|
|
43
|
+
async assertUsernameAvailable(username, field = 'username') {
|
|
44
|
+
const existing = await admin_user_entity_1.AdminUserEntity.findOne({ where: { username } });
|
|
45
|
+
if (existing)
|
|
46
|
+
this.setColumnError(field, 'Username is already taken');
|
|
47
|
+
}
|
|
48
|
+
async resolveAdminRoles(roleIds, field) {
|
|
49
|
+
if (!roleIds?.length)
|
|
50
|
+
return [];
|
|
51
|
+
const unique = [...new Set(roleIds)];
|
|
52
|
+
const roles = await system_admin_role_entity_1.SystemAdminRoleEntity.find({
|
|
53
|
+
where: { id: (0, typeorm_1.In)(unique) },
|
|
54
|
+
});
|
|
55
|
+
const foundIds = new Set(roles.map((role) => role.id));
|
|
56
|
+
for (const id of unique) {
|
|
57
|
+
if (!foundIds.has(id))
|
|
58
|
+
this.setColumnError(field, `Role ${id} not found`);
|
|
59
|
+
}
|
|
60
|
+
return roles;
|
|
61
|
+
}
|
|
62
|
+
async grantAdminRoles(adminUserId, roleIds = []) {
|
|
63
|
+
const links = [...new Set(roleIds)].map((roleId) => system_admin_user_role_entity_1.SystemAdminUserRoleEntity.create({
|
|
64
|
+
admin_user_id: adminUserId,
|
|
65
|
+
role_id: roleId,
|
|
66
|
+
created_by: this.actor.id,
|
|
67
|
+
}));
|
|
68
|
+
if (links.length)
|
|
69
|
+
await system_admin_user_role_entity_1.SystemAdminUserRoleEntity.save(links);
|
|
70
|
+
}
|
|
71
|
+
stripSecrets(adminUser) {
|
|
72
|
+
delete adminUser.password;
|
|
73
|
+
return adminUser;
|
|
36
74
|
}
|
|
37
75
|
}
|
|
38
76
|
exports.AdminUserDataProcessor = AdminUserDataProcessor;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin.user.data.processor.js","sourceRoot":"","sources":["../../../src/admin/libraries/admin.user.data.processor.ts"],"names":[],"mappings":";;;AAAA
|
|
1
|
+
{"version":3,"file":"admin.user.data.processor.js","sourceRoot":"","sources":["../../../src/admin/libraries/admin.user.data.processor.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,7 +9,7 @@ export interface BulkUserResult {
|
|
|
9
9
|
export declare class BulkUserDataProcessor extends UserDataProcessor {
|
|
10
10
|
private readonly tenantService;
|
|
11
11
|
protected payload: AddBulkUsersDto;
|
|
12
|
-
constructor(
|
|
12
|
+
constructor(tenantService: TenantService);
|
|
13
13
|
process(payload: AddBulkUsersDto): Promise<BulkUserResult>;
|
|
14
14
|
private validate;
|
|
15
15
|
private create;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bulk.user.data.processor.d.ts","sourceRoot":"","sources":["../../../src/admin/libraries/bulk.user.data.processor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"bulk.user.data.processor.d.ts","sourceRoot":"","sources":["../../../src/admin/libraries/bulk.user.data.processor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAE7D,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB;AAQD,qBAAa,qBAAsB,SAAQ,iBAAiB;IAG9C,OAAO,CAAC,QAAQ,CAAC,aAAa;IAF1C,SAAS,CAAC,OAAO,EAAE,eAAe,CAAC;gBAEN,aAAa,EAAE,aAAa;IAInD,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;YAMlD,QAAQ;YAWR,MAAM;IA0BpB,OAAO,CAAC,mBAAmB;YAiBb,eAAe;CAa9B"}
|
|
@@ -4,11 +4,10 @@ exports.BulkUserDataProcessor = void 0;
|
|
|
4
4
|
const typeorm_1 = require("typeorm");
|
|
5
5
|
const user_data_processor_1 = require("./user.data.processor");
|
|
6
6
|
const user_entity_1 = require("../../auth/entities/user.entity");
|
|
7
|
-
const user_role_entity_1 = require("../../auth/entities/user.role.entity");
|
|
8
7
|
const user_type_enum_1 = require("../../auth/enums/user.type.enum");
|
|
9
8
|
class BulkUserDataProcessor extends user_data_processor_1.UserDataProcessor {
|
|
10
|
-
constructor(
|
|
11
|
-
super(
|
|
9
|
+
constructor(tenantService) {
|
|
10
|
+
super();
|
|
12
11
|
this.tenantService = tenantService;
|
|
13
12
|
}
|
|
14
13
|
async process(payload) {
|
|
@@ -22,10 +21,6 @@ class BulkUserDataProcessor extends user_data_processor_1.UserDataProcessor {
|
|
|
22
21
|
this.setColumnError('tenant_id', 'Tenant not found or inactive');
|
|
23
22
|
this.flagDuplicateEmails();
|
|
24
23
|
await this.flagTakenEmails();
|
|
25
|
-
const allRoleIds = [
|
|
26
|
-
...new Set(this.payload.users.flatMap((user) => user.role_ids ?? [])),
|
|
27
|
-
];
|
|
28
|
-
await this.resolveRoles(allRoleIds, 'role_ids', { forbidGlobal: true });
|
|
29
24
|
this.throwExceptionOnError();
|
|
30
25
|
}
|
|
31
26
|
async create() {
|
|
@@ -43,12 +38,6 @@ class BulkUserDataProcessor extends user_data_processor_1.UserDataProcessor {
|
|
|
43
38
|
attributes: user.attributes ?? {},
|
|
44
39
|
}));
|
|
45
40
|
await user_entity_1.UserEntity.save(entities);
|
|
46
|
-
const links = [];
|
|
47
|
-
entities.forEach((user, index) => {
|
|
48
|
-
links.push(...this.buildRoleLinks(user.id, body.users[index].role_ids));
|
|
49
|
-
});
|
|
50
|
-
if (links.length)
|
|
51
|
-
await user_role_entity_1.UserRoleEntity.save(links);
|
|
52
41
|
return {
|
|
53
42
|
created: entities.length,
|
|
54
43
|
users: entities.map((user) => this.stripSecrets(user)),
|