@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.
Files changed (198) hide show
  1. package/README.md +146 -1330
  2. package/cjs/classes/api-controller.class.js +325 -49
  3. package/cjs/classes/api-service.class.js +271 -149
  4. package/cjs/classes/handle-custome-db.js +37 -0
  5. package/cjs/classes/index.js +2 -2
  6. package/cjs/classes/winston.logger.class.js +103 -70
  7. package/cjs/constants/index.js +15 -4
  8. package/cjs/constants/message-keys.js +68 -0
  9. package/cjs/constants/permissions.js +287 -0
  10. package/cjs/decorators/api-response.decorator.js +2 -3
  11. package/cjs/decorators/index.js +1 -0
  12. package/cjs/decorators/log-action.decorator.js +149 -0
  13. package/cjs/decorators/require-permission.decorator.js +5 -5
  14. package/cjs/dtos/delete.dto.js +10 -0
  15. package/cjs/dtos/filter-and-pagination.dto.js +24 -34
  16. package/cjs/dtos/get-by-ids.dto.js +65 -0
  17. package/cjs/dtos/identity-response.dto.js +4 -8
  18. package/cjs/dtos/index.js +1 -0
  19. package/cjs/dtos/pagination.dto.js +4 -8
  20. package/cjs/dtos/response-payload.dto.js +68 -112
  21. package/cjs/entities/identity.js +12 -6
  22. package/cjs/entities/index.js +1 -0
  23. package/cjs/entities/raw-type.js +4 -0
  24. package/cjs/entities/user-root.js +15 -15
  25. package/cjs/enums/index.js +20 -0
  26. package/cjs/enums/notification-type.enum.js +17 -0
  27. package/cjs/enums/participant-status.enum.js +17 -0
  28. package/cjs/enums/recurrence-type.enum.js +18 -0
  29. package/cjs/exceptions/base-app.exception.js +151 -0
  30. package/cjs/exceptions/index.js +1 -0
  31. package/cjs/exceptions/permission.exception.js +13 -9
  32. package/cjs/filters/global-exception.filter.js +279 -0
  33. package/cjs/filters/index.js +18 -0
  34. package/cjs/guards/jwt-auth.guard.js +4 -1
  35. package/cjs/guards/permission.guard.js +88 -148
  36. package/cjs/index.js +2 -0
  37. package/cjs/interceptors/idempotency.interceptor.js +1 -1
  38. package/cjs/interceptors/index.js +1 -4
  39. package/cjs/interceptors/set-user-field-on-body.interceptor.js +60 -0
  40. package/cjs/interceptors/slug.interceptor.js +30 -9
  41. package/cjs/interfaces/datasource.interface.js +4 -0
  42. package/cjs/interfaces/event-manager-adapter.interface.js +11 -0
  43. package/cjs/interfaces/index.js +4 -2
  44. package/cjs/interfaces/module-config.interface.js +4 -0
  45. package/cjs/interfaces/notification-adapter.interface.js +11 -0
  46. package/cjs/interfaces/permission.interface.js +1 -1
  47. package/cjs/middlewares/logger.middleware.js +133 -115
  48. package/cjs/modules/cache/cache.module.js +3 -3
  49. package/cjs/modules/datasource/index.js +0 -1
  50. package/cjs/modules/datasource/multi-tenant-datasource.service.js +60 -183
  51. package/cjs/modules/utils/utils.service.js +27 -206
  52. package/cjs/utils/date-time.util.js +94 -0
  53. package/cjs/utils/html-sanitizer.util.js +64 -0
  54. package/cjs/utils/index.js +5 -1
  55. package/cjs/utils/query-helpers.util.js +60 -0
  56. package/cjs/utils/request.util.js +96 -0
  57. package/cjs/utils/string.util.js +63 -0
  58. package/classes/api-controller.class.d.ts +16 -8
  59. package/classes/api-service.class.d.ts +30 -25
  60. package/classes/handle-custome-db.d.ts +3 -0
  61. package/classes/index.d.ts +2 -2
  62. package/classes/winston.logger.class.d.ts +1 -0
  63. package/constants/index.d.ts +2 -1
  64. package/constants/message-keys.d.ts +45 -0
  65. package/constants/permissions.d.ts +306 -0
  66. package/decorators/api-response.decorator.d.ts +1 -1
  67. package/decorators/current-user.decorator.d.ts +1 -1
  68. package/decorators/index.d.ts +1 -0
  69. package/decorators/log-action.decorator.d.ts +8 -0
  70. package/decorators/require-permission.decorator.d.ts +2 -2
  71. package/dtos/delete.dto.d.ts +1 -0
  72. package/dtos/filter-and-pagination.dto.d.ts +0 -2
  73. package/dtos/get-by-ids.dto.d.ts +4 -0
  74. package/dtos/index.d.ts +1 -0
  75. package/dtos/response-payload.dto.d.ts +8 -20
  76. package/entities/index.d.ts +1 -0
  77. package/entities/raw-type.d.ts +1 -0
  78. package/enums/index.d.ts +3 -0
  79. package/enums/notification-type.enum.d.ts +6 -0
  80. package/enums/participant-status.enum.d.ts +6 -0
  81. package/enums/recurrence-type.enum.d.ts +7 -0
  82. package/exceptions/base-app.exception.d.ts +41 -0
  83. package/exceptions/index.d.ts +1 -0
  84. package/exceptions/permission.exception.d.ts +2 -2
  85. package/fesm/classes/api-controller.class.js +326 -50
  86. package/fesm/classes/api-service.class.js +274 -152
  87. package/fesm/classes/handle-custome-db.js +19 -0
  88. package/fesm/classes/index.js +3 -2
  89. package/fesm/classes/winston.logger.class.js +100 -68
  90. package/fesm/constants/index.js +4 -1
  91. package/fesm/constants/message-keys.js +49 -0
  92. package/fesm/constants/permissions.js +200 -0
  93. package/fesm/decorators/api-response.decorator.js +3 -21
  94. package/fesm/decorators/index.js +1 -0
  95. package/fesm/decorators/log-action.decorator.js +139 -0
  96. package/fesm/decorators/require-permission.decorator.js +17 -65
  97. package/fesm/dtos/delete.dto.js +12 -2
  98. package/fesm/dtos/filter-and-pagination.dto.js +26 -47
  99. package/fesm/dtos/get-by-ids.dto.js +55 -0
  100. package/fesm/dtos/identity-response.dto.js +4 -8
  101. package/fesm/dtos/index.js +1 -0
  102. package/fesm/dtos/pagination.dto.js +4 -8
  103. package/fesm/dtos/response-payload.dto.js +68 -103
  104. package/fesm/entities/identity.js +12 -6
  105. package/fesm/entities/index.js +1 -0
  106. package/fesm/entities/raw-type.js +1 -0
  107. package/fesm/entities/user-root.js +15 -15
  108. package/fesm/enums/index.js +3 -0
  109. package/fesm/enums/notification-type.enum.js +7 -0
  110. package/fesm/enums/participant-status.enum.js +7 -0
  111. package/fesm/enums/recurrence-type.enum.js +8 -0
  112. package/fesm/exceptions/base-app.exception.js +115 -0
  113. package/fesm/exceptions/index.js +1 -0
  114. package/fesm/exceptions/permission.exception.js +16 -18
  115. package/fesm/filters/global-exception.filter.js +269 -0
  116. package/fesm/filters/index.js +1 -0
  117. package/fesm/guards/jwt-auth.guard.js +5 -2
  118. package/fesm/guards/permission.guard.js +90 -150
  119. package/fesm/index.js +2 -0
  120. package/fesm/interceptors/idempotency.interceptor.js +2 -2
  121. package/fesm/interceptors/index.js +1 -4
  122. package/fesm/interceptors/set-user-field-on-body.interceptor.js +39 -0
  123. package/fesm/interceptors/slug.interceptor.js +31 -10
  124. package/fesm/interfaces/datasource.interface.js +1 -0
  125. package/fesm/interfaces/event-manager-adapter.interface.js +1 -0
  126. package/fesm/interfaces/index.js +4 -2
  127. package/fesm/interfaces/module-config.interface.js +5 -0
  128. package/fesm/interfaces/notification-adapter.interface.js +1 -0
  129. package/fesm/interfaces/permission.interface.js +1 -3
  130. package/fesm/middlewares/logger.middleware.js +133 -109
  131. package/fesm/modules/cache/cache.module.js +2 -2
  132. package/fesm/modules/datasource/index.js +0 -1
  133. package/fesm/modules/datasource/multi-tenant-datasource.service.js +61 -184
  134. package/fesm/modules/utils/utils.service.js +27 -206
  135. package/fesm/utils/date-time.util.js +70 -0
  136. package/fesm/utils/html-sanitizer.util.js +69 -0
  137. package/fesm/utils/index.js +5 -1
  138. package/fesm/utils/query-helpers.util.js +85 -0
  139. package/fesm/utils/request.util.js +81 -0
  140. package/fesm/utils/string.util.js +71 -0
  141. package/filters/global-exception.filter.d.ts +9 -0
  142. package/filters/index.d.ts +1 -0
  143. package/guards/permission.guard.d.ts +4 -6
  144. package/index.d.ts +2 -0
  145. package/interceptors/idempotency.interceptor.d.ts +1 -1
  146. package/interceptors/index.d.ts +1 -4
  147. package/interceptors/set-user-field-on-body.interceptor.d.ts +5 -0
  148. package/interceptors/slug.interceptor.d.ts +2 -1
  149. package/interfaces/api.interface.d.ts +4 -2
  150. package/interfaces/datasource.interface.d.ts +5 -0
  151. package/interfaces/event-manager-adapter.interface.d.ts +43 -0
  152. package/interfaces/identity.interface.d.ts +4 -4
  153. package/interfaces/index.d.ts +4 -2
  154. package/interfaces/logged-user-info.interface.d.ts +0 -2
  155. package/interfaces/module-config.interface.d.ts +6 -0
  156. package/interfaces/notification-adapter.interface.d.ts +21 -0
  157. package/interfaces/permission.interface.d.ts +13 -9
  158. package/middlewares/logger.middleware.d.ts +2 -2
  159. package/modules/datasource/index.d.ts +0 -1
  160. package/modules/datasource/multi-tenant-datasource.service.d.ts +5 -16
  161. package/modules/utils/utils.service.d.ts +3 -14
  162. package/package.json +21 -14
  163. package/utils/date-time.util.d.ts +8 -0
  164. package/utils/html-sanitizer.util.d.ts +2 -0
  165. package/utils/index.d.ts +5 -1
  166. package/utils/query-helpers.util.d.ts +16 -0
  167. package/utils/request.util.d.ts +6 -0
  168. package/utils/string.util.d.ts +2 -0
  169. package/cjs/classes/request-scoped-api.service.js +0 -61
  170. package/cjs/classes/winston-logger-adapter.class.js +0 -121
  171. package/cjs/interceptors/query-performance.interceptor.js +0 -66
  172. package/cjs/interceptors/set-create-by-on-body.interceptor.js +0 -40
  173. package/cjs/interceptors/set-delete-by-on-body.interceptor.js +0 -40
  174. package/cjs/interceptors/set-update-by-on-body.interceptor.js +0 -40
  175. package/cjs/interfaces/base-query.interface.js +0 -6
  176. package/cjs/interfaces/logger.interface.js +0 -7
  177. package/cjs/modules/datasource/datasource.module.js +0 -120
  178. package/cjs/utils/error-handler.util.js +0 -67
  179. package/classes/request-scoped-api.service.d.ts +0 -13
  180. package/classes/winston-logger-adapter.class.d.ts +0 -20
  181. package/fesm/classes/request-scoped-api.service.js +0 -51
  182. package/fesm/classes/winston-logger-adapter.class.js +0 -124
  183. package/fesm/interceptors/query-performance.interceptor.js +0 -56
  184. package/fesm/interceptors/set-create-by-on-body.interceptor.js +0 -30
  185. package/fesm/interceptors/set-delete-by-on-body.interceptor.js +0 -30
  186. package/fesm/interceptors/set-update-by-on-body.interceptor.js +0 -30
  187. package/fesm/interfaces/base-query.interface.js +0 -3
  188. package/fesm/interfaces/logger.interface.js +0 -4
  189. package/fesm/modules/datasource/datasource.module.js +0 -110
  190. package/fesm/utils/error-handler.util.js +0 -59
  191. package/interceptors/query-performance.interceptor.d.ts +0 -8
  192. package/interceptors/set-create-by-on-body.interceptor.d.ts +0 -5
  193. package/interceptors/set-delete-by-on-body.interceptor.d.ts +0 -5
  194. package/interceptors/set-update-by-on-body.interceptor.d.ts +0 -5
  195. package/interfaces/base-query.interface.d.ts +0 -7
  196. package/interfaces/logger.interface.d.ts +0 -7
  197. package/modules/datasource/datasource.module.d.ts +0 -18
  198. 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,3 +0,0 @@
1
- /**
2
- * Base query DTO interface for list/search endpoints
3
- */ export { };
@@ -1,4 +0,0 @@
1
- /**
2
- * Logger interface for dependency injection
3
- * Compatible with Winston, NestJS Logger, and console
4
- */ export { };
@@ -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);