@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.
Files changed (214) hide show
  1. package/README.md +77 -28
  2. package/dist/admin/controllers/admin.user.controller.d.ts +1 -1
  3. package/dist/admin/controllers/admin.user.controller.js +4 -4
  4. package/dist/admin/controllers/admin.user.controller.js.map +1 -1
  5. package/dist/admin/dtos/add.admin.user.dto.d.ts +6 -2
  6. package/dist/admin/dtos/add.admin.user.dto.d.ts.map +1 -1
  7. package/dist/admin/dtos/add.admin.user.dto.js +33 -3
  8. package/dist/admin/dtos/add.admin.user.dto.js.map +1 -1
  9. package/dist/admin/dtos/base.user.dto.d.ts +0 -1
  10. package/dist/admin/dtos/base.user.dto.d.ts.map +1 -1
  11. package/dist/admin/dtos/base.user.dto.js +0 -11
  12. package/dist/admin/dtos/base.user.dto.js.map +1 -1
  13. package/dist/admin/es6.classes.d.ts +2 -1
  14. package/dist/admin/es6.classes.d.ts.map +1 -1
  15. package/dist/admin/es6.classes.js +24 -3
  16. package/dist/admin/es6.classes.js.map +1 -1
  17. package/dist/admin/libraries/admin.user.data.processor.d.ts +11 -4
  18. package/dist/admin/libraries/admin.user.data.processor.d.ts.map +1 -1
  19. package/dist/admin/libraries/admin.user.data.processor.js +55 -17
  20. package/dist/admin/libraries/admin.user.data.processor.js.map +1 -1
  21. package/dist/admin/libraries/bulk.user.data.processor.d.ts +1 -1
  22. package/dist/admin/libraries/bulk.user.data.processor.d.ts.map +1 -1
  23. package/dist/admin/libraries/bulk.user.data.processor.js +2 -13
  24. package/dist/admin/libraries/bulk.user.data.processor.js.map +1 -1
  25. package/dist/admin/libraries/client.user.data.processor.d.ts +1 -1
  26. package/dist/admin/libraries/client.user.data.processor.d.ts.map +1 -1
  27. package/dist/admin/libraries/client.user.data.processor.js +2 -6
  28. package/dist/admin/libraries/client.user.data.processor.js.map +1 -1
  29. package/dist/admin/libraries/scheduled.task.data.processor.d.ts +3 -3
  30. package/dist/admin/libraries/scheduled.task.data.processor.d.ts.map +1 -1
  31. package/dist/admin/libraries/scheduled.task.data.processor.js.map +1 -1
  32. package/dist/admin/libraries/tenant.data.processor.d.ts +2 -2
  33. package/dist/admin/libraries/tenant.data.processor.d.ts.map +1 -1
  34. package/dist/admin/libraries/tenant.data.processor.js.map +1 -1
  35. package/dist/admin/libraries/user.data.processor.d.ts +0 -11
  36. package/dist/admin/libraries/user.data.processor.d.ts.map +1 -1
  37. package/dist/admin/libraries/user.data.processor.js +0 -44
  38. package/dist/admin/libraries/user.data.processor.js.map +1 -1
  39. package/dist/admin/services/admin.access.service.d.ts +8 -8
  40. package/dist/admin/services/admin.access.service.d.ts.map +1 -1
  41. package/dist/admin/services/admin.access.service.js +8 -8
  42. package/dist/admin/services/admin.access.service.js.map +1 -1
  43. package/dist/auth/auth.module.d.ts.map +1 -1
  44. package/dist/auth/auth.module.js +17 -5
  45. package/dist/auth/auth.module.js.map +1 -1
  46. package/dist/auth/controllers/admin.auth.controller.d.ts +20 -0
  47. package/dist/auth/controllers/admin.auth.controller.d.ts.map +1 -0
  48. package/dist/auth/controllers/admin.auth.controller.js +95 -0
  49. package/dist/auth/controllers/admin.auth.controller.js.map +1 -0
  50. package/dist/auth/controllers/auth.controller.d.ts.map +1 -1
  51. package/dist/auth/controllers/auth.controller.js +7 -4
  52. package/dist/auth/controllers/auth.controller.js.map +1 -1
  53. package/dist/auth/dtos/admin.login.dto.d.ts +5 -0
  54. package/dist/auth/dtos/admin.login.dto.d.ts.map +1 -0
  55. package/dist/auth/dtos/admin.login.dto.js +30 -0
  56. package/dist/auth/dtos/admin.login.dto.js.map +1 -0
  57. package/dist/auth/entities/admin.user.entity.d.ts +11 -0
  58. package/dist/auth/entities/admin.user.entity.d.ts.map +1 -0
  59. package/dist/auth/entities/admin.user.entity.js +47 -0
  60. package/dist/auth/entities/admin.user.entity.js.map +1 -0
  61. package/dist/auth/entities/api.key.entity.d.ts +2 -2
  62. package/dist/auth/entities/api.key.entity.d.ts.map +1 -1
  63. package/dist/auth/entities/api.key.entity.js +2 -2
  64. package/dist/auth/entities/api.key.entity.js.map +1 -1
  65. package/dist/auth/entities/api.scope.entity.d.ts +13 -0
  66. package/dist/auth/entities/api.scope.entity.d.ts.map +1 -0
  67. package/dist/auth/entities/api.scope.entity.js +51 -0
  68. package/dist/auth/entities/api.scope.entity.js.map +1 -0
  69. package/dist/auth/entities/scope.entity.d.ts +7 -0
  70. package/dist/auth/entities/scope.entity.d.ts.map +1 -0
  71. package/dist/auth/entities/scope.entity.js +34 -0
  72. package/dist/auth/entities/scope.entity.js.map +1 -0
  73. package/dist/auth/entities/system.admin.role.entity.d.ts +11 -0
  74. package/dist/auth/entities/system.admin.role.entity.d.ts.map +1 -0
  75. package/dist/auth/entities/system.admin.role.entity.js +46 -0
  76. package/dist/auth/entities/system.admin.role.entity.js.map +1 -0
  77. package/dist/auth/entities/system.admin.user.role.entity.d.ts +10 -0
  78. package/dist/auth/entities/system.admin.user.role.entity.d.ts.map +1 -0
  79. package/dist/auth/entities/system.admin.user.role.entity.js +41 -0
  80. package/dist/auth/entities/system.admin.user.role.entity.js.map +1 -0
  81. package/dist/auth/entities/system.auth.session.entity.d.ts +9 -0
  82. package/dist/auth/entities/system.auth.session.entity.d.ts.map +1 -0
  83. package/dist/auth/entities/system.auth.session.entity.js +42 -0
  84. package/dist/auth/entities/system.auth.session.entity.js.map +1 -0
  85. package/dist/auth/entities/system.refresh.token.entity.d.ts +1 -0
  86. package/dist/auth/entities/system.refresh.token.entity.d.ts.map +1 -1
  87. package/dist/auth/entities/system.refresh.token.entity.js +4 -0
  88. package/dist/auth/entities/system.refresh.token.entity.js.map +1 -1
  89. package/dist/auth/entities/system.role.entity.d.ts +3 -4
  90. package/dist/auth/entities/system.role.entity.d.ts.map +1 -1
  91. package/dist/auth/entities/system.role.entity.js +5 -8
  92. package/dist/auth/entities/system.role.entity.js.map +1 -1
  93. package/dist/auth/es6.classes.d.ts +6 -4
  94. package/dist/auth/es6.classes.d.ts.map +1 -1
  95. package/dist/auth/es6.classes.js +32 -6
  96. package/dist/auth/es6.classes.js.map +1 -1
  97. package/dist/auth/helpers/admin.auth.d.ts +6 -0
  98. package/dist/auth/helpers/admin.auth.d.ts.map +1 -0
  99. package/dist/auth/helpers/admin.auth.js +29 -0
  100. package/dist/auth/helpers/admin.auth.js.map +1 -0
  101. package/dist/auth/helpers/api.key.context.d.ts +6 -0
  102. package/dist/auth/helpers/api.key.context.d.ts.map +1 -0
  103. package/dist/auth/helpers/api.key.context.js +15 -0
  104. package/dist/auth/helpers/api.key.context.js.map +1 -0
  105. package/dist/auth/helpers/auth.d.ts +6 -0
  106. package/dist/auth/helpers/auth.d.ts.map +1 -0
  107. package/dist/auth/helpers/auth.js +27 -0
  108. package/dist/auth/helpers/auth.js.map +1 -0
  109. package/dist/auth/middlewares/admin.jwt.middleware.d.ts +10 -0
  110. package/dist/auth/middlewares/admin.jwt.middleware.d.ts.map +1 -0
  111. package/dist/auth/middlewares/admin.jwt.middleware.js +59 -0
  112. package/dist/auth/middlewares/admin.jwt.middleware.js.map +1 -0
  113. package/dist/auth/middlewares/api.key.middleware.d.ts +10 -0
  114. package/dist/auth/middlewares/api.key.middleware.d.ts.map +1 -0
  115. package/dist/auth/middlewares/api.key.middleware.js +47 -0
  116. package/dist/auth/middlewares/api.key.middleware.js.map +1 -0
  117. package/dist/auth/middlewares/jwt.middleware.d.ts +10 -0
  118. package/dist/auth/middlewares/jwt.middleware.d.ts.map +1 -0
  119. package/dist/auth/middlewares/jwt.middleware.js +59 -0
  120. package/dist/auth/middlewares/jwt.middleware.js.map +1 -0
  121. package/dist/auth/services/admin.auth.service.d.ts +19 -0
  122. package/dist/auth/services/admin.auth.service.d.ts.map +1 -0
  123. package/dist/auth/services/admin.auth.service.js +160 -0
  124. package/dist/auth/services/admin.auth.service.js.map +1 -0
  125. package/dist/auth/services/auth.service.d.ts +4 -5
  126. package/dist/auth/services/auth.service.d.ts.map +1 -1
  127. package/dist/auth/services/auth.service.js +41 -35
  128. package/dist/auth/services/auth.service.js.map +1 -1
  129. package/dist/auth/types/auth.types.d.ts +7 -4
  130. package/dist/auth/types/auth.types.d.ts.map +1 -1
  131. package/dist/common/consumers/job.consumer.d.ts +1 -0
  132. package/dist/common/consumers/job.consumer.d.ts.map +1 -1
  133. package/dist/common/consumers/job.consumer.js +7 -2
  134. package/dist/common/consumers/job.consumer.js.map +1 -1
  135. package/dist/common/controllers/common.controller.js +1 -1
  136. package/dist/common/controllers/common.controller.js.map +1 -1
  137. package/dist/common/entities/common.admin.entity.d.ts +7 -0
  138. package/dist/common/entities/common.admin.entity.d.ts.map +1 -0
  139. package/dist/common/entities/common.admin.entity.js +28 -0
  140. package/dist/common/entities/common.admin.entity.js.map +1 -0
  141. package/dist/common/entities/root.entity.d.ts.map +1 -1
  142. package/dist/common/entities/root.entity.js +11 -2
  143. package/dist/common/entities/root.entity.js.map +1 -1
  144. package/dist/constants/entity.constants.d.ts +6 -0
  145. package/dist/constants/entity.constants.d.ts.map +1 -1
  146. package/dist/constants/entity.constants.js +6 -0
  147. package/dist/constants/entity.constants.js.map +1 -1
  148. package/dist/constants/entity.maps.d.ts +12 -0
  149. package/dist/constants/entity.maps.d.ts.map +1 -1
  150. package/dist/constants/entity.maps.js +12 -0
  151. package/dist/constants/entity.maps.js.map +1 -1
  152. package/dist/global/filters/global.exception.filter.d.ts.map +1 -1
  153. package/dist/global/filters/global.exception.filter.js +6 -2
  154. package/dist/global/filters/global.exception.filter.js.map +1 -1
  155. package/dist/global/utilities/migration.utility.d.ts +4 -0
  156. package/dist/global/utilities/migration.utility.d.ts.map +1 -1
  157. package/dist/global/utilities/migration.utility.js +70 -8
  158. package/dist/global/utilities/migration.utility.js.map +1 -1
  159. package/dist/index.d.ts +26 -3
  160. package/dist/index.d.ts.map +1 -1
  161. package/dist/index.js +55 -8
  162. package/dist/index.js.map +1 -1
  163. package/dist/migrations/1749600000003.CreateSysRolesTable.d.ts.map +1 -1
  164. package/dist/migrations/1749600000003.CreateSysRolesTable.js +3 -4
  165. package/dist/migrations/1749600000003.CreateSysRolesTable.js.map +1 -1
  166. package/dist/migrations/1749600000021.CreateSysAdminUsersTable.d.ts +6 -0
  167. package/dist/migrations/1749600000021.CreateSysAdminUsersTable.d.ts.map +1 -0
  168. package/dist/migrations/1749600000021.CreateSysAdminUsersTable.js +23 -0
  169. package/dist/migrations/1749600000021.CreateSysAdminUsersTable.js.map +1 -0
  170. package/dist/migrations/1749600000022.CreateSysAdminRolesTable.d.ts +6 -0
  171. package/dist/migrations/1749600000022.CreateSysAdminRolesTable.d.ts.map +1 -0
  172. package/dist/migrations/1749600000022.CreateSysAdminRolesTable.js +21 -0
  173. package/dist/migrations/1749600000022.CreateSysAdminRolesTable.js.map +1 -0
  174. package/dist/migrations/1749600000023.CreateSysAdminUserRolesJoinTable.d.ts +6 -0
  175. package/dist/migrations/1749600000023.CreateSysAdminUserRolesJoinTable.d.ts.map +1 -0
  176. package/dist/migrations/1749600000023.CreateSysAdminUserRolesJoinTable.js +34 -0
  177. package/dist/migrations/1749600000023.CreateSysAdminUserRolesJoinTable.js.map +1 -0
  178. package/dist/migrations/1749600000024.CreateSysAuthSessionsTable.d.ts +6 -0
  179. package/dist/migrations/1749600000024.CreateSysAuthSessionsTable.d.ts.map +1 -0
  180. package/dist/migrations/1749600000024.CreateSysAuthSessionsTable.js +22 -0
  181. package/dist/migrations/1749600000024.CreateSysAuthSessionsTable.js.map +1 -0
  182. package/dist/migrations/1749600000025.CreateSysScopesTable.d.ts +6 -0
  183. package/dist/migrations/1749600000025.CreateSysScopesTable.d.ts.map +1 -0
  184. package/dist/migrations/1749600000025.CreateSysScopesTable.js +25 -0
  185. package/dist/migrations/1749600000025.CreateSysScopesTable.js.map +1 -0
  186. package/dist/migrations/1749600000026.CreateSysApiScopesTable.d.ts +6 -0
  187. package/dist/migrations/1749600000026.CreateSysApiScopesTable.d.ts.map +1 -0
  188. package/dist/migrations/1749600000026.CreateSysApiScopesTable.js +39 -0
  189. package/dist/migrations/1749600000026.CreateSysApiScopesTable.js.map +1 -0
  190. package/dist/migrations/1749600000027.RetargetSysApiKeysCreatedByToAdminUsers.d.ts +8 -0
  191. package/dist/migrations/1749600000027.RetargetSysApiKeysCreatedByToAdminUsers.d.ts.map +1 -0
  192. package/dist/migrations/1749600000027.RetargetSysApiKeysCreatedByToAdminUsers.js +31 -0
  193. package/dist/migrations/1749600000027.RetargetSysApiKeysCreatedByToAdminUsers.js.map +1 -0
  194. package/dist/migrations/1749600000028.RetargetSysTenantsCreatedByToAdminUsers.d.ts +8 -0
  195. package/dist/migrations/1749600000028.RetargetSysTenantsCreatedByToAdminUsers.d.ts.map +1 -0
  196. package/dist/migrations/1749600000028.RetargetSysTenantsCreatedByToAdminUsers.js +31 -0
  197. package/dist/migrations/1749600000028.RetargetSysTenantsCreatedByToAdminUsers.js.map +1 -0
  198. package/dist/migrations/1749600000029.AddIsAdminToSysRefreshTokensTable.d.ts +7 -0
  199. package/dist/migrations/1749600000029.AddIsAdminToSysRefreshTokensTable.d.ts.map +1 -0
  200. package/dist/migrations/1749600000029.AddIsAdminToSysRefreshTokensTable.js +31 -0
  201. package/dist/migrations/1749600000029.AddIsAdminToSysRefreshTokensTable.js.map +1 -0
  202. package/dist/tenant/entities/tenant.entity.d.ts +2 -3
  203. package/dist/tenant/entities/tenant.entity.d.ts.map +1 -1
  204. package/dist/tenant/entities/tenant.entity.js +2 -6
  205. package/dist/tenant/entities/tenant.entity.js.map +1 -1
  206. package/package.json +1 -1
  207. package/dist/auth/middlewares/auth.context.middleware.d.ts +0 -10
  208. package/dist/auth/middlewares/auth.context.middleware.d.ts.map +0 -1
  209. package/dist/auth/middlewares/auth.context.middleware.js +0 -37
  210. package/dist/auth/middlewares/auth.context.middleware.js.map +0 -1
  211. package/dist/auth/services/auth.context.service.d.ts +0 -9
  212. package/dist/auth/services/auth.context.service.d.ts.map +0 -1
  213. package/dist/auth/services/auth.context.service.js +0 -33
  214. 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`, ... | uuid PK, soft deletes, `created_by`, jsonb `attributes`; entity-level `findOneOrNew`, `softDelete`, `hardDelete`, `restore`, `paginate` statics |
88
- | Migrations | `CreateSysUsersTable...` (16 files), `MigrationUtility`, `SeederUtility` | fluent `this.string()`, `this.numeric()`, `addRecord()` seeding |
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.validateAccess()`, `AuthContextService`, `AuthContextMiddleware`, `GoogleAuthService` | imperative auth (open by default); bearer token via AsyncLocalStorage → user + roles; access + rotating refresh tokens, Redis JTI blocklist; Google SSO via ID token at `POST /auth/google` |
92
- | API keys | `ApiKeyService`, `ApiKeyGuard`, `@ApiKeyScopes()` | hashed keys in `sys_api_keys`, scopes, expiry/revocation, `x-api-key` header |
93
- | Multi-tenancy | `TenantModule`, `TenantEntity`, `TenantCommonEntity`, `TenantContextService`, `TenantContextMiddleware` | AsyncLocalStorage tenant context; resolve by header, slug, or domain |
94
- | Admin | `AdminModule`, `AdminAccessService`, `TenantDataProcessor`, `ClientUserDataProcessor`, `BulkUserDataProcessor`, `AdminUserDataProcessor`, list processors | back-office APIs: tenant onboarding, client/admin user registration (single + bulk), tenant + scheduled-task listing; 4-tier `GlobalAdminRoles` gate; `UserType` discriminator on `sys_users`; Swagger at `/docs` (hidden in production) |
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.validateAccess()`. It reads the bearer token from the
160
- request (held in `AsyncLocalStorage` by `AuthContextMiddleware`), verifies it,
161
- rejects revoked tokens, and returns the user row with its roles — throwing
162
- `AccessException` (403) when missing/invalid. This keeps authorization next to
163
- your business logic, so layering tenant/plan/role checks is just more code.
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.validateAccess();
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 token is captured per request
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(AuthContextMiddleware).forRoutes('*'); // Express 5: e.g. '{*splat}'
204
+ consumer.apply(JwtMiddleware).forRoutes('*'); // Express 5: e.g. '{*splat}'
197
205
  }
198
206
  }
199
207
  ```
200
208
 
201
- `validateAccess()` reads the token via `AuthContextService` (no request-scoped
202
- providers). The Passport `JwtStrategy`/`JwtAuthGuard` remain available if you
203
- prefer guard-based protection on specific routes, but they're no longer the
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 (`sys_roles.name`) | Capability |
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 the
536
- caller and returns `{ user, roles }` so the controller can pass the actor to a
537
- processor.
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(actor, ...deps).process(dto)`); list processors return a
606
+ (`new XxxDataProcessor(...deps).process(dto)`); list processors return a
566
607
  `PaginatedResult`. Bulk registration validates the entire batch before any insert.
567
- Admins and client users share `sys_users`, distinguished by the `UserType` enum on
568
- `user_type` (`system.user` vs `tenant.user`).
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("../..").UserEntity>;
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
- const { user } = await this.adminAccessService.validateSuperAdmin();
33
- return new client_user_data_processor_1.ClientUserDataProcessor(user, this.tenantService).process(dto);
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
- const { user } = await this.adminAccessService.validateSuperAdmin();
37
- return new bulk_user_data_processor_1.BulkUserDataProcessor(user, this.tenantService).process(dto);
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,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,kBAAkB,EAAE,CAAC;QACpE,OAAO,IAAI,oDAAuB,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC5E,CAAC;IAOK,AAAN,KAAK,CAAC,kBAAkB,CAAS,GAAoB;QACnD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,kBAAkB,EAAE,CAAC;QACpE,OAAO,IAAI,gDAAqB,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC1E,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
+ {"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
- import { BaseUserDto } from './base.user.dto';
2
- export declare class AddAdminUserDto extends BaseUserDto {
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":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAM9C,qBAAa,eAAgB,SAAQ,WAAW;IAStC,QAAQ,EAAE,MAAM,EAAE,CAAC;CAC5B"}
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
- const base_user_dto_1 = require("./base.user.dto");
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: 'sys_roles UUIDs — must reference global.* admin roles.',
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,qDAAgE;AAChE,6CAA8C;AAC9C,mDAA8C;AAM9C,MAAa,eAAgB,SAAQ,2BAAW;CAU/C;AAVD,0CAUC;AADS;IARP,IAAA,qBAAW,EAAC;QACX,IAAI,EAAE,CAAC,MAAM,CAAC;QACd,MAAM,EAAE,MAAM;QACd,WAAW,EAAE,wDAAwD;KACtE,CAAC;IACD,IAAA,yBAAO,GAAE;IACT,IAAA,8BAAY,EAAC,CAAC,CAAC;IACf,IAAA,wBAAM,EAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;;iDACH"}
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"}
@@ -6,7 +6,6 @@ export declare class BaseUserDto {
6
6
  contact_code?: string;
7
7
  contact?: string;
8
8
  active?: boolean;
9
- role_ids?: string[];
10
9
  attributes?: Record<string, any>;
11
10
  }
12
11
  //# sourceMappingURL=base.user.dto.d.ts.map
@@ -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;IAUjB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAKpB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAClC"}
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,qDAUyB;AACzB,6CAAmE;AAMnE,MAAa,WAAW;CAsDvB;AAtDD,kCAsDC;AAlDC;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;AAUjB;IARC,IAAA,6BAAmB,EAAC;QACnB,IAAI,EAAE,CAAC,MAAM,CAAC;QACd,MAAM,EAAE,MAAM;QACd,WAAW,EAAE,oCAAoC;KAClD,CAAC;IACD,IAAA,4BAAU,GAAE;IACZ,IAAA,yBAAO,GAAE;IACT,IAAA,wBAAM,EAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;;6CACV;AAKpB;IAHC,IAAA,6BAAmB,EAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAAC;IACnE,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,GAAE;;+CACsB"}
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;AAIxE,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;;;;;;;CAOtB,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: [admin_scheduled_task_controller_1.AdminScheduledTaskController, admin_tenant_controller_1.AdminTenantController, admin_user_controller_1.AdminUserController],
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: [admin_user_data_processor_1.AdminUserDataProcessor, bulk_user_data_processor_1.BulkUserDataProcessor, client_user_data_processor_1.ClientUserDataProcessor, scheduled_task_data_processor_1.ScheduledTaskDataProcessor, scheduled_task_list_processor_1.ScheduledTaskListProcessor, tenant_data_processor_1.TenantDataProcessor, tenant_list_processor_1.TenantListProcessor],
27
- dtos: [add_admin_user_dto_1.AddAdminUserDto, add_bulk_users_dto_1.BulkUserItemDto, add_client_user_dto_1.AddClientUserDto, add_scheduled_task_dto_1.ScheduleIntervalDto, add_tenant_dto_1.AddTenantDto, base_user_dto_1.BaseUserDto, scheduled_task_list_dto_1.ScheduledTaskListDto, tenant_list_dto_1.TenantListDto],
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,CAAC,8DAA4B,EAAE,+CAAqB,EAAE,2CAAmB,CAAC;IACvF,QAAQ,EAAE,CAAC,yCAAkB,CAAU;IACvC,SAAS,EAAE,CAAC,kDAAsB,EAAE,gDAAqB,EAAE,oDAAuB,EAAE,0DAA0B,EAAE,0DAA0B,EAAE,2CAAmB,EAAE,2CAAmB,CAAC;IACrL,IAAI,EAAE,CAAC,oCAAe,EAAE,oCAAe,EAAE,sCAAgB,EAAE,4CAAmB,EAAE,6BAAY,EAAE,2BAAW,EAAE,8CAAoB,EAAE,+BAAa,CAAC;IAC/I,IAAI,EAAE,EAAE;IACR,WAAW,EAAE,EAAE;CAChB,CAAC"}
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 { UserDataProcessor } from './user.data.processor';
2
- import { UserEntity } from '../../auth/entities/user.entity';
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 UserDataProcessor {
4
+ export declare class AdminUserDataProcessor extends CommonDataProcessor {
5
+ private readonly actor;
5
6
  protected payload: AddAdminUserDto;
6
- process(payload: AddAdminUserDto): Promise<UserEntity>;
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":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAE7D,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAM7D,qBAAa,sBAAuB,SAAQ,iBAAiB;IAC3D,SAAS,CAAC,OAAO,EAAE,eAAe,CAAC;IAE7B,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC;YAM9C,QAAQ;YASR,MAAM;CAoBrB"}
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 user_data_processor_1 = require("./user.data.processor");
5
- const user_entity_1 = require("../../auth/entities/user.entity");
6
- const user_type_enum_1 = require("../../auth/enums/user.type.enum");
7
- class AdminUserDataProcessor extends user_data_processor_1.UserDataProcessor {
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.resolveRoles(this.payload.role_ids, 'role_ids', {
16
- requireGlobal: true,
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 user = user_entity_1.UserEntity.create({
23
- user_type: user_type_enum_1.UserType.SYSTEM_USER,
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 user.save();
34
- await this.grantRoles(user.id, body.role_ids);
35
- return this.stripSecrets(user);
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,+DAA0D;AAC1D,iEAA6D;AAC7D,oEAA2D;AAO3D,MAAa,sBAAuB,SAAQ,uCAAiB;IAG3D,KAAK,CAAC,OAAO,CAAC,OAAwB;QACpC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;IACvB,CAAC;IAEO,KAAK,CAAC,QAAQ;QACpB,MAAM,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACpD,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,UAAU,EAAE;YACzD,aAAa,EAAE,IAAI;SACpB,CAAC,CAAC;QAEH,IAAI,CAAC,qBAAqB,EAAE,CAAC;IAC/B,CAAC;IAEO,KAAK,CAAC,MAAM;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC;QAE1B,MAAM,IAAI,GAAG,wBAAU,CAAC,MAAM,CAAC;YAC7B,SAAS,EAAE,yBAAQ,CAAC,WAAW;YAC/B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI;YAC3B,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,EAAE;SAClC,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAElB,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAE9C,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;CACF;AAtCD,wDAsCC"}
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(actor: UserEntity, tenantService: TenantService);
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;AAG7D,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;AAOD,qBAAa,qBAAsB,SAAQ,iBAAiB;IAKxD,OAAO,CAAC,QAAQ,CAAC,aAAa;IAJhC,SAAS,CAAC,OAAO,EAAE,eAAe,CAAC;gBAGjC,KAAK,EAAE,UAAU,EACA,aAAa,EAAE,aAAa;IAKzC,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;YAMlD,QAAQ;YAeR,MAAM;IAgCpB,OAAO,CAAC,mBAAmB;YAiBb,eAAe;CAa9B"}
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(actor, tenantService) {
11
- super(actor);
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)),