@lenne.tech/nest-server 11.17.0 → 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 (91) hide show
  1. package/dist/config.env.js +2 -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 +14 -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.module.js +36 -0
  59. package/dist/core.module.js.map +1 -1
  60. package/dist/index.d.ts +10 -0
  61. package/dist/index.js +10 -0
  62. package/dist/index.js.map +1 -1
  63. package/dist/server/modules/file/file-info.model.d.ts +12 -12
  64. package/dist/server/modules/user/user.model.d.ts +33 -33
  65. package/dist/tsconfig.build.tsbuildinfo +1 -1
  66. package/package.json +35 -30
  67. package/src/config.env.ts +2 -2
  68. package/src/core/common/decorators/response-model.decorator.ts +31 -0
  69. package/src/core/common/helpers/db.helper.ts +2 -2
  70. package/src/core/common/helpers/filter.helper.ts +3 -3
  71. package/src/core/common/helpers/input.helper.ts +2 -2
  72. package/src/core/common/helpers/interceptor.helper.ts +132 -0
  73. package/src/core/common/helpers/service.helper.ts +1 -1
  74. package/src/core/common/interceptors/check-security.interceptor.ts +44 -1
  75. package/src/core/common/interceptors/response-model.interceptor.ts +135 -0
  76. package/src/core/common/interceptors/translate-response.interceptor.ts +104 -0
  77. package/src/core/common/interfaces/server-options.interface.ts +160 -0
  78. package/src/core/common/middleware/request-context.middleware.ts +25 -0
  79. package/src/core/common/pipes/map-and-validate.pipe.ts +2 -2
  80. package/src/core/common/plugins/complexity.plugin.ts +2 -2
  81. package/src/core/common/plugins/mongoose-audit-fields.plugin.ts +74 -0
  82. package/src/core/common/plugins/mongoose-password.plugin.ts +100 -0
  83. package/src/core/common/plugins/mongoose-role-guard.plugin.ts +150 -0
  84. package/src/core/common/services/config.service.ts +2 -2
  85. package/src/core/common/services/model-registry.service.ts +25 -0
  86. package/src/core/common/services/module.service.ts +91 -1
  87. package/src/core/common/services/request-context.service.ts +69 -0
  88. package/src/core/modules/auth/guards/auth.guard.ts +2 -2
  89. package/src/core/modules/better-auth/core-better-auth.resolver.ts +2 -2
  90. package/src/core.module.ts +55 -4
  91. package/src/index.ts +10 -0
@@ -5,10 +5,13 @@ import { ProcessType } from '../enums/process-type.enum';
5
5
  import { getStringIds, popAndMap } from '../helpers/db.helper';
6
6
  import { check } from '../helpers/input.helper';
7
7
  import { prepareInput, prepareOutput } from '../helpers/service.helper';
8
+ import { getTranslatablePropertyKeys, updateLanguage } from '../decorators/translatable.decorator';
8
9
  import { ServiceOptions } from '../interfaces/service-options.interface';
9
10
  import { CoreModel } from '../models/core-model.model';
10
11
  import { FieldSelection } from '../types/field-selection.type';
11
12
  import { ConfigService } from './config.service';
13
+ import { ModelRegistry } from './model-registry.service';
14
+ import { RequestContext } from './request-context.service';
12
15
 
13
16
  /**
14
17
  * Module service class to be extended by concrete module services
@@ -40,6 +43,11 @@ export abstract class ModuleService<T extends CoreModel = any> {
40
43
  this.configService = options?.configService;
41
44
  this.mainDbModel = options?.mainDbModel;
42
45
  this.mainModelConstructor = options?.mainModelConstructor;
46
+
47
+ // Auto-register model class for ResponseModelInterceptor lookups
48
+ if (options?.mainModelConstructor && options?.mainDbModel?.modelName) {
49
+ ModelRegistry.register(options.mainDbModel.modelName, options.mainModelConstructor);
50
+ }
43
51
  }
44
52
 
45
53
  /**
@@ -191,7 +199,10 @@ export abstract class ModuleService<T extends CoreModel = any> {
191
199
  }
192
200
 
193
201
  // Run service function
194
- let result = await serviceFunc(config);
202
+ // When force is enabled, bypass the Mongoose role guard plugin as well
203
+ let result = config.force
204
+ ? await RequestContext.runWithBypassRoleGuard(() => serviceFunc(config))
205
+ : await serviceFunc(config);
195
206
 
196
207
  // Pop and map main model
197
208
  if (config.processFieldSelection && config.fieldSelection && this.processFieldSelection) {
@@ -242,6 +253,85 @@ export abstract class ModuleService<T extends CoreModel = any> {
242
253
  return result;
243
254
  }
244
255
 
256
+ /**
257
+ * Simplified result processing for direct Mongoose queries.
258
+ * Handles population and output preparation without the full process() pipeline.
259
+ *
260
+ * Security (password hashing, role guard, createdBy/updatedBy, type mapping,
261
+ * field filtering, secret removal, translations) is handled automatically
262
+ * by the safety net (Mongoose plugins + interceptors).
263
+ *
264
+ * Use this when bypassing CrudService methods but still wanting
265
+ * population and custom prepareOutput() transformations.
266
+ *
267
+ * Note: This method does NOT perform authorization checks (checkRights).
268
+ * The caller is responsible for verifying permissions before calling this method.
269
+ *
270
+ * @example
271
+ * ```typescript
272
+ * // Direct Mongoose query with result processing
273
+ * const doc = await this.mainDbModel.findById(id).exec();
274
+ * return this.processResult(doc, serviceOptions);
275
+ *
276
+ * // Aggregate with result processing
277
+ * const results = await this.mainDbModel.aggregate(pipeline).exec();
278
+ * return this.processResult(results, serviceOptions);
279
+ * ```
280
+ */
281
+ async processResult(result: any, serviceOptions: ServiceOptions = {}): Promise<any> {
282
+ if (!result) {
283
+ return result;
284
+ }
285
+
286
+ // Population (if GraphQL field selection is available)
287
+ if (serviceOptions.fieldSelection && this.processFieldSelection) {
288
+ const populateOpts = serviceOptions.processFieldSelection || {};
289
+ const items = Array.isArray(result) ? result : [result];
290
+ for (const item of items) {
291
+ await this.processFieldSelection(item, serviceOptions.fieldSelection, populateOpts);
292
+ }
293
+ }
294
+
295
+ // Custom prepareOutput (type mapping, ObjectId conversion, custom overrides)
296
+ if (this.prepareOutput) {
297
+ result = await this.prepareOutput(result, serviceOptions);
298
+ }
299
+
300
+ return result;
301
+ }
302
+
303
+ /**
304
+ * Apply translation-aware input processing.
305
+ * Auto-detects @Translatable fields on the model and routes non-base-language
306
+ * values into _translations.
307
+ *
308
+ * @param input - The input data to transform
309
+ * @param oldDoc - The existing document from DB (needed for value comparison)
310
+ * @param language - Language code (defaults to RequestContext.getLanguage())
311
+ * @returns The transformed input with translations stored in _translations
312
+ *
313
+ * @example
314
+ * ```typescript
315
+ * // In a custom update method:
316
+ * const oldDoc = await this.mainDbModel.findById(id).lean();
317
+ * input = this.applyTranslationInput(input, oldDoc, serviceOptions.language);
318
+ * return this.mainDbModel.findByIdAndUpdate(id, input, { returnDocument: 'after' }).exec();
319
+ * ```
320
+ */
321
+ protected applyTranslationInput(input: any, oldDoc: any, language?: string): any {
322
+ language = language || RequestContext.getLanguage();
323
+ if (!language) {
324
+ return input;
325
+ }
326
+
327
+ const translatableFields = getTranslatablePropertyKeys(this.mainModelConstructor);
328
+ if (translatableFields.length === 0) {
329
+ return input;
330
+ }
331
+
332
+ return updateLanguage(language, input, oldDoc, translatableFields);
333
+ }
334
+
245
335
  /**
246
336
  * Prepare input before save
247
337
  */
@@ -0,0 +1,69 @@
1
+ import { AsyncLocalStorage } from 'async_hooks';
2
+
3
+ export interface IRequestContext {
4
+ currentUser?: {
5
+ id: string;
6
+ hasRole?: (roles: string[]) => boolean;
7
+ roles?: string[];
8
+ };
9
+ language?: string;
10
+ /** When true, mongooseRoleGuardPlugin allows role changes regardless of user permissions */
11
+ bypassRoleGuard?: boolean;
12
+ }
13
+
14
+ /**
15
+ * Request-scoped context using AsyncLocalStorage.
16
+ * Provides access to the current user in Mongoose hooks and other
17
+ * places where NestJS request scope is not available.
18
+ */
19
+ export class RequestContext {
20
+ private static storage = new AsyncLocalStorage<IRequestContext>();
21
+
22
+ static run<T>(context: IRequestContext, fn: () => T): T {
23
+ return this.storage.run(context, fn);
24
+ }
25
+
26
+ static get(): IRequestContext | undefined {
27
+ return this.storage.getStore();
28
+ }
29
+
30
+ static getCurrentUser(): IRequestContext['currentUser'] | undefined {
31
+ return this.storage.getStore()?.currentUser;
32
+ }
33
+
34
+ static getLanguage(): string | undefined {
35
+ return this.storage.getStore()?.language;
36
+ }
37
+
38
+ /**
39
+ * Check if the role guard bypass is active for the current context.
40
+ */
41
+ static isBypassRoleGuard(): boolean {
42
+ return this.storage.getStore()?.bypassRoleGuard === true;
43
+ }
44
+
45
+ /**
46
+ * Run a function with the role guard bypass enabled.
47
+ * The current context (user, language) is preserved; only bypassRoleGuard is added.
48
+ *
49
+ * Use this when authorized code needs to set roles on users, e.g.:
50
+ * - signUp with default roles
51
+ * - Admin panel where a non-admin role (e.g. HR_MANAGER) creates users with roles
52
+ * - System setup creating initial admin
53
+ *
54
+ * @example
55
+ * ```typescript
56
+ * await RequestContext.runWithBypassRoleGuard(async () => {
57
+ * await this.mainDbModel.findByIdAndUpdate(userId, { roles: ['EMPLOYEE'] });
58
+ * });
59
+ * ```
60
+ */
61
+ static runWithBypassRoleGuard<T>(fn: () => T): T {
62
+ const currentStore = this.storage.getStore();
63
+ const context: IRequestContext = {
64
+ ...currentStore,
65
+ bypassRoleGuard: true,
66
+ };
67
+ return this.storage.run(context, fn);
68
+ }
69
+ }
@@ -40,8 +40,8 @@ const createPassportContext =
40
40
  try {
41
41
  request.authInfo = info;
42
42
  return resolve(callback(err, user, info));
43
- } catch (err) {
44
- reject(err);
43
+ } catch (callbackError) {
44
+ reject(callbackError);
45
45
  }
46
46
  })(request, response, (err: any) => (err ? reject(err) : resolve(undefined))),
47
47
  );
@@ -342,9 +342,9 @@ export class CoreBetterAuthResolver {
342
342
  // 1. accessToken (JWT plugin enriched response)
343
343
  // 2. token (top-level, some BetterAuth versions)
344
344
  // 3. session.token (session-based fallback)
345
- const responseAny = response as any;
345
+ const tokenResponse = response as any;
346
346
  const rawToken =
347
- responseAny.accessToken || responseAny.token || (hasSession(response) ? response.session.token : undefined);
347
+ tokenResponse.accessToken || tokenResponse.token || (hasSession(response) ? response.session.token : undefined);
348
348
  const token = await this.resolveJwtToken(rawToken);
349
349
 
350
350
  return {
@@ -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';
@@ -49,6 +55,8 @@ export class CoreModule implements NestModule {
49
55
  * Integrate middleware, e.g. GraphQL upload handing for express
50
56
  */
51
57
  configure(consumer: MiddlewareConsumer) {
58
+ // RequestContext middleware must run for all routes to provide AsyncLocalStorage context
59
+ consumer.apply(RequestContextMiddleware).forRoutes('*');
52
60
  if (CoreModule.graphQlEnabled) {
53
61
  consumer.apply(graphqlUploadExpress()).forRoutes('graphql');
54
62
  }
@@ -186,6 +194,29 @@ export class CoreModule implements NestModule {
186
194
  options,
187
195
  );
188
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
+
189
220
  // Check secrets
190
221
  const jwtConfig = config.jwt;
191
222
  if (jwtConfig?.secret && jwtConfig.secret && jwtConfig.refresh && jwtConfig.refresh.secret === jwtConfig.secret) {
@@ -235,6 +266,26 @@ export class CoreModule implements NestModule {
235
266
  });
236
267
  }
237
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
+
238
289
  if (config.mongoose?.modelDocumentation) {
239
290
  providers.push(ModelDocService);
240
291
  }
@@ -375,7 +426,7 @@ export class CoreModule implements NestModule {
375
426
  subscriptions: {
376
427
  'graphql-ws': {
377
428
  context: ({ extra }) => extra,
378
- onConnect: async (context: Context<any>) => {
429
+ onConnect: async (context: Context<any, any>) => {
379
430
  const { connectionParams, extra } = context;
380
431
  const enableAuth = graphQlOpts?.enableSubscriptionAuth ?? true;
381
432
 
@@ -470,7 +521,7 @@ export class CoreModule implements NestModule {
470
521
  subscriptions: {
471
522
  'graphql-ws': {
472
523
  context: ({ extra }) => extra,
473
- onConnect: async (context: Context<any>) => {
524
+ onConnect: async (context: Context<any, any>) => {
474
525
  const { connectionParams, extra } = context;
475
526
  const enableAuth = graphQlOpts?.enableSubscriptionAuth ?? true;
476
527
 
@@ -582,7 +633,7 @@ export class CoreModule implements NestModule {
582
633
  subscriptions: {
583
634
  'graphql-ws': {
584
635
  context: ({ extra }) => extra,
585
- onConnect: async (context: Context<any>) => {
636
+ onConnect: async (context: Context<any, any>) => {
586
637
  const { connectionParams, extra } = context;
587
638
  if (enableSubscriptionAuth) {
588
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';