@lenne.tech/nest-server 11.16.1 → 11.18.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 (113) hide show
  1. package/dist/config.env.js +8 -2
  2. package/dist/config.env.js.map +1 -1
  3. package/dist/core/common/decorators/response-model.decorator.d.ts +3 -0
  4. package/dist/core/common/decorators/response-model.decorator.js +8 -0
  5. package/dist/core/common/decorators/response-model.decorator.js.map +1 -0
  6. package/dist/core/common/helpers/db.helper.js +2 -2
  7. package/dist/core/common/helpers/db.helper.js.map +1 -1
  8. package/dist/core/common/helpers/filter.helper.js +3 -3
  9. package/dist/core/common/helpers/filter.helper.js.map +1 -1
  10. package/dist/core/common/helpers/input.helper.js +2 -2
  11. package/dist/core/common/helpers/input.helper.js.map +1 -1
  12. package/dist/core/common/helpers/interceptor.helper.d.ts +3 -0
  13. package/dist/core/common/helpers/interceptor.helper.js +84 -0
  14. package/dist/core/common/helpers/interceptor.helper.js.map +1 -0
  15. package/dist/core/common/helpers/service.helper.d.ts +1 -0
  16. package/dist/core/common/helpers/service.helper.js +1 -0
  17. package/dist/core/common/helpers/service.helper.js.map +1 -1
  18. package/dist/core/common/interceptors/check-security.interceptor.d.ts +2 -0
  19. package/dist/core/common/interceptors/check-security.interceptor.js +43 -1
  20. package/dist/core/common/interceptors/check-security.interceptor.js.map +1 -1
  21. package/dist/core/common/interceptors/response-model.interceptor.d.ts +13 -0
  22. package/dist/core/common/interceptors/response-model.interceptor.js +107 -0
  23. package/dist/core/common/interceptors/response-model.interceptor.js.map +1 -0
  24. package/dist/core/common/interceptors/translate-response.interceptor.d.ts +8 -0
  25. package/dist/core/common/interceptors/translate-response.interceptor.js +85 -0
  26. package/dist/core/common/interceptors/translate-response.interceptor.js.map +1 -0
  27. package/dist/core/common/interfaces/server-options.interface.d.ts +16 -0
  28. package/dist/core/common/middleware/request-context.middleware.d.ts +5 -0
  29. package/dist/core/common/middleware/request-context.middleware.js +29 -0
  30. package/dist/core/common/middleware/request-context.middleware.js.map +1 -0
  31. package/dist/core/common/pipes/map-and-validate.pipe.js +2 -2
  32. package/dist/core/common/pipes/map-and-validate.pipe.js.map +1 -1
  33. package/dist/core/common/plugins/complexity.plugin.d.ts +2 -2
  34. package/dist/core/common/plugins/mongoose-audit-fields.plugin.d.ts +1 -0
  35. package/dist/core/common/plugins/mongoose-audit-fields.plugin.js +51 -0
  36. package/dist/core/common/plugins/mongoose-audit-fields.plugin.js.map +1 -0
  37. package/dist/core/common/plugins/mongoose-password.plugin.d.ts +4 -0
  38. package/dist/core/common/plugins/mongoose-password.plugin.js +69 -0
  39. package/dist/core/common/plugins/mongoose-password.plugin.js.map +1 -0
  40. package/dist/core/common/plugins/mongoose-role-guard.plugin.d.ts +1 -0
  41. package/dist/core/common/plugins/mongoose-role-guard.plugin.js +80 -0
  42. package/dist/core/common/plugins/mongoose-role-guard.plugin.js.map +1 -0
  43. package/dist/core/common/services/config.service.js +2 -2
  44. package/dist/core/common/services/config.service.js.map +1 -1
  45. package/dist/core/common/services/model-registry.service.d.ts +8 -0
  46. package/dist/core/common/services/model-registry.service.js +20 -0
  47. package/dist/core/common/services/model-registry.service.js.map +1 -0
  48. package/dist/core/common/services/module.service.d.ts +2 -0
  49. package/dist/core/common/services/module.service.js +36 -1
  50. package/dist/core/common/services/module.service.js.map +1 -1
  51. package/dist/core/common/services/request-context.service.d.ts +18 -0
  52. package/dist/core/common/services/request-context.service.js +32 -0
  53. package/dist/core/common/services/request-context.service.js.map +1 -0
  54. package/dist/core/modules/auth/guards/auth.guard.js +2 -2
  55. package/dist/core/modules/auth/guards/auth.guard.js.map +1 -1
  56. package/dist/core/modules/better-auth/core-better-auth.resolver.js +2 -2
  57. package/dist/core/modules/better-auth/core-better-auth.resolver.js.map +1 -1
  58. package/dist/core/modules/permissions/core-permissions.controller.d.ts +13 -0
  59. package/dist/core/modules/permissions/core-permissions.controller.js +71 -0
  60. package/dist/core/modules/permissions/core-permissions.controller.js.map +1 -0
  61. package/dist/core/modules/permissions/core-permissions.module.d.ts +5 -0
  62. package/dist/core/modules/permissions/core-permissions.module.js +36 -0
  63. package/dist/core/modules/permissions/core-permissions.module.js.map +1 -0
  64. package/dist/core/modules/permissions/core-permissions.service.d.ts +34 -0
  65. package/dist/core/modules/permissions/core-permissions.service.js +610 -0
  66. package/dist/core/modules/permissions/core-permissions.service.js.map +1 -0
  67. package/dist/core/modules/permissions/interfaces/permissions.interface.d.ts +93 -0
  68. package/dist/core/modules/permissions/interfaces/permissions.interface.js +3 -0
  69. package/dist/core/modules/permissions/interfaces/permissions.interface.js.map +1 -0
  70. package/dist/core/modules/permissions/permissions-scanner.d.ts +25 -0
  71. package/dist/core/modules/permissions/permissions-scanner.js +817 -0
  72. package/dist/core/modules/permissions/permissions-scanner.js.map +1 -0
  73. package/dist/core.module.js +41 -0
  74. package/dist/core.module.js.map +1 -1
  75. package/dist/index.d.ts +15 -0
  76. package/dist/index.js +15 -0
  77. package/dist/index.js.map +1 -1
  78. package/dist/server/modules/file/file-info.model.d.ts +12 -12
  79. package/dist/server/modules/user/user.model.d.ts +33 -33
  80. package/dist/tsconfig.build.tsbuildinfo +1 -1
  81. package/package.json +35 -30
  82. package/src/config.env.ts +8 -2
  83. package/src/core/common/decorators/response-model.decorator.ts +31 -0
  84. package/src/core/common/helpers/db.helper.ts +2 -2
  85. package/src/core/common/helpers/filter.helper.ts +3 -3
  86. package/src/core/common/helpers/input.helper.ts +2 -2
  87. package/src/core/common/helpers/interceptor.helper.ts +132 -0
  88. package/src/core/common/helpers/service.helper.ts +1 -1
  89. package/src/core/common/interceptors/check-security.interceptor.ts +44 -1
  90. package/src/core/common/interceptors/response-model.interceptor.ts +135 -0
  91. package/src/core/common/interceptors/translate-response.interceptor.ts +104 -0
  92. package/src/core/common/interfaces/server-options.interface.ts +186 -0
  93. package/src/core/common/middleware/request-context.middleware.ts +25 -0
  94. package/src/core/common/pipes/map-and-validate.pipe.ts +2 -2
  95. package/src/core/common/plugins/complexity.plugin.ts +2 -2
  96. package/src/core/common/plugins/mongoose-audit-fields.plugin.ts +74 -0
  97. package/src/core/common/plugins/mongoose-password.plugin.ts +100 -0
  98. package/src/core/common/plugins/mongoose-role-guard.plugin.ts +150 -0
  99. package/src/core/common/services/config.service.ts +2 -2
  100. package/src/core/common/services/model-registry.service.ts +25 -0
  101. package/src/core/common/services/module.service.ts +91 -1
  102. package/src/core/common/services/request-context.service.ts +69 -0
  103. package/src/core/modules/auth/guards/auth.guard.ts +2 -2
  104. package/src/core/modules/better-auth/core-better-auth.resolver.ts +2 -2
  105. package/src/core/modules/permissions/INTEGRATION-CHECKLIST.md +56 -0
  106. package/src/core/modules/permissions/README.md +102 -0
  107. package/src/core/modules/permissions/core-permissions.controller.ts +34 -0
  108. package/src/core/modules/permissions/core-permissions.module.ts +36 -0
  109. package/src/core/modules/permissions/core-permissions.service.ts +627 -0
  110. package/src/core/modules/permissions/interfaces/permissions.interface.ts +125 -0
  111. package/src/core/modules/permissions/permissions-scanner.ts +1011 -0
  112. package/src/core.module.ts +62 -4
  113. package/src/index.ts +20 -0
@@ -3,17 +3,23 @@ import { DynamicModule, Global, MiddlewareConsumer, Module, NestModule, Unauthor
3
3
  import { APP_INTERCEPTOR, APP_PIPE } from '@nestjs/core';
4
4
  import { GraphQLModule } from '@nestjs/graphql';
5
5
  import { MongooseModule } from '@nestjs/mongoose';
6
- import { Context } from 'apollo-server-core';
6
+ import type { Context } from 'graphql-ws';
7
7
  import graphqlUploadExpress = require('graphql-upload/graphqlUploadExpress.js');
8
8
  import mongoose from 'mongoose';
9
9
 
10
10
  import { merge } from './core/common/helpers/config.helper';
11
11
  import { CheckResponseInterceptor } from './core/common/interceptors/check-response.interceptor';
12
12
  import { CheckSecurityInterceptor } from './core/common/interceptors/check-security.interceptor';
13
+ import { ResponseModelInterceptor } from './core/common/interceptors/response-model.interceptor';
14
+ import { TranslateResponseInterceptor } from './core/common/interceptors/translate-response.interceptor';
13
15
  import { IServerOptions } from './core/common/interfaces/server-options.interface';
16
+ import { RequestContextMiddleware } from './core/common/middleware/request-context.middleware';
14
17
  import { MapAndValidatePipe } from './core/common/pipes/map-and-validate.pipe';
15
18
  import { ComplexityPlugin } from './core/common/plugins/complexity.plugin';
16
19
  import { mongooseIdPlugin } from './core/common/plugins/mongoose-id.plugin';
20
+ import { mongooseAuditFieldsPlugin } from './core/common/plugins/mongoose-audit-fields.plugin';
21
+ import { mongoosePasswordPlugin } from './core/common/plugins/mongoose-password.plugin';
22
+ import { mongooseRoleGuardPlugin } from './core/common/plugins/mongoose-role-guard.plugin';
17
23
  import { ConfigService } from './core/common/services/config.service';
18
24
  import { EmailService } from './core/common/services/email.service';
19
25
  import { MailjetService } from './core/common/services/mailjet.service';
@@ -24,6 +30,7 @@ import { CoreBetterAuthModule } from './core/modules/better-auth/core-better-aut
24
30
  import { CoreBetterAuthService } from './core/modules/better-auth/core-better-auth.service';
25
31
  import { ErrorCodeModule } from './core/modules/error-code/error-code.module';
26
32
  import { CoreHealthCheckModule } from './core/modules/health-check/core-health-check.module';
33
+ import { CorePermissionsModule } from './core/modules/permissions/core-permissions.module';
27
34
  import { CoreSystemSetupModule } from './core/modules/system-setup/core-system-setup.module';
28
35
 
29
36
  /**
@@ -48,6 +55,8 @@ export class CoreModule implements NestModule {
48
55
  * Integrate middleware, e.g. GraphQL upload handing for express
49
56
  */
50
57
  configure(consumer: MiddlewareConsumer) {
58
+ // RequestContext middleware must run for all routes to provide AsyncLocalStorage context
59
+ consumer.apply(RequestContextMiddleware).forRoutes('*');
51
60
  if (CoreModule.graphQlEnabled) {
52
61
  consumer.apply(graphqlUploadExpress()).forRoutes('graphql');
53
62
  }
@@ -185,6 +194,29 @@ export class CoreModule implements NestModule {
185
194
  options,
186
195
  );
187
196
 
197
+ // Wrap connectionFactory to add security plugins (password hashing, role guard)
198
+ const originalConnectionFactory = config.mongoose?.options?.connectionFactory;
199
+ config.mongoose.options = config.mongoose.options || {};
200
+ config.mongoose.options.connectionFactory = (connection, name) => {
201
+ // Run original factory first (includes mongooseIdPlugin from defaults)
202
+ if (originalConnectionFactory) {
203
+ connection = originalConnectionFactory(connection, name);
204
+ }
205
+ // Add password hashing plugin (enabled by default, opt-out via config)
206
+ if (config.security?.mongoosePasswordPlugin !== false) {
207
+ connection.plugin(mongoosePasswordPlugin);
208
+ }
209
+ // Add role guard plugin (enabled by default, opt-out via config)
210
+ if (config.security?.mongooseRoleGuardPlugin !== false) {
211
+ connection.plugin(mongooseRoleGuardPlugin);
212
+ }
213
+ // Add audit fields plugin (enabled by default, opt-out via config)
214
+ if (config.security?.mongooseAuditFieldsPlugin !== false) {
215
+ connection.plugin(mongooseAuditFieldsPlugin);
216
+ }
217
+ return connection;
218
+ };
219
+
188
220
  // Check secrets
189
221
  const jwtConfig = config.jwt;
190
222
  if (jwtConfig?.secret && jwtConfig.secret && jwtConfig.refresh && jwtConfig.refresh.secret === jwtConfig.secret) {
@@ -234,6 +266,26 @@ export class CoreModule implements NestModule {
234
266
  });
235
267
  }
236
268
 
269
+ // TranslateResponseInterceptor: Applies _translations based on Accept-Language header
270
+ // Registered after security interceptors → runs before them on response
271
+ // Translation happens before security checks strip restricted fields
272
+ if (config.security?.translateResponseInterceptor !== false) {
273
+ providers.push({
274
+ provide: APP_INTERCEPTOR,
275
+ useClass: TranslateResponseInterceptor,
276
+ });
277
+ }
278
+
279
+ // ResponseModelInterceptor: Auto-converts plain objects to model instances
280
+ // Registered last → runs first on response (NestJS reverse order for interceptors)
281
+ // This ensures plain objects get securityCheck() and @Restricted metadata before other interceptors check them
282
+ if (config.security?.responseModelInterceptor !== false) {
283
+ providers.push({
284
+ provide: APP_INTERCEPTOR,
285
+ useClass: ResponseModelInterceptor,
286
+ });
287
+ }
288
+
237
289
  if (config.mongoose?.modelDocumentation) {
238
290
  providers.push(ModelDocService);
239
291
  }
@@ -271,6 +323,12 @@ export class CoreModule implements NestModule {
271
323
  imports.push(CoreHealthCheckModule);
272
324
  }
273
325
 
326
+ // Permissions report (development tool)
327
+ const permissionsConfig = config.permissions;
328
+ if (permissionsConfig === true || (typeof permissionsConfig === 'object' && permissionsConfig.enabled !== false)) {
329
+ imports.push(CorePermissionsModule.forRoot(permissionsConfig));
330
+ }
331
+
274
332
  // Add CoreBetterAuthModule based on mode
275
333
  // IAM-only mode: BetterAuth is enabled by default (it's the only auth option)
276
334
  // Legacy mode: Only register if autoRegister is explicitly true
@@ -368,7 +426,7 @@ export class CoreModule implements NestModule {
368
426
  subscriptions: {
369
427
  'graphql-ws': {
370
428
  context: ({ extra }) => extra,
371
- onConnect: async (context: Context<any>) => {
429
+ onConnect: async (context: Context<any, any>) => {
372
430
  const { connectionParams, extra } = context;
373
431
  const enableAuth = graphQlOpts?.enableSubscriptionAuth ?? true;
374
432
 
@@ -463,7 +521,7 @@ export class CoreModule implements NestModule {
463
521
  subscriptions: {
464
522
  'graphql-ws': {
465
523
  context: ({ extra }) => extra,
466
- onConnect: async (context: Context<any>) => {
524
+ onConnect: async (context: Context<any, any>) => {
467
525
  const { connectionParams, extra } = context;
468
526
  const enableAuth = graphQlOpts?.enableSubscriptionAuth ?? true;
469
527
 
@@ -575,7 +633,7 @@ export class CoreModule implements NestModule {
575
633
  subscriptions: {
576
634
  'graphql-ws': {
577
635
  context: ({ extra }) => extra,
578
- onConnect: async (context: Context<any>) => {
636
+ onConnect: async (context: Context<any, any>) => {
579
637
  const { connectionParams, extra } = context;
580
638
  if (enableSubscriptionAuth) {
581
639
  // get authToken from authorization header
package/src/index.ts CHANGED
@@ -16,6 +16,7 @@ export * from './core/common/decorators/graphql-service-options.decorator';
16
16
  export * from './core/common/decorators/graphql-user.decorator';
17
17
  export * from './core/common/decorators/rest-service-options.decorator';
18
18
  export * from './core/common/decorators/rest-user.decorator';
19
+ export * from './core/common/decorators/response-model.decorator';
19
20
  export * from './core/common/decorators/restricted.decorator';
20
21
  export * from './core/common/decorators/roles.decorator';
21
22
  export * from './core/common/decorators/translatable.decorator';
@@ -34,6 +35,7 @@ export * from './core/common/helpers/decorator.helper';
34
35
  export * from './core/common/helpers/file.helper';
35
36
  export * from './core/common/helpers/filter.helper';
36
37
  export * from './core/common/helpers/graphql.helper';
38
+ export * from './core/common/helpers/interceptor.helper';
37
39
  export * from './core/common/helpers/gridfs.helper';
38
40
  export * from './core/common/helpers/input.helper';
39
41
  export * from './core/common/helpers/logging.helper';
@@ -49,6 +51,8 @@ export * from './core/common/inputs/single-filter.input';
49
51
  export * from './core/common/inputs/sort.input';
50
52
  export * from './core/common/interceptors/check-response.interceptor';
51
53
  export * from './core/common/interceptors/check-security.interceptor';
54
+ export * from './core/common/interceptors/response-model.interceptor';
55
+ export * from './core/common/interceptors/translate-response.interceptor';
52
56
  export * from './core/common/interfaces/core-persistence-model.interface';
53
57
  export * from './core/common/interfaces/cron-job-config-with-time-zone.interface';
54
58
  export * from './core/common/interfaces/cron-job-config-with-utc-offset.interface';
@@ -59,6 +63,7 @@ export * from './core/common/interfaces/prepare-output-options.interface';
59
63
  export * from './core/common/interfaces/resolve-selector.interface';
60
64
  export * from './core/common/interfaces/server-options.interface';
61
65
  export * from './core/common/interfaces/service-options.interface';
66
+ export * from './core/common/middleware/request-context.middleware';
62
67
  export * from './core/common/middlewares/to-lower-case.middleware';
63
68
  export * from './core/common/models/core-model.model';
64
69
  export * from './core/common/models/core-persistence.model';
@@ -67,6 +72,9 @@ export * from './core/common/pipes/check-input.pipe';
67
72
  export * from './core/common/pipes/map-and-validate.pipe';
68
73
  export * from './core/common/plugins/complexity.plugin';
69
74
  export * from './core/common/plugins/mongoose-id.plugin';
75
+ export * from './core/common/plugins/mongoose-audit-fields.plugin';
76
+ export * from './core/common/plugins/mongoose-password.plugin';
77
+ export * from './core/common/plugins/mongoose-role-guard.plugin';
70
78
  export * from './core/common/scalars/any.scalar';
71
79
  export * from './core/common/scalars/date-timestamp.scalar';
72
80
  export * from './core/common/scalars/date.scalar';
@@ -78,7 +86,9 @@ export * from './core/common/services/crud.service';
78
86
  export * from './core/common/services/email.service';
79
87
  export * from './core/common/services/mailjet.service';
80
88
  export * from './core/common/services/model-doc.service';
89
+ export * from './core/common/services/model-registry.service';
81
90
  export * from './core/common/services/module.service';
91
+ export * from './core/common/services/request-context.service';
82
92
  export * from './core/common/services/template.service';
83
93
  export * from './core/common/types/array-element.type';
84
94
  export * from './core/common/types/core-model-constructor.type';
@@ -167,6 +177,16 @@ export * from './core/modules/health-check/core-health-check.service';
167
177
 
168
178
  export * from './core/modules/migrate';
169
179
 
180
+ // =====================================================================================================================
181
+ // Core - Modules - Permissions
182
+ // =====================================================================================================================
183
+
184
+ export * from './core/modules/permissions/core-permissions.controller';
185
+ export * from './core/modules/permissions/core-permissions.module';
186
+ export * from './core/modules/permissions/core-permissions.service';
187
+ export * from './core/modules/permissions/interfaces/permissions.interface';
188
+ export * from './core/modules/permissions/permissions-scanner';
189
+
170
190
  // =====================================================================================================================
171
191
  // Core - Modules - SystemSetup
172
192
  // =====================================================================================================================