@flusys/nestjs-shared 1.1.0-beta → 1.2.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +146 -1330
- package/cjs/classes/api-controller.class.js +325 -49
- package/cjs/classes/api-service.class.js +271 -149
- package/cjs/classes/handle-custome-db.js +37 -0
- package/cjs/classes/index.js +2 -2
- package/cjs/classes/winston.logger.class.js +103 -70
- package/cjs/constants/index.js +15 -4
- package/cjs/constants/message-keys.js +68 -0
- package/cjs/constants/permissions.js +287 -0
- package/cjs/decorators/api-response.decorator.js +2 -3
- package/cjs/decorators/index.js +1 -0
- package/cjs/decorators/log-action.decorator.js +149 -0
- package/cjs/decorators/require-permission.decorator.js +5 -5
- package/cjs/dtos/delete.dto.js +10 -0
- package/cjs/dtos/filter-and-pagination.dto.js +24 -34
- package/cjs/dtos/get-by-ids.dto.js +65 -0
- package/cjs/dtos/identity-response.dto.js +4 -8
- package/cjs/dtos/index.js +1 -0
- package/cjs/dtos/pagination.dto.js +4 -8
- package/cjs/dtos/response-payload.dto.js +68 -112
- package/cjs/entities/identity.js +12 -6
- package/cjs/entities/index.js +1 -0
- package/cjs/entities/raw-type.js +4 -0
- package/cjs/entities/user-root.js +15 -15
- package/cjs/enums/index.js +20 -0
- package/cjs/enums/notification-type.enum.js +17 -0
- package/cjs/enums/participant-status.enum.js +17 -0
- package/cjs/enums/recurrence-type.enum.js +18 -0
- package/cjs/exceptions/base-app.exception.js +151 -0
- package/cjs/exceptions/index.js +1 -0
- package/cjs/exceptions/permission.exception.js +13 -9
- package/cjs/filters/global-exception.filter.js +279 -0
- package/cjs/filters/index.js +18 -0
- package/cjs/guards/jwt-auth.guard.js +4 -1
- package/cjs/guards/permission.guard.js +88 -148
- package/cjs/index.js +2 -0
- package/cjs/interceptors/idempotency.interceptor.js +1 -1
- package/cjs/interceptors/index.js +1 -4
- package/cjs/interceptors/set-user-field-on-body.interceptor.js +60 -0
- package/cjs/interceptors/slug.interceptor.js +30 -9
- package/cjs/interfaces/datasource.interface.js +4 -0
- package/cjs/interfaces/event-manager-adapter.interface.js +11 -0
- package/cjs/interfaces/index.js +4 -2
- package/cjs/interfaces/module-config.interface.js +4 -0
- package/cjs/interfaces/notification-adapter.interface.js +11 -0
- package/cjs/interfaces/permission.interface.js +1 -1
- package/cjs/middlewares/logger.middleware.js +133 -115
- package/cjs/modules/cache/cache.module.js +3 -3
- package/cjs/modules/datasource/index.js +0 -1
- package/cjs/modules/datasource/multi-tenant-datasource.service.js +60 -183
- package/cjs/modules/utils/utils.service.js +27 -206
- package/cjs/utils/date-time.util.js +94 -0
- package/cjs/utils/html-sanitizer.util.js +64 -0
- package/cjs/utils/index.js +5 -1
- package/cjs/utils/query-helpers.util.js +60 -0
- package/cjs/utils/request.util.js +96 -0
- package/cjs/utils/string.util.js +63 -0
- package/classes/api-controller.class.d.ts +16 -8
- package/classes/api-service.class.d.ts +30 -25
- package/classes/handle-custome-db.d.ts +3 -0
- package/classes/index.d.ts +2 -2
- package/classes/winston.logger.class.d.ts +1 -0
- package/constants/index.d.ts +2 -1
- package/constants/message-keys.d.ts +45 -0
- package/constants/permissions.d.ts +306 -0
- package/decorators/api-response.decorator.d.ts +1 -1
- package/decorators/current-user.decorator.d.ts +1 -1
- package/decorators/index.d.ts +1 -0
- package/decorators/log-action.decorator.d.ts +8 -0
- package/decorators/require-permission.decorator.d.ts +2 -2
- package/dtos/delete.dto.d.ts +1 -0
- package/dtos/filter-and-pagination.dto.d.ts +0 -2
- package/dtos/get-by-ids.dto.d.ts +4 -0
- package/dtos/index.d.ts +1 -0
- package/dtos/response-payload.dto.d.ts +8 -20
- package/entities/index.d.ts +1 -0
- package/entities/raw-type.d.ts +1 -0
- package/enums/index.d.ts +3 -0
- package/enums/notification-type.enum.d.ts +6 -0
- package/enums/participant-status.enum.d.ts +6 -0
- package/enums/recurrence-type.enum.d.ts +7 -0
- package/exceptions/base-app.exception.d.ts +41 -0
- package/exceptions/index.d.ts +1 -0
- package/exceptions/permission.exception.d.ts +2 -2
- package/fesm/classes/api-controller.class.js +326 -50
- package/fesm/classes/api-service.class.js +274 -152
- package/fesm/classes/handle-custome-db.js +19 -0
- package/fesm/classes/index.js +3 -2
- package/fesm/classes/winston.logger.class.js +100 -68
- package/fesm/constants/index.js +4 -1
- package/fesm/constants/message-keys.js +49 -0
- package/fesm/constants/permissions.js +200 -0
- package/fesm/decorators/api-response.decorator.js +3 -21
- package/fesm/decorators/index.js +1 -0
- package/fesm/decorators/log-action.decorator.js +139 -0
- package/fesm/decorators/require-permission.decorator.js +17 -65
- package/fesm/dtos/delete.dto.js +12 -2
- package/fesm/dtos/filter-and-pagination.dto.js +26 -47
- package/fesm/dtos/get-by-ids.dto.js +55 -0
- package/fesm/dtos/identity-response.dto.js +4 -8
- package/fesm/dtos/index.js +1 -0
- package/fesm/dtos/pagination.dto.js +4 -8
- package/fesm/dtos/response-payload.dto.js +68 -103
- package/fesm/entities/identity.js +12 -6
- package/fesm/entities/index.js +1 -0
- package/fesm/entities/raw-type.js +1 -0
- package/fesm/entities/user-root.js +15 -15
- package/fesm/enums/index.js +3 -0
- package/fesm/enums/notification-type.enum.js +7 -0
- package/fesm/enums/participant-status.enum.js +7 -0
- package/fesm/enums/recurrence-type.enum.js +8 -0
- package/fesm/exceptions/base-app.exception.js +115 -0
- package/fesm/exceptions/index.js +1 -0
- package/fesm/exceptions/permission.exception.js +16 -18
- package/fesm/filters/global-exception.filter.js +269 -0
- package/fesm/filters/index.js +1 -0
- package/fesm/guards/jwt-auth.guard.js +5 -2
- package/fesm/guards/permission.guard.js +90 -150
- package/fesm/index.js +2 -0
- package/fesm/interceptors/idempotency.interceptor.js +2 -2
- package/fesm/interceptors/index.js +1 -4
- package/fesm/interceptors/set-user-field-on-body.interceptor.js +39 -0
- package/fesm/interceptors/slug.interceptor.js +31 -10
- package/fesm/interfaces/datasource.interface.js +1 -0
- package/fesm/interfaces/event-manager-adapter.interface.js +1 -0
- package/fesm/interfaces/index.js +4 -2
- package/fesm/interfaces/module-config.interface.js +5 -0
- package/fesm/interfaces/notification-adapter.interface.js +1 -0
- package/fesm/interfaces/permission.interface.js +1 -3
- package/fesm/middlewares/logger.middleware.js +133 -109
- package/fesm/modules/cache/cache.module.js +2 -2
- package/fesm/modules/datasource/index.js +0 -1
- package/fesm/modules/datasource/multi-tenant-datasource.service.js +61 -184
- package/fesm/modules/utils/utils.service.js +27 -206
- package/fesm/utils/date-time.util.js +70 -0
- package/fesm/utils/html-sanitizer.util.js +69 -0
- package/fesm/utils/index.js +5 -1
- package/fesm/utils/query-helpers.util.js +85 -0
- package/fesm/utils/request.util.js +81 -0
- package/fesm/utils/string.util.js +71 -0
- package/filters/global-exception.filter.d.ts +9 -0
- package/filters/index.d.ts +1 -0
- package/guards/permission.guard.d.ts +4 -6
- package/index.d.ts +2 -0
- package/interceptors/idempotency.interceptor.d.ts +1 -1
- package/interceptors/index.d.ts +1 -4
- package/interceptors/set-user-field-on-body.interceptor.d.ts +5 -0
- package/interceptors/slug.interceptor.d.ts +2 -1
- package/interfaces/api.interface.d.ts +4 -2
- package/interfaces/datasource.interface.d.ts +5 -0
- package/interfaces/event-manager-adapter.interface.d.ts +43 -0
- package/interfaces/identity.interface.d.ts +4 -4
- package/interfaces/index.d.ts +4 -2
- package/interfaces/logged-user-info.interface.d.ts +0 -2
- package/interfaces/module-config.interface.d.ts +6 -0
- package/interfaces/notification-adapter.interface.d.ts +21 -0
- package/interfaces/permission.interface.d.ts +13 -9
- package/middlewares/logger.middleware.d.ts +2 -2
- package/modules/datasource/index.d.ts +0 -1
- package/modules/datasource/multi-tenant-datasource.service.d.ts +5 -16
- package/modules/utils/utils.service.d.ts +3 -14
- package/package.json +21 -14
- package/utils/date-time.util.d.ts +8 -0
- package/utils/html-sanitizer.util.d.ts +2 -0
- package/utils/index.d.ts +5 -1
- package/utils/query-helpers.util.d.ts +16 -0
- package/utils/request.util.d.ts +6 -0
- package/utils/string.util.d.ts +2 -0
- package/cjs/classes/request-scoped-api.service.js +0 -61
- package/cjs/classes/winston-logger-adapter.class.js +0 -121
- package/cjs/interceptors/query-performance.interceptor.js +0 -66
- package/cjs/interceptors/set-create-by-on-body.interceptor.js +0 -40
- package/cjs/interceptors/set-delete-by-on-body.interceptor.js +0 -40
- package/cjs/interceptors/set-update-by-on-body.interceptor.js +0 -40
- package/cjs/interfaces/base-query.interface.js +0 -6
- package/cjs/interfaces/logger.interface.js +0 -7
- package/cjs/modules/datasource/datasource.module.js +0 -120
- package/cjs/utils/error-handler.util.js +0 -67
- package/classes/request-scoped-api.service.d.ts +0 -13
- package/classes/winston-logger-adapter.class.d.ts +0 -20
- package/fesm/classes/request-scoped-api.service.js +0 -51
- package/fesm/classes/winston-logger-adapter.class.js +0 -124
- package/fesm/interceptors/query-performance.interceptor.js +0 -56
- package/fesm/interceptors/set-create-by-on-body.interceptor.js +0 -30
- package/fesm/interceptors/set-delete-by-on-body.interceptor.js +0 -30
- package/fesm/interceptors/set-update-by-on-body.interceptor.js +0 -30
- package/fesm/interfaces/base-query.interface.js +0 -3
- package/fesm/interfaces/logger.interface.js +0 -4
- package/fesm/modules/datasource/datasource.module.js +0 -110
- package/fesm/utils/error-handler.util.js +0 -59
- package/interceptors/query-performance.interceptor.d.ts +0 -8
- package/interceptors/set-create-by-on-body.interceptor.d.ts +0 -5
- package/interceptors/set-delete-by-on-body.interceptor.d.ts +0 -5
- package/interceptors/set-update-by-on-body.interceptor.d.ts +0 -5
- package/interfaces/base-query.interface.d.ts +0 -7
- package/interfaces/logger.interface.d.ts +0 -7
- package/modules/datasource/datasource.module.d.ts +0 -18
- package/utils/error-handler.util.d.ts +0 -24
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
Object.defineProperty(exports, "DataSourceModule", {
|
|
6
|
-
enumerable: true,
|
|
7
|
-
get: function() {
|
|
8
|
-
return DataSourceModule;
|
|
9
|
-
}
|
|
10
|
-
});
|
|
11
|
-
const _nestjscore = require("@flusys/nestjs-core");
|
|
12
|
-
const _common = require("@nestjs/common");
|
|
13
|
-
const _multitenantdatasourceservice = require("./multi-tenant-datasource.service");
|
|
14
|
-
function _ts_decorate(decorators, target, key, desc) {
|
|
15
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
16
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
17
|
-
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
18
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
19
|
-
}
|
|
20
|
-
let DataSourceModule = class DataSourceModule {
|
|
21
|
-
/**
|
|
22
|
-
* Register with static options
|
|
23
|
-
*/ static forRoot(options) {
|
|
24
|
-
const { global = false, ...moduleOptions } = options;
|
|
25
|
-
return {
|
|
26
|
-
module: DataSourceModule,
|
|
27
|
-
global,
|
|
28
|
-
providers: [
|
|
29
|
-
{
|
|
30
|
-
provide: _nestjscore.MODULE_OPTIONS,
|
|
31
|
-
useValue: moduleOptions
|
|
32
|
-
},
|
|
33
|
-
_multitenantdatasourceservice.MultiTenantDataSourceService
|
|
34
|
-
],
|
|
35
|
-
exports: [
|
|
36
|
-
_nestjscore.MODULE_OPTIONS,
|
|
37
|
-
_multitenantdatasourceservice.MultiTenantDataSourceService
|
|
38
|
-
]
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Register with async options
|
|
43
|
-
*/ static forRootAsync(asyncOptions) {
|
|
44
|
-
const { global = false, imports = [] } = asyncOptions;
|
|
45
|
-
return {
|
|
46
|
-
module: DataSourceModule,
|
|
47
|
-
global,
|
|
48
|
-
imports,
|
|
49
|
-
providers: [
|
|
50
|
-
...this.createAsyncProviders(asyncOptions),
|
|
51
|
-
_multitenantdatasourceservice.MultiTenantDataSourceService
|
|
52
|
-
],
|
|
53
|
-
exports: [
|
|
54
|
-
_nestjscore.MODULE_OPTIONS,
|
|
55
|
-
_multitenantdatasourceservice.MultiTenantDataSourceService
|
|
56
|
-
]
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Import for child modules (uses existing MODULE_OPTIONS)
|
|
61
|
-
*/ static forFeature() {
|
|
62
|
-
return {
|
|
63
|
-
module: DataSourceModule,
|
|
64
|
-
providers: [
|
|
65
|
-
_multitenantdatasourceservice.MultiTenantDataSourceService
|
|
66
|
-
],
|
|
67
|
-
exports: [
|
|
68
|
-
_multitenantdatasourceservice.MultiTenantDataSourceService
|
|
69
|
-
]
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Create async providers based on options
|
|
74
|
-
*/ static createAsyncProviders(options) {
|
|
75
|
-
if (options.useFactory) {
|
|
76
|
-
return [
|
|
77
|
-
{
|
|
78
|
-
provide: _nestjscore.MODULE_OPTIONS,
|
|
79
|
-
useFactory: options.useFactory,
|
|
80
|
-
inject: options.inject || []
|
|
81
|
-
}
|
|
82
|
-
];
|
|
83
|
-
}
|
|
84
|
-
if (options.useClass) {
|
|
85
|
-
return [
|
|
86
|
-
{
|
|
87
|
-
provide: options.useClass,
|
|
88
|
-
useClass: options.useClass
|
|
89
|
-
},
|
|
90
|
-
{
|
|
91
|
-
provide: _nestjscore.MODULE_OPTIONS,
|
|
92
|
-
useFactory: async (factory)=>factory.createOptions(),
|
|
93
|
-
inject: [
|
|
94
|
-
options.useClass
|
|
95
|
-
]
|
|
96
|
-
}
|
|
97
|
-
];
|
|
98
|
-
}
|
|
99
|
-
if (options.useExisting) {
|
|
100
|
-
return [
|
|
101
|
-
{
|
|
102
|
-
provide: _nestjscore.MODULE_OPTIONS,
|
|
103
|
-
useFactory: async (factory)=>factory.createOptions(),
|
|
104
|
-
inject: [
|
|
105
|
-
options.useExisting
|
|
106
|
-
]
|
|
107
|
-
}
|
|
108
|
-
];
|
|
109
|
-
}
|
|
110
|
-
return [
|
|
111
|
-
{
|
|
112
|
-
provide: _nestjscore.MODULE_OPTIONS,
|
|
113
|
-
useValue: {}
|
|
114
|
-
}
|
|
115
|
-
];
|
|
116
|
-
}
|
|
117
|
-
};
|
|
118
|
-
DataSourceModule = _ts_decorate([
|
|
119
|
-
(0, _common.Module)({})
|
|
120
|
-
], DataSourceModule);
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
Object.defineProperty(exports, "ErrorHandler", {
|
|
6
|
-
enumerable: true,
|
|
7
|
-
get: function() {
|
|
8
|
-
return ErrorHandler;
|
|
9
|
-
}
|
|
10
|
-
});
|
|
11
|
-
let ErrorHandler = class ErrorHandler {
|
|
12
|
-
/**
|
|
13
|
-
* Safely extract error message from unknown error
|
|
14
|
-
*/ static getErrorMessage(error) {
|
|
15
|
-
if (error instanceof Error) {
|
|
16
|
-
return error.message;
|
|
17
|
-
}
|
|
18
|
-
if (typeof error === 'string') {
|
|
19
|
-
return error;
|
|
20
|
-
}
|
|
21
|
-
return 'Unknown error occurred';
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Safely extract error stack from unknown error
|
|
25
|
-
*/ static getErrorStack(error) {
|
|
26
|
-
if (error instanceof Error) {
|
|
27
|
-
return error.stack;
|
|
28
|
-
}
|
|
29
|
-
return undefined;
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Create error context object for logging
|
|
33
|
-
*/ static createErrorContext(error, context) {
|
|
34
|
-
const errorContext = {
|
|
35
|
-
error: {
|
|
36
|
-
message: this.getErrorMessage(error)
|
|
37
|
-
}
|
|
38
|
-
};
|
|
39
|
-
if (error instanceof Error) {
|
|
40
|
-
errorContext.error.stack = error.stack;
|
|
41
|
-
errorContext.error.name = error.name;
|
|
42
|
-
}
|
|
43
|
-
if (context && Object.keys(context).length > 0) {
|
|
44
|
-
errorContext.context = context;
|
|
45
|
-
}
|
|
46
|
-
return errorContext;
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Log error with consistent format
|
|
50
|
-
*/ static logError(logger, error, operation, context) {
|
|
51
|
-
const errorContext = this.createErrorContext(error, {
|
|
52
|
-
operation,
|
|
53
|
-
...context
|
|
54
|
-
});
|
|
55
|
-
const errorMessage = `Failed to ${operation}: ${errorContext.error.message}`;
|
|
56
|
-
const loggerContext = logger.context || 'ErrorHandler';
|
|
57
|
-
logger.error(errorMessage, errorContext.error.stack, loggerContext, errorContext);
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Re-throw error with proper type checking
|
|
61
|
-
*/ static rethrowError(error) {
|
|
62
|
-
if (error instanceof Error) {
|
|
63
|
-
throw error;
|
|
64
|
-
}
|
|
65
|
-
throw new Error(`Unexpected error: ${String(error)}`);
|
|
66
|
-
}
|
|
67
|
-
};
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { DataSource, EntityTarget, Repository } from 'typeorm';
|
|
2
|
-
import { Identity } from '../entities';
|
|
3
|
-
import { ApiService } from './api-service.class';
|
|
4
|
-
export declare abstract class RequestScopedApiService<CreateDtoT extends Record<string, unknown>, UpdateDtoT extends {
|
|
5
|
-
id: string;
|
|
6
|
-
}, InterfaceT extends Identity, EntityT extends Identity, RepositoryT extends Repository<EntityT>> extends ApiService<CreateDtoT, UpdateDtoT, InterfaceT, EntityT, RepositoryT> {
|
|
7
|
-
private repositoryInitialized;
|
|
8
|
-
protected abstract resolveEntity(): EntityTarget<EntityT>;
|
|
9
|
-
protected abstract getDataSourceProvider(): any;
|
|
10
|
-
protected ensureRepositoryInitialized(): Promise<void>;
|
|
11
|
-
protected initializeAdditionalRepositories(entities: EntityTarget<any>[]): Promise<Repository<any>[]>;
|
|
12
|
-
protected getDataSourceForService(): Promise<DataSource>;
|
|
13
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { Logger } from '@nestjs/common';
|
|
2
|
-
import { ILogger } from '../interfaces/logger.interface';
|
|
3
|
-
export declare class WinstonLoggerAdapter implements ILogger {
|
|
4
|
-
private readonly context?;
|
|
5
|
-
constructor(context?: string);
|
|
6
|
-
log(message: string, context?: string, ...args: any[]): void;
|
|
7
|
-
error(message: string, trace?: string, context?: string, ...args: any[]): void;
|
|
8
|
-
warn(message: string, context?: string, ...args: any[]): void;
|
|
9
|
-
debug(message: string, context?: string, ...args: any[]): void;
|
|
10
|
-
verbose(message: string, context?: string, ...args: any[]): void;
|
|
11
|
-
}
|
|
12
|
-
export declare class NestLoggerAdapter implements ILogger {
|
|
13
|
-
private readonly logger;
|
|
14
|
-
constructor(logger: Logger);
|
|
15
|
-
log(message: string, context?: string, ...args: any[]): void;
|
|
16
|
-
error(message: string, trace?: string, context?: string, ...args: any[]): void;
|
|
17
|
-
warn(message: string, context?: string, ...args: any[]): void;
|
|
18
|
-
debug(message: string, context?: string, ...args: any[]): void;
|
|
19
|
-
verbose(message: string, context?: string, ...args: any[]): void;
|
|
20
|
-
}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
function _define_property(obj, key, value) {
|
|
2
|
-
if (key in obj) {
|
|
3
|
-
Object.defineProperty(obj, key, {
|
|
4
|
-
value: value,
|
|
5
|
-
enumerable: true,
|
|
6
|
-
configurable: true,
|
|
7
|
-
writable: true
|
|
8
|
-
});
|
|
9
|
-
} else {
|
|
10
|
-
obj[key] = value;
|
|
11
|
-
}
|
|
12
|
-
return obj;
|
|
13
|
-
}
|
|
14
|
-
function _ts_decorate(decorators, target, key, desc) {
|
|
15
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
16
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
17
|
-
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
18
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
19
|
-
}
|
|
20
|
-
import { Injectable, Scope } from '@nestjs/common';
|
|
21
|
-
import { ApiService } from './api-service.class';
|
|
22
|
-
export class RequestScopedApiService extends ApiService {
|
|
23
|
-
async ensureRepositoryInitialized() {
|
|
24
|
-
if (!this.repositoryInitialized) {
|
|
25
|
-
const entity = this.resolveEntity();
|
|
26
|
-
const provider = this.getDataSourceProvider();
|
|
27
|
-
this.repository = await provider.getRepository(entity);
|
|
28
|
-
this.repositoryInitialized = true;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
/** Initialize additional repositories beyond the primary entity */ async initializeAdditionalRepositories(entities) {
|
|
32
|
-
const provider = this.getDataSourceProvider();
|
|
33
|
-
const repositories = [];
|
|
34
|
-
for (const entity of entities){
|
|
35
|
-
repositories.push(await provider.getRepository(entity));
|
|
36
|
-
}
|
|
37
|
-
return repositories;
|
|
38
|
-
}
|
|
39
|
-
/** Get DataSource for direct access (transactions, custom queries) */ async getDataSourceForService() {
|
|
40
|
-
const provider = this.getDataSourceProvider();
|
|
41
|
-
return await provider.getDataSource();
|
|
42
|
-
}
|
|
43
|
-
constructor(...args){
|
|
44
|
-
super(...args), _define_property(this, "repositoryInitialized", false);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
RequestScopedApiService = _ts_decorate([
|
|
48
|
-
Injectable({
|
|
49
|
-
scope: Scope.REQUEST
|
|
50
|
-
})
|
|
51
|
-
], RequestScopedApiService);
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
function _define_property(obj, key, value) {
|
|
2
|
-
if (key in obj) {
|
|
3
|
-
Object.defineProperty(obj, key, {
|
|
4
|
-
value: value,
|
|
5
|
-
enumerable: true,
|
|
6
|
-
configurable: true,
|
|
7
|
-
writable: true
|
|
8
|
-
});
|
|
9
|
-
} else {
|
|
10
|
-
obj[key] = value;
|
|
11
|
-
}
|
|
12
|
-
return obj;
|
|
13
|
-
}
|
|
14
|
-
import { instance as winstonLogger } from './winston.logger.class';
|
|
15
|
-
import { getRequestId, getUserId, getTenantId, getCompanyId } from '../middlewares/logger.middleware';
|
|
16
|
-
/**
|
|
17
|
-
* Get correlation context for logging
|
|
18
|
-
* Automatically includes requestId, userId, tenantId, companyId if available
|
|
19
|
-
*/ function getCorrelationMeta() {
|
|
20
|
-
const meta = {};
|
|
21
|
-
const requestId = getRequestId();
|
|
22
|
-
const userId = getUserId();
|
|
23
|
-
const tenantId = getTenantId();
|
|
24
|
-
const companyId = getCompanyId();
|
|
25
|
-
if (requestId) meta.requestId = requestId;
|
|
26
|
-
if (userId) meta.userId = userId;
|
|
27
|
-
if (tenantId) meta.tenantId = tenantId;
|
|
28
|
-
if (companyId) meta.companyId = companyId;
|
|
29
|
-
return meta;
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Winston Logger Adapter
|
|
33
|
-
* Adapts Winston logger to ILogger interface for dependency injection
|
|
34
|
-
*
|
|
35
|
-
* Features:
|
|
36
|
-
* - Automatic correlation ID injection
|
|
37
|
-
* - User ID tracking
|
|
38
|
-
* - Structured metadata logging
|
|
39
|
-
*
|
|
40
|
-
* Usage:
|
|
41
|
-
* ```typescript
|
|
42
|
-
* const logger = new WinstonLoggerAdapter('MyService');
|
|
43
|
-
* logger.log('Operation completed', undefined, { orderId: '123' });
|
|
44
|
-
* // Output: { requestId: 'uuid', userId: 'user-id', context: 'MyService', message: 'Operation completed', orderId: '123' }
|
|
45
|
-
* ```
|
|
46
|
-
*/ export class WinstonLoggerAdapter {
|
|
47
|
-
log(message, context, ...args) {
|
|
48
|
-
const meta = args.length > 0 && typeof args[0] === 'object' ? args[0] : {};
|
|
49
|
-
winstonLogger.info(message, {
|
|
50
|
-
context: context || this.context,
|
|
51
|
-
...getCorrelationMeta(),
|
|
52
|
-
...meta
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
error(message, trace, context, ...args) {
|
|
56
|
-
const meta = args.length > 0 && typeof args[0] === 'object' ? args[0] : {};
|
|
57
|
-
winstonLogger.error(message, {
|
|
58
|
-
context: context || this.context,
|
|
59
|
-
stack: trace,
|
|
60
|
-
...getCorrelationMeta(),
|
|
61
|
-
...meta
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
warn(message, context, ...args) {
|
|
65
|
-
const meta = args.length > 0 && typeof args[0] === 'object' ? args[0] : {};
|
|
66
|
-
winstonLogger.warn(message, {
|
|
67
|
-
context: context || this.context,
|
|
68
|
-
...getCorrelationMeta(),
|
|
69
|
-
...meta
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
debug(message, context, ...args) {
|
|
73
|
-
const meta = args.length > 0 && typeof args[0] === 'object' ? args[0] : {};
|
|
74
|
-
winstonLogger.debug(message, {
|
|
75
|
-
context: context || this.context,
|
|
76
|
-
...getCorrelationMeta(),
|
|
77
|
-
...meta
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
verbose(message, context, ...args) {
|
|
81
|
-
const meta = args.length > 0 && typeof args[0] === 'object' ? args[0] : {};
|
|
82
|
-
winstonLogger.verbose(message, {
|
|
83
|
-
context: context || this.context,
|
|
84
|
-
...getCorrelationMeta(),
|
|
85
|
-
...meta
|
|
86
|
-
});
|
|
87
|
-
}
|
|
88
|
-
constructor(context){
|
|
89
|
-
_define_property(this, "context", void 0);
|
|
90
|
-
this.context = context;
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* NestJS Logger Adapter
|
|
95
|
-
* Adapts NestJS Logger to ILogger interface
|
|
96
|
-
*
|
|
97
|
-
* Use this when you need to use NestJS's built-in logger
|
|
98
|
-
* instead of Winston (e.g., for testing)
|
|
99
|
-
*/ export class NestLoggerAdapter {
|
|
100
|
-
log(message, context, ...args) {
|
|
101
|
-
const logMessage = args.length > 0 ? `${message} ${JSON.stringify(args)}` : message;
|
|
102
|
-
this.logger.log(logMessage, context);
|
|
103
|
-
}
|
|
104
|
-
error(message, trace, context, ...args) {
|
|
105
|
-
const logMessage = args.length > 0 ? `${message} ${JSON.stringify(args)}` : message;
|
|
106
|
-
this.logger.error(logMessage, trace, context);
|
|
107
|
-
}
|
|
108
|
-
warn(message, context, ...args) {
|
|
109
|
-
const logMessage = args.length > 0 ? `${message} ${JSON.stringify(args)}` : message;
|
|
110
|
-
this.logger.warn(logMessage, context);
|
|
111
|
-
}
|
|
112
|
-
debug(message, context, ...args) {
|
|
113
|
-
const logMessage = args.length > 0 ? `${message} ${JSON.stringify(args)}` : message;
|
|
114
|
-
this.logger.debug(logMessage, context);
|
|
115
|
-
}
|
|
116
|
-
verbose(message, context, ...args) {
|
|
117
|
-
const logMessage = args.length > 0 ? `${message} ${JSON.stringify(args)}` : message;
|
|
118
|
-
this.logger.verbose(logMessage, context);
|
|
119
|
-
}
|
|
120
|
-
constructor(logger){
|
|
121
|
-
_define_property(this, "logger", void 0);
|
|
122
|
-
this.logger = logger;
|
|
123
|
-
}
|
|
124
|
-
}
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
function _define_property(obj, key, value) {
|
|
2
|
-
if (key in obj) {
|
|
3
|
-
Object.defineProperty(obj, key, {
|
|
4
|
-
value: value,
|
|
5
|
-
enumerable: true,
|
|
6
|
-
configurable: true,
|
|
7
|
-
writable: true
|
|
8
|
-
});
|
|
9
|
-
} else {
|
|
10
|
-
obj[key] = value;
|
|
11
|
-
}
|
|
12
|
-
return obj;
|
|
13
|
-
}
|
|
14
|
-
function _ts_decorate(decorators, target, key, desc) {
|
|
15
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
16
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
17
|
-
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
18
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
19
|
-
}
|
|
20
|
-
function _ts_metadata(k, v) {
|
|
21
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
22
|
-
}
|
|
23
|
-
import { Injectable, Logger } from '@nestjs/common';
|
|
24
|
-
import { tap } from 'rxjs/operators';
|
|
25
|
-
export class QueryPerformanceInterceptor {
|
|
26
|
-
intercept(context, next) {
|
|
27
|
-
const request = context.switchToHttp().getRequest();
|
|
28
|
-
const { method, url } = request;
|
|
29
|
-
const handler = context.getHandler().name;
|
|
30
|
-
const controller = context.getClass().name;
|
|
31
|
-
const startTime = Date.now();
|
|
32
|
-
return next.handle().pipe(tap(()=>{
|
|
33
|
-
const executionTime = Date.now() - startTime;
|
|
34
|
-
if (executionTime > this.threshold) {
|
|
35
|
-
this.logger.warn(`Slow request detected: ${method} ${url} | ` + `Controller: ${controller}.${handler} | ` + `Execution time: ${executionTime}ms`);
|
|
36
|
-
} else {
|
|
37
|
-
// Optional: Log all requests in debug mode
|
|
38
|
-
this.logger.debug(`${method} ${url} | ${controller}.${handler} | ${executionTime}ms`);
|
|
39
|
-
}
|
|
40
|
-
}));
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* @param threshold - Time threshold in milliseconds (default: 1000ms)
|
|
44
|
-
*/ constructor(threshold = 1000){
|
|
45
|
-
_define_property(this, "logger", new Logger(QueryPerformanceInterceptor.name));
|
|
46
|
-
_define_property(this, "threshold", void 0);
|
|
47
|
-
this.threshold = threshold;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
QueryPerformanceInterceptor = _ts_decorate([
|
|
51
|
-
Injectable(),
|
|
52
|
-
_ts_metadata("design:type", Function),
|
|
53
|
-
_ts_metadata("design:paramtypes", [
|
|
54
|
-
Number
|
|
55
|
-
])
|
|
56
|
-
], QueryPerformanceInterceptor);
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
function _ts_decorate(decorators, target, key, desc) {
|
|
2
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
-
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
-
}
|
|
7
|
-
import { Injectable } from '@nestjs/common';
|
|
8
|
-
export class SetCreatedByOnBody {
|
|
9
|
-
intercept(context, next) {
|
|
10
|
-
const request = context.switchToHttp().getRequest();
|
|
11
|
-
const user = request?.user;
|
|
12
|
-
if (user) {
|
|
13
|
-
if (Array.isArray(request.body)) {
|
|
14
|
-
request.body = request.body.map((item)=>({
|
|
15
|
-
...item,
|
|
16
|
-
createdById: user.id
|
|
17
|
-
}));
|
|
18
|
-
} else if (typeof request.body === 'object' && request.body !== null) {
|
|
19
|
-
request.body = {
|
|
20
|
-
...request.body,
|
|
21
|
-
createdById: user.id
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
return next.handle();
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
SetCreatedByOnBody = _ts_decorate([
|
|
29
|
-
Injectable()
|
|
30
|
-
], SetCreatedByOnBody);
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
function _ts_decorate(decorators, target, key, desc) {
|
|
2
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
-
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
-
}
|
|
7
|
-
import { Injectable } from '@nestjs/common';
|
|
8
|
-
export class SetDeletedByOnBody {
|
|
9
|
-
intercept(context, next) {
|
|
10
|
-
const request = context.switchToHttp().getRequest();
|
|
11
|
-
const user = request?.user;
|
|
12
|
-
if (user) {
|
|
13
|
-
if (Array.isArray(request.body)) {
|
|
14
|
-
request.body = request.body.map((item)=>({
|
|
15
|
-
...item,
|
|
16
|
-
deletedById: user.id
|
|
17
|
-
}));
|
|
18
|
-
} else if (typeof request.body === 'object' && request.body !== null) {
|
|
19
|
-
request.body = {
|
|
20
|
-
...request.body,
|
|
21
|
-
deletedById: user.id
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
return next.handle();
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
SetDeletedByOnBody = _ts_decorate([
|
|
29
|
-
Injectable()
|
|
30
|
-
], SetDeletedByOnBody);
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
function _ts_decorate(decorators, target, key, desc) {
|
|
2
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
-
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
-
}
|
|
7
|
-
import { Injectable } from '@nestjs/common';
|
|
8
|
-
export class SetUpdateByOnBody {
|
|
9
|
-
intercept(context, next) {
|
|
10
|
-
const request = context.switchToHttp().getRequest();
|
|
11
|
-
const user = request?.user;
|
|
12
|
-
if (user) {
|
|
13
|
-
if (Array.isArray(request.body)) {
|
|
14
|
-
request.body = request.body.map((item)=>({
|
|
15
|
-
...item,
|
|
16
|
-
updatedById: user.id
|
|
17
|
-
}));
|
|
18
|
-
} else if (typeof request.body === 'object' && request.body !== null) {
|
|
19
|
-
request.body = {
|
|
20
|
-
...request.body,
|
|
21
|
-
updatedById: user.id
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
return next.handle();
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
SetUpdateByOnBody = _ts_decorate([
|
|
29
|
-
Injectable()
|
|
30
|
-
], SetUpdateByOnBody);
|
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
function _ts_decorate(decorators, target, key, desc) {
|
|
2
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
-
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
-
}
|
|
7
|
-
import { MODULE_OPTIONS } from '@flusys/nestjs-core';
|
|
8
|
-
import { Module } from '@nestjs/common';
|
|
9
|
-
import { MultiTenantDataSourceService } from './multi-tenant-datasource.service';
|
|
10
|
-
export class DataSourceModule {
|
|
11
|
-
/**
|
|
12
|
-
* Register with static options
|
|
13
|
-
*/ static forRoot(options) {
|
|
14
|
-
const { global = false, ...moduleOptions } = options;
|
|
15
|
-
return {
|
|
16
|
-
module: DataSourceModule,
|
|
17
|
-
global,
|
|
18
|
-
providers: [
|
|
19
|
-
{
|
|
20
|
-
provide: MODULE_OPTIONS,
|
|
21
|
-
useValue: moduleOptions
|
|
22
|
-
},
|
|
23
|
-
MultiTenantDataSourceService
|
|
24
|
-
],
|
|
25
|
-
exports: [
|
|
26
|
-
MODULE_OPTIONS,
|
|
27
|
-
MultiTenantDataSourceService
|
|
28
|
-
]
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Register with async options
|
|
33
|
-
*/ static forRootAsync(asyncOptions) {
|
|
34
|
-
const { global = false, imports = [] } = asyncOptions;
|
|
35
|
-
return {
|
|
36
|
-
module: DataSourceModule,
|
|
37
|
-
global,
|
|
38
|
-
imports,
|
|
39
|
-
providers: [
|
|
40
|
-
...this.createAsyncProviders(asyncOptions),
|
|
41
|
-
MultiTenantDataSourceService
|
|
42
|
-
],
|
|
43
|
-
exports: [
|
|
44
|
-
MODULE_OPTIONS,
|
|
45
|
-
MultiTenantDataSourceService
|
|
46
|
-
]
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Import for child modules (uses existing MODULE_OPTIONS)
|
|
51
|
-
*/ static forFeature() {
|
|
52
|
-
return {
|
|
53
|
-
module: DataSourceModule,
|
|
54
|
-
providers: [
|
|
55
|
-
MultiTenantDataSourceService
|
|
56
|
-
],
|
|
57
|
-
exports: [
|
|
58
|
-
MultiTenantDataSourceService
|
|
59
|
-
]
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Create async providers based on options
|
|
64
|
-
*/ static createAsyncProviders(options) {
|
|
65
|
-
if (options.useFactory) {
|
|
66
|
-
return [
|
|
67
|
-
{
|
|
68
|
-
provide: MODULE_OPTIONS,
|
|
69
|
-
useFactory: options.useFactory,
|
|
70
|
-
inject: options.inject || []
|
|
71
|
-
}
|
|
72
|
-
];
|
|
73
|
-
}
|
|
74
|
-
if (options.useClass) {
|
|
75
|
-
return [
|
|
76
|
-
{
|
|
77
|
-
provide: options.useClass,
|
|
78
|
-
useClass: options.useClass
|
|
79
|
-
},
|
|
80
|
-
{
|
|
81
|
-
provide: MODULE_OPTIONS,
|
|
82
|
-
useFactory: async (factory)=>factory.createOptions(),
|
|
83
|
-
inject: [
|
|
84
|
-
options.useClass
|
|
85
|
-
]
|
|
86
|
-
}
|
|
87
|
-
];
|
|
88
|
-
}
|
|
89
|
-
if (options.useExisting) {
|
|
90
|
-
return [
|
|
91
|
-
{
|
|
92
|
-
provide: MODULE_OPTIONS,
|
|
93
|
-
useFactory: async (factory)=>factory.createOptions(),
|
|
94
|
-
inject: [
|
|
95
|
-
options.useExisting
|
|
96
|
-
]
|
|
97
|
-
}
|
|
98
|
-
];
|
|
99
|
-
}
|
|
100
|
-
return [
|
|
101
|
-
{
|
|
102
|
-
provide: MODULE_OPTIONS,
|
|
103
|
-
useValue: {}
|
|
104
|
-
}
|
|
105
|
-
];
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
DataSourceModule = _ts_decorate([
|
|
109
|
-
Module({})
|
|
110
|
-
], DataSourceModule);
|