@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.
- package/dist/config.env.js +8 -2
- package/dist/config.env.js.map +1 -1
- package/dist/core/common/decorators/response-model.decorator.d.ts +3 -0
- package/dist/core/common/decorators/response-model.decorator.js +8 -0
- package/dist/core/common/decorators/response-model.decorator.js.map +1 -0
- package/dist/core/common/helpers/db.helper.js +2 -2
- package/dist/core/common/helpers/db.helper.js.map +1 -1
- package/dist/core/common/helpers/filter.helper.js +3 -3
- package/dist/core/common/helpers/filter.helper.js.map +1 -1
- package/dist/core/common/helpers/input.helper.js +2 -2
- package/dist/core/common/helpers/input.helper.js.map +1 -1
- package/dist/core/common/helpers/interceptor.helper.d.ts +3 -0
- package/dist/core/common/helpers/interceptor.helper.js +84 -0
- package/dist/core/common/helpers/interceptor.helper.js.map +1 -0
- package/dist/core/common/helpers/service.helper.d.ts +1 -0
- package/dist/core/common/helpers/service.helper.js +1 -0
- package/dist/core/common/helpers/service.helper.js.map +1 -1
- package/dist/core/common/interceptors/check-security.interceptor.d.ts +2 -0
- package/dist/core/common/interceptors/check-security.interceptor.js +43 -1
- package/dist/core/common/interceptors/check-security.interceptor.js.map +1 -1
- package/dist/core/common/interceptors/response-model.interceptor.d.ts +13 -0
- package/dist/core/common/interceptors/response-model.interceptor.js +107 -0
- package/dist/core/common/interceptors/response-model.interceptor.js.map +1 -0
- package/dist/core/common/interceptors/translate-response.interceptor.d.ts +8 -0
- package/dist/core/common/interceptors/translate-response.interceptor.js +85 -0
- package/dist/core/common/interceptors/translate-response.interceptor.js.map +1 -0
- package/dist/core/common/interfaces/server-options.interface.d.ts +16 -0
- package/dist/core/common/middleware/request-context.middleware.d.ts +5 -0
- package/dist/core/common/middleware/request-context.middleware.js +29 -0
- package/dist/core/common/middleware/request-context.middleware.js.map +1 -0
- package/dist/core/common/pipes/map-and-validate.pipe.js +2 -2
- package/dist/core/common/pipes/map-and-validate.pipe.js.map +1 -1
- package/dist/core/common/plugins/complexity.plugin.d.ts +2 -2
- package/dist/core/common/plugins/mongoose-audit-fields.plugin.d.ts +1 -0
- package/dist/core/common/plugins/mongoose-audit-fields.plugin.js +51 -0
- package/dist/core/common/plugins/mongoose-audit-fields.plugin.js.map +1 -0
- package/dist/core/common/plugins/mongoose-password.plugin.d.ts +4 -0
- package/dist/core/common/plugins/mongoose-password.plugin.js +69 -0
- package/dist/core/common/plugins/mongoose-password.plugin.js.map +1 -0
- package/dist/core/common/plugins/mongoose-role-guard.plugin.d.ts +1 -0
- package/dist/core/common/plugins/mongoose-role-guard.plugin.js +80 -0
- package/dist/core/common/plugins/mongoose-role-guard.plugin.js.map +1 -0
- package/dist/core/common/services/config.service.js +2 -2
- package/dist/core/common/services/config.service.js.map +1 -1
- package/dist/core/common/services/model-registry.service.d.ts +8 -0
- package/dist/core/common/services/model-registry.service.js +20 -0
- package/dist/core/common/services/model-registry.service.js.map +1 -0
- package/dist/core/common/services/module.service.d.ts +2 -0
- package/dist/core/common/services/module.service.js +36 -1
- package/dist/core/common/services/module.service.js.map +1 -1
- package/dist/core/common/services/request-context.service.d.ts +18 -0
- package/dist/core/common/services/request-context.service.js +32 -0
- package/dist/core/common/services/request-context.service.js.map +1 -0
- package/dist/core/modules/auth/guards/auth.guard.js +2 -2
- package/dist/core/modules/auth/guards/auth.guard.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth.resolver.js +2 -2
- package/dist/core/modules/better-auth/core-better-auth.resolver.js.map +1 -1
- package/dist/core/modules/permissions/core-permissions.controller.d.ts +13 -0
- package/dist/core/modules/permissions/core-permissions.controller.js +71 -0
- package/dist/core/modules/permissions/core-permissions.controller.js.map +1 -0
- package/dist/core/modules/permissions/core-permissions.module.d.ts +5 -0
- package/dist/core/modules/permissions/core-permissions.module.js +36 -0
- package/dist/core/modules/permissions/core-permissions.module.js.map +1 -0
- package/dist/core/modules/permissions/core-permissions.service.d.ts +34 -0
- package/dist/core/modules/permissions/core-permissions.service.js +610 -0
- package/dist/core/modules/permissions/core-permissions.service.js.map +1 -0
- package/dist/core/modules/permissions/interfaces/permissions.interface.d.ts +93 -0
- package/dist/core/modules/permissions/interfaces/permissions.interface.js +3 -0
- package/dist/core/modules/permissions/interfaces/permissions.interface.js.map +1 -0
- package/dist/core/modules/permissions/permissions-scanner.d.ts +25 -0
- package/dist/core/modules/permissions/permissions-scanner.js +817 -0
- package/dist/core/modules/permissions/permissions-scanner.js.map +1 -0
- package/dist/core.module.js +41 -0
- package/dist/core.module.js.map +1 -1
- package/dist/index.d.ts +15 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -1
- package/dist/server/modules/file/file-info.model.d.ts +12 -12
- package/dist/server/modules/user/user.model.d.ts +33 -33
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +35 -30
- package/src/config.env.ts +8 -2
- package/src/core/common/decorators/response-model.decorator.ts +31 -0
- package/src/core/common/helpers/db.helper.ts +2 -2
- package/src/core/common/helpers/filter.helper.ts +3 -3
- package/src/core/common/helpers/input.helper.ts +2 -2
- package/src/core/common/helpers/interceptor.helper.ts +132 -0
- package/src/core/common/helpers/service.helper.ts +1 -1
- package/src/core/common/interceptors/check-security.interceptor.ts +44 -1
- package/src/core/common/interceptors/response-model.interceptor.ts +135 -0
- package/src/core/common/interceptors/translate-response.interceptor.ts +104 -0
- package/src/core/common/interfaces/server-options.interface.ts +186 -0
- package/src/core/common/middleware/request-context.middleware.ts +25 -0
- package/src/core/common/pipes/map-and-validate.pipe.ts +2 -2
- package/src/core/common/plugins/complexity.plugin.ts +2 -2
- package/src/core/common/plugins/mongoose-audit-fields.plugin.ts +74 -0
- package/src/core/common/plugins/mongoose-password.plugin.ts +100 -0
- package/src/core/common/plugins/mongoose-role-guard.plugin.ts +150 -0
- package/src/core/common/services/config.service.ts +2 -2
- package/src/core/common/services/model-registry.service.ts +25 -0
- package/src/core/common/services/module.service.ts +91 -1
- package/src/core/common/services/request-context.service.ts +69 -0
- package/src/core/modules/auth/guards/auth.guard.ts +2 -2
- package/src/core/modules/better-auth/core-better-auth.resolver.ts +2 -2
- package/src/core/modules/permissions/INTEGRATION-CHECKLIST.md +56 -0
- package/src/core/modules/permissions/README.md +102 -0
- package/src/core/modules/permissions/core-permissions.controller.ts +34 -0
- package/src/core/modules/permissions/core-permissions.module.ts +36 -0
- package/src/core/modules/permissions/core-permissions.service.ts +627 -0
- package/src/core/modules/permissions/interfaces/permissions.interface.ts +125 -0
- package/src/core/modules/permissions/permissions-scanner.ts +1011 -0
- package/src/core.module.ts +62 -4
- package/src/index.ts +20 -0
package/src/core.module.ts
CHANGED
|
@@ -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 '
|
|
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
|
// =====================================================================================================================
|