cqrs-boilerplate-code 1.0.0 → 1.0.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 (128) hide show
  1. package/dist/common-infra/common-infra.module.d.ts +2 -0
  2. package/dist/common-infra/common-infra.module.js +22 -0
  3. package/dist/common-infra/common-infra.module.js.map +1 -0
  4. package/dist/common-infra/database/database.module.d.ts +2 -0
  5. package/dist/common-infra/database/database.module.js +28 -0
  6. package/dist/common-infra/database/database.module.js.map +1 -0
  7. package/dist/common-infra/database/typeorm.config.d.ts +3 -0
  8. package/dist/common-infra/database/typeorm.config.js +18 -0
  9. package/dist/common-infra/database/typeorm.config.js.map +1 -0
  10. package/dist/core-common/constant/app.constant.d.ts +2 -0
  11. package/dist/core-common/constant/app.constant.js +6 -0
  12. package/dist/core-common/constant/app.constant.js.map +1 -0
  13. package/dist/core-common/core-common.module.d.ts +2 -0
  14. package/dist/core-common/core-common.module.js +23 -0
  15. package/dist/core-common/core-common.module.js.map +1 -0
  16. package/dist/core-common/error/custom-error/already-exists.error.d.ts +4 -0
  17. package/dist/core-common/error/custom-error/already-exists.error.js +12 -0
  18. package/dist/core-common/error/custom-error/already-exists.error.js.map +1 -0
  19. package/dist/core-common/error/custom-error/bad-request.error.d.ts +4 -0
  20. package/dist/core-common/error/custom-error/bad-request.error.js +12 -0
  21. package/dist/core-common/error/custom-error/bad-request.error.js.map +1 -0
  22. package/dist/core-common/error/custom-error/conflict.error.d.ts +4 -0
  23. package/dist/core-common/error/custom-error/conflict.error.js +12 -0
  24. package/dist/core-common/error/custom-error/conflict.error.js.map +1 -0
  25. package/dist/core-common/error/custom-error/custom-validation-error.d.ts +5 -0
  26. package/dist/core-common/error/custom-error/custom-validation-error.js +13 -0
  27. package/dist/core-common/error/custom-error/custom-validation-error.js.map +1 -0
  28. package/dist/core-common/error/custom-error/forbidden.error.d.ts +4 -0
  29. package/dist/core-common/error/custom-error/forbidden.error.js +12 -0
  30. package/dist/core-common/error/custom-error/forbidden.error.js.map +1 -0
  31. package/dist/core-common/error/custom-error/internal-server.error.d.ts +4 -0
  32. package/dist/core-common/error/custom-error/internal-server.error.js +12 -0
  33. package/dist/core-common/error/custom-error/internal-server.error.js.map +1 -0
  34. package/dist/core-common/error/custom-error/not-found.error.d.ts +4 -0
  35. package/dist/core-common/error/custom-error/not-found.error.js +12 -0
  36. package/dist/core-common/error/custom-error/not-found.error.js.map +1 -0
  37. package/dist/core-common/error/custom-error/service-unavailable.error.d.ts +4 -0
  38. package/dist/core-common/error/custom-error/service-unavailable.error.js +12 -0
  39. package/dist/core-common/error/custom-error/service-unavailable.error.js.map +1 -0
  40. package/dist/core-common/error/custom-error/unauthorized.error.d.ts +4 -0
  41. package/dist/core-common/error/custom-error/unauthorized.error.js +12 -0
  42. package/dist/core-common/error/custom-error/unauthorized.error.js.map +1 -0
  43. package/dist/core-common/error/custom-error/unprocess-entity.error.d.ts +4 -0
  44. package/dist/core-common/error/custom-error/unprocess-entity.error.js +12 -0
  45. package/dist/core-common/error/custom-error/unprocess-entity.error.js.map +1 -0
  46. package/dist/core-common/error/custom-error/validation.error.d.ts +4 -0
  47. package/dist/core-common/error/custom-error/validation.error.js +12 -0
  48. package/dist/core-common/error/custom-error/validation.error.js.map +1 -0
  49. package/dist/core-common/error/generic.error.d.ts +7 -0
  50. package/dist/core-common/error/generic.error.js +38 -0
  51. package/dist/core-common/error/generic.error.js.map +1 -0
  52. package/{src/core-common/error/index.ts → dist/core-common/error/index.d.ts} +1 -1
  53. package/dist/core-common/error/index.js +27 -0
  54. package/dist/core-common/error/index.js.map +1 -0
  55. package/dist/core-common/index.d.ts +5 -0
  56. package/dist/core-common/index.js +22 -0
  57. package/dist/core-common/index.js.map +1 -0
  58. package/dist/core-common/logger/index.d.ts +29 -0
  59. package/dist/core-common/logger/index.js +125 -0
  60. package/dist/core-common/logger/index.js.map +1 -0
  61. package/dist/core-common/logger/logger.module.d.ts +2 -0
  62. package/dist/core-common/logger/logger.module.js +21 -0
  63. package/dist/core-common/logger/logger.module.js.map +1 -0
  64. package/dist/core-common/logger/logger.provider.d.ts +2 -0
  65. package/dist/core-common/logger/logger.provider.js +9 -0
  66. package/dist/core-common/logger/logger.provider.js.map +1 -0
  67. package/dist/core-common/response-model/generic-error-response.model.d.ts +15 -0
  68. package/dist/core-common/response-model/generic-error-response.model.js +33 -0
  69. package/dist/core-common/response-model/generic-error-response.model.js.map +1 -0
  70. package/dist/core-common/response-model/generic-success-response.model.d.ts +8 -0
  71. package/dist/core-common/response-model/generic-success-response.model.js +17 -0
  72. package/dist/core-common/response-model/generic-success-response.model.js.map +1 -0
  73. package/dist/core-common/result-model/result.d.ts +10 -0
  74. package/dist/core-common/result-model/result.js +38 -0
  75. package/dist/core-common/result-model/result.js.map +1 -0
  76. package/dist/middleware/async-storage.middleware.d.ts +8 -0
  77. package/dist/middleware/async-storage.middleware.js +38 -0
  78. package/dist/middleware/async-storage.middleware.js.map +1 -0
  79. package/dist/middleware/filter/global-exeception.filter.d.ts +5 -0
  80. package/dist/middleware/filter/global-exeception.filter.js +98 -0
  81. package/dist/middleware/filter/global-exeception.filter.js.map +1 -0
  82. package/dist/middleware/index.d.ts +5 -0
  83. package/dist/middleware/index.js +22 -0
  84. package/dist/middleware/index.js.map +1 -0
  85. package/dist/middleware/interceptor/response-handler.d.ts +9 -0
  86. package/dist/middleware/interceptor/response-handler.js +59 -0
  87. package/dist/middleware/interceptor/response-handler.js.map +1 -0
  88. package/dist/middleware/platform-auth.middleware.d.ts +5 -0
  89. package/dist/middleware/platform-auth.middleware.js +22 -0
  90. package/dist/middleware/platform-auth.middleware.js.map +1 -0
  91. package/dist/middleware/utils/http-response.formatter.d.ts +11 -0
  92. package/dist/middleware/utils/http-response.formatter.js +78 -0
  93. package/dist/middleware/utils/http-response.formatter.js.map +1 -0
  94. package/dist/tsconfig.build.tsbuildinfo +1 -0
  95. package/package.json +7 -2
  96. package/.prettierrc +0 -0
  97. package/nest-cli.json +0 -8
  98. package/src/common-infra/common-infra.module.ts +0 -9
  99. package/src/common-infra/database/database.module.ts +0 -15
  100. package/src/common-infra/database/typeorm.config.ts +0 -18
  101. package/src/core-common/constant/app.constant.ts +0 -2
  102. package/src/core-common/core-common.module.ts +0 -9
  103. package/src/core-common/error/custom-error/already-exists.error.ts +0 -17
  104. package/src/core-common/error/custom-error/bad-request.error.ts +0 -8
  105. package/src/core-common/error/custom-error/conflict.error.ts +0 -17
  106. package/src/core-common/error/custom-error/custom-validation-error.ts +0 -9
  107. package/src/core-common/error/custom-error/forbidden.error.ts +0 -8
  108. package/src/core-common/error/custom-error/internal-server.error.ts +0 -11
  109. package/src/core-common/error/custom-error/not-found.error.ts +0 -8
  110. package/src/core-common/error/custom-error/service-unavailable.error.ts +0 -8
  111. package/src/core-common/error/custom-error/unauthorized.error.ts +0 -8
  112. package/src/core-common/error/custom-error/unprocess-entity.error.ts +0 -8
  113. package/src/core-common/error/custom-error/validation.error.ts +0 -8
  114. package/src/core-common/error/generic.error.ts +0 -31
  115. package/src/core-common/logger/index.ts +0 -175
  116. package/src/core-common/logger/logger.module.ts +0 -8
  117. package/src/core-common/logger/logger.provider.ts +0 -7
  118. package/src/core-common/response-model/generic-error-response.model.ts +0 -44
  119. package/src/core-common/response-model/generic-success-response.model.ts +0 -25
  120. package/src/core-common/result-model/result.ts +0 -38
  121. package/src/middleware/async-storage.middleware.ts +0 -29
  122. package/src/middleware/filter/global-exeception.filter.ts +0 -117
  123. package/src/middleware/index.ts +0 -2
  124. package/src/middleware/interceptor/response-handler.ts +0 -69
  125. package/src/middleware/platform-auth.middleware.ts +0 -13
  126. package/src/middleware/utils/http-response.formatter.ts +0 -126
  127. package/tsconfig.build.json +0 -10
  128. package/tsconfig.json +0 -58
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.LoggerService = void 0;
7
+ const winston_1 = __importDefault(require("winston"));
8
+ var SeverityText;
9
+ (function (SeverityText) {
10
+ SeverityText["INFO"] = "Information";
11
+ SeverityText["DEBUG"] = "Debug";
12
+ SeverityText["WARNING"] = "Warning";
13
+ SeverityText["ERROR"] = "Error";
14
+ })(SeverityText || (SeverityText = {}));
15
+ class LoggerService {
16
+ logger;
17
+ deploymentEnv;
18
+ hostImageVersion;
19
+ otelAgentHost;
20
+ constructor(logLevel = "debug") {
21
+ this.deploymentEnv = "rls-dev";
22
+ this.hostImageVersion = process.env.SERVICE_VERSION ?? "202501.1";
23
+ this.otelAgentHost = process.env.OTEL_AGENT_HOST ?? "10.0.0.1";
24
+ this.logger = this.createLogger(logLevel);
25
+ this.overrideConsole();
26
+ }
27
+ log(message, metadata) {
28
+ this.write("info", SeverityText.INFO, message, metadata);
29
+ }
30
+ debug(message, metadata) {
31
+ this.write("debug", SeverityText.DEBUG, message, metadata);
32
+ }
33
+ warn(message, metadata) {
34
+ this.write("warn", SeverityText.WARNING, message, metadata);
35
+ }
36
+ error(message, metadata, error) {
37
+ this.write("error", SeverityText.ERROR, message, metadata, error);
38
+ }
39
+ write(level, severity, message, metadata = {}, error) {
40
+ const body = {
41
+ SeverityText: severity,
42
+ ...metadata,
43
+ ...(error && {
44
+ ErrorMessage: error.message,
45
+ StackTrace: error.stack,
46
+ }),
47
+ };
48
+ this.logger[level](this.redactSecrets(message), body);
49
+ }
50
+ createLogger(level) {
51
+ return winston_1.default.createLogger({
52
+ level,
53
+ levels: winston_1.default.config.npm.levels,
54
+ format: winston_1.default.format.combine(winston_1.default.format.timestamp({ format: "YYYY-MM-DD HH:mm:ss" }), winston_1.default.format.printf(({ level, message, timestamp, ...meta }) => JSON.stringify({
55
+ message: this.safeStringify(message),
56
+ attributes: this.buildAttributes(level),
57
+ timestamp: timestamp,
58
+ ...this.cleanMeta(meta),
59
+ }))),
60
+ transports: [new winston_1.default.transports.Console()],
61
+ });
62
+ }
63
+ buildAttributes(level) {
64
+ return {
65
+ "service.image.version": this.hostImageVersion,
66
+ "deployment.environment": this.deploymentEnv,
67
+ "otel.agent.host": this.otelAgentHost,
68
+ "service.log.level": level,
69
+ };
70
+ }
71
+ cleanMeta(meta) {
72
+ return Object.fromEntries(Object.entries(meta).filter(([_, value]) => value !== undefined && value !== "None"));
73
+ }
74
+ safeStringify(input) {
75
+ try {
76
+ return typeof input === "string"
77
+ ? input
78
+ : JSON.stringify(input, this.circularReplacer());
79
+ }
80
+ catch {
81
+ return "[Unserializable Object]";
82
+ }
83
+ }
84
+ circularReplacer() {
85
+ const seen = new WeakSet();
86
+ return (_, value) => {
87
+ if (typeof value === "object" && value !== null) {
88
+ if (seen.has(value))
89
+ return "[Circular]";
90
+ seen.add(value);
91
+ }
92
+ return value;
93
+ };
94
+ }
95
+ redactSecrets(message) {
96
+ const patterns = [
97
+ {
98
+ name: "JWT",
99
+ regex: /eyJ[a-zA-Z0-9-_]+\.[a-zA-Z0-9-_]+\.[a-zA-Z0-9-_]+/g,
100
+ visible: 10,
101
+ },
102
+ {
103
+ name: "BEARER",
104
+ regex: /Bearer\s+eyJ[A-Za-z0-9\-._~+/]+=*/gi,
105
+ visible: 15,
106
+ },
107
+ { name: "API_KEY", regex: /\b[A-Za-z0-9]{32,}\b/g, visible: 8 },
108
+ { name: "AWS_SECRET", regex: /AKIA[0-9A-Z]{16}/g, visible: 8 },
109
+ ];
110
+ return patterns.reduce((msg, { regex, visible, name }) => {
111
+ return msg.replace(regex, (m) => `${m.slice(0, visible)}...[REDACTED_${name}]`);
112
+ }, message);
113
+ }
114
+ overrideConsole() {
115
+ const blocked = ["NodeSDK", "AuthToken"];
116
+ console.log = (...args) => {
117
+ const msg = args.map(String).join(" ");
118
+ if (blocked.some((k) => msg.includes(k)))
119
+ return;
120
+ this.log(msg);
121
+ };
122
+ }
123
+ }
124
+ exports.LoggerService = LoggerService;
125
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core-common/logger/index.ts"],"names":[],"mappings":"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","sourcesContent":["import winston, { Logger } from \"winston\";\n\n/* ---------------------------------- Types --------------------------------- */\n\nenum SeverityText {\n INFO = \"Information\",\n DEBUG = \"Debug\",\n WARNING = \"Warning\",\n ERROR = \"Error\",\n}\n\ntype LogMetadata = {\n ClassName?: string;\n MethodName?: string;\n};\n\nexport type OrgContext = {\n orgId?: string;\n orgFid?: string;\n userId?: string;\n};\n\n/* --------------------------------- Service -------------------------------- */\n\nexport class LoggerService {\n private readonly logger: Logger;\n private readonly deploymentEnv: string;\n private readonly hostImageVersion: string;\n private readonly otelAgentHost: string;\n\n constructor(logLevel: string = \"debug\") {\n this.deploymentEnv = \"rls-dev\";\n this.hostImageVersion = process.env.SERVICE_VERSION ?? \"202501.1\";\n this.otelAgentHost = process.env.OTEL_AGENT_HOST ?? \"10.0.0.1\";\n this.logger = this.createLogger(logLevel);\n this.overrideConsole();\n }\n\n /* ------------------------------- Public API ------------------------------- */\n\n log(message: string, metadata?: LogMetadata) {\n this.write(\"info\", SeverityText.INFO, message, metadata);\n }\n\n debug(message: string, metadata?: LogMetadata) {\n this.write(\"debug\", SeverityText.DEBUG, message, metadata);\n }\n\n warn(message: string, metadata?: LogMetadata) {\n this.write(\"warn\", SeverityText.WARNING, message, metadata);\n }\n\n error(message: string, metadata?: LogMetadata, error?: Error) {\n this.write(\"error\", SeverityText.ERROR, message, metadata, error);\n }\n\n /* ------------------------------ Logger Core ------------------------------ */\n\n private write(\n level: keyof Logger,\n severity: SeverityText,\n message: string,\n metadata: LogMetadata = {},\n error?: Error,\n ) {\n const body = {\n SeverityText: severity,\n ...metadata,\n ...(error && {\n ErrorMessage: error.message,\n StackTrace: error.stack,\n }),\n };\n\n this.logger[level](this.redactSecrets(message), body);\n }\n\n private createLogger(level: string): Logger {\n return winston.createLogger({\n level,\n levels: winston.config.npm.levels,\n format: winston.format.combine(\n winston.format.timestamp({ format: \"YYYY-MM-DD HH:mm:ss\" }),\n winston.format.printf(({ level, message, timestamp, ...meta }) =>\n JSON.stringify({\n message: this.safeStringify(message),\n attributes: this.buildAttributes(level),\n timestamp: timestamp,\n ...this.cleanMeta(meta),\n }),\n ),\n ),\n transports: [new winston.transports.Console()],\n });\n }\n\n /* ------------------------------- Context -------------------------------- */\n\n private buildAttributes(level: string) {\n return {\n \"service.image.version\": this.hostImageVersion,\n \"deployment.environment\": this.deploymentEnv,\n \"otel.agent.host\": this.otelAgentHost,\n \"service.log.level\": level,\n };\n }\n\n /* ------------------------------- Helpers -------------------------------- */\n\n private cleanMeta(meta: Record<string, unknown>) {\n return Object.fromEntries(\n Object.entries(meta).filter(\n ([_, value]) => value !== undefined && value !== \"None\",\n ),\n );\n }\n\n private safeStringify(input: unknown): string {\n try {\n return typeof input === \"string\"\n ? input\n : JSON.stringify(input, this.circularReplacer());\n } catch {\n return \"[Unserializable Object]\";\n }\n }\n\n private circularReplacer() {\n const seen = new WeakSet();\n return (_: string, value: any) => {\n if (typeof value === \"object\" && value !== null) {\n if (seen.has(value)) return \"[Circular]\";\n seen.add(value);\n }\n return value;\n };\n }\n\n /* ----------------------------- Redaction -------------------------------- */\n\n private redactSecrets(message: string): string {\n const patterns = [\n {\n name: \"JWT\",\n regex: /eyJ[a-zA-Z0-9-_]+\\.[a-zA-Z0-9-_]+\\.[a-zA-Z0-9-_]+/g,\n visible: 10,\n },\n {\n name: \"BEARER\",\n regex: /Bearer\\s+eyJ[A-Za-z0-9\\-._~+/]+=*/gi,\n visible: 15,\n },\n { name: \"API_KEY\", regex: /\\b[A-Za-z0-9]{32,}\\b/g, visible: 8 },\n { name: \"AWS_SECRET\", regex: /AKIA[0-9A-Z]{16}/g, visible: 8 },\n ];\n\n return patterns.reduce((msg, { regex, visible, name }) => {\n return msg.replace(\n regex,\n (m) => `${m.slice(0, visible)}...[REDACTED_${name}]`,\n );\n }, message);\n }\n\n /* --------------------------- Console Override ---------------------------- */\n\n private overrideConsole() {\n const blocked = [\"NodeSDK\", \"AuthToken\"];\n console.log = (...args: unknown[]) => {\n const msg = args.map(String).join(\" \");\n if (blocked.some((k) => msg.includes(k))) return;\n this.log(msg);\n };\n }\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export declare class LoggerModule {
2
+ }
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ 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;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.LoggerModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const logger_provider_1 = require("./logger.provider");
12
+ let LoggerModule = class LoggerModule {
13
+ };
14
+ exports.LoggerModule = LoggerModule;
15
+ exports.LoggerModule = LoggerModule = __decorate([
16
+ (0, common_1.Module)({
17
+ providers: [logger_provider_1.LoggerProvider],
18
+ exports: [logger_provider_1.LoggerProvider],
19
+ })
20
+ ], LoggerModule);
21
+ //# sourceMappingURL=logger.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.module.js","sourceRoot":"","sources":["../../../src/core-common/logger/logger.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,uDAAmD;AAM5C,IAAM,YAAY,GAAlB,MAAM,YAAY;CAAG,CAAA;AAAf,oCAAY;uBAAZ,YAAY;IAJxB,IAAA,eAAM,EAAC;QACN,SAAS,EAAE,CAAC,gCAAc,CAAC;QAC3B,OAAO,EAAE,CAAC,gCAAc,CAAC;KAC1B,CAAC;GACW,YAAY,CAAG","sourcesContent":["import { Module } from \"@nestjs/common\";\nimport { LoggerProvider } from \"./logger.provider\";\n\n@Module({\n providers: [LoggerProvider],\n exports: [LoggerProvider],\n})\nexport class LoggerModule {}\n"]}
@@ -0,0 +1,2 @@
1
+ import { Provider } from "@nestjs/common";
2
+ export declare const LoggerProvider: Provider;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LoggerProvider = void 0;
4
+ const _1 = require(".");
5
+ exports.LoggerProvider = {
6
+ provide: _1.LoggerService,
7
+ useClass: _1.LoggerService,
8
+ };
9
+ //# sourceMappingURL=logger.provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.provider.js","sourceRoot":"","sources":["../../../src/core-common/logger/logger.provider.ts"],"names":[],"mappings":";;;AACA,wBAAkC;AAErB,QAAA,cAAc,GAAa;IACtC,OAAO,EAAE,gBAAa;IACtB,QAAQ,EAAE,gBAAa;CACxB,CAAC","sourcesContent":["import { Provider } from \"@nestjs/common\";\nimport { LoggerService } from \".\";\n\nexport const LoggerProvider: Provider = {\n provide: LoggerService,\n useClass: LoggerService,\n};\n"]}
@@ -0,0 +1,15 @@
1
+ import { Result } from "../result-model/result";
2
+ export declare class ErrorDisplay {
3
+ code: string;
4
+ message: string;
5
+ validationError?: any;
6
+ }
7
+ export declare class GenericErrorResponse {
8
+ statusCode: number;
9
+ success: boolean;
10
+ error: ErrorDisplay;
11
+ timestamp: string;
12
+ data: any;
13
+ constructor();
14
+ initialize(result: Result<any>, statusCode: number): void;
15
+ }
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GenericErrorResponse = exports.ErrorDisplay = void 0;
4
+ class ErrorDisplay {
5
+ code;
6
+ message;
7
+ validationError;
8
+ }
9
+ exports.ErrorDisplay = ErrorDisplay;
10
+ class GenericErrorResponse {
11
+ statusCode;
12
+ success = false;
13
+ error;
14
+ timestamp;
15
+ data;
16
+ constructor() {
17
+ this.statusCode = 500;
18
+ this.success = false;
19
+ this.timestamp = new Date().toISOString();
20
+ }
21
+ initialize(result, statusCode) {
22
+ this.statusCode = statusCode;
23
+ this.error = {
24
+ code: result.error?.code || "ERROR",
25
+ message: result.error?.message || "An error occurred.",
26
+ };
27
+ this.data = result.data;
28
+ this.success = result.success || false;
29
+ this.timestamp = result.timestamp || new Date().toISOString();
30
+ }
31
+ }
32
+ exports.GenericErrorResponse = GenericErrorResponse;
33
+ //# sourceMappingURL=generic-error-response.model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generic-error-response.model.js","sourceRoot":"","sources":["../../../src/core-common/response-model/generic-error-response.model.ts"],"names":[],"mappings":";;;AAQA,MAAa,YAAY;IACvB,IAAI,CAAS;IACb,OAAO,CAAS;IAChB,eAAe,CAAO;CACvB;AAJD,oCAIC;AACD,MAAa,oBAAoB;IAC/B,UAAU,CAAS;IACnB,OAAO,GAAY,KAAK,CAAC;IACzB,KAAK,CAAe;IACpB,SAAS,CAAS;IAClB,IAAI,CAAM;IAEV;QACE,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC;QACtB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC5C,CAAC;IAMD,UAAU,CACR,MAAmB,EACnB,UAAkB;QAElB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,KAAK,GAAG;YACX,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,IAAI,OAAO;YACnC,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,oBAAoB;SACvD,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAA;QACvB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,KAAK,CAAC;QACvC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAChE,CAAC;CACF;AA9BD,oDA8BC","sourcesContent":["import { Result } from \"../result-model/result\";\n\n/**\n * Standard error response to be returned to the caller of the API.\n * This class represents the structure of an error response returned by the API\n * in case of failures.\n */\n\nexport class ErrorDisplay {\n code: string;\n message: string;\n validationError?: any;\n}\nexport class GenericErrorResponse {\n statusCode: number;\n success: boolean = false;\n error: ErrorDisplay;\n timestamp: string;\n data: any;\n\n constructor() {\n this.statusCode = 500; // Default value\n this.success = false;\n this.timestamp = new Date().toISOString(); // Default value\n }\n /**\n * Sets the properties from the Result object.\n * @param result - Result object instance returned from the controller method.\n * @param statusCode - HTTP status code.\n */\n initialize(\n result: Result<any>,\n statusCode: number,\n ) {\n this.statusCode = statusCode;\n this.error = {\n code: result.error?.code || \"ERROR\",\n message: result.error?.message || \"An error occurred.\",\n };\n this.data = result.data\n this.success = result.success || false;\n this.timestamp = result.timestamp || new Date().toISOString();\n }\n}\n"]}
@@ -0,0 +1,8 @@
1
+ import { Result } from "../result-model/result";
2
+ export declare class GenericSuccessResponse<T> {
3
+ statusCode: number;
4
+ success: boolean;
5
+ data: T;
6
+ timestamp: string;
7
+ initialize(result: Result<T>, statusCode: number): void;
8
+ }
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GenericSuccessResponse = void 0;
4
+ class GenericSuccessResponse {
5
+ statusCode;
6
+ success;
7
+ data;
8
+ timestamp;
9
+ initialize(result, statusCode) {
10
+ this.statusCode = statusCode;
11
+ this.success = result.success;
12
+ this.data = result.data;
13
+ this.timestamp = new Date().toISOString();
14
+ }
15
+ }
16
+ exports.GenericSuccessResponse = GenericSuccessResponse;
17
+ //# sourceMappingURL=generic-success-response.model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generic-success-response.model.js","sourceRoot":"","sources":["../../../src/core-common/response-model/generic-success-response.model.ts"],"names":[],"mappings":";;;AAOA,MAAa,sBAAsB;IACjC,UAAU,CAAS;IACnB,OAAO,CAAU;IACjB,IAAI,CAAI;IACR,SAAS,CAAS;IAOlB,UAAU,CAAC,MAAiB,EAAE,UAAkB;QAC9C,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACxB,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC5C,CAAC;CACF;AAjBD,wDAiBC","sourcesContent":["import { Result } from \"../result-model/result\";\n\n/**\n * Standard response object to be returned to the caller of the API.\n * This class represents the structure of a success response returned by the API.\n * @typeparam T - The type of data included in the response.\n */\nexport class GenericSuccessResponse<T> {\n statusCode: number;\n success: boolean;\n data: T;\n timestamp: string;\n\n /**\n * Sets the properties from the Result object.\n * @param result - Result object instance returned from the controller method.\n * @param statusCode - HTTP status code.\n */\n initialize(result: Result<T>, statusCode: number) {\n this.statusCode = statusCode;\n this.success = result.success;\n this.data = result.data;\n this.timestamp = new Date().toISOString();\n }\n}\n"]}
@@ -0,0 +1,10 @@
1
+ import { GenericError } from "../error/generic.error";
2
+ export declare class Result<T> {
3
+ success: boolean;
4
+ data: T;
5
+ error: GenericError;
6
+ timestamp: string;
7
+ static success<T>(data: T): Result<T>;
8
+ static failed<T>(error: GenericError, data?: T): Result<T>;
9
+ static throwError<T>(error: GenericError, data?: T): Result<T>;
10
+ }
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Result = void 0;
4
+ class Result {
5
+ success;
6
+ data;
7
+ error;
8
+ timestamp;
9
+ static success(data) {
10
+ const result = new Result();
11
+ result.success = true;
12
+ result.data = data;
13
+ result.timestamp = new Date().toISOString();
14
+ return result;
15
+ }
16
+ static failed(error, data) {
17
+ const result = new Result();
18
+ result.success = false;
19
+ result.timestamp = new Date().toISOString();
20
+ result.error = error;
21
+ if (data) {
22
+ result.data = data;
23
+ }
24
+ return result;
25
+ }
26
+ static throwError(error, data) {
27
+ const result = new Result();
28
+ result.success = false;
29
+ result.timestamp = new Date().toISOString();
30
+ result.error = error;
31
+ if (data) {
32
+ result.data = data;
33
+ }
34
+ throw result;
35
+ }
36
+ }
37
+ exports.Result = Result;
38
+ //# sourceMappingURL=result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result.js","sourceRoot":"","sources":["../../../src/core-common/result-model/result.ts"],"names":[],"mappings":";;;AAEA,MAAa,MAAM;IACjB,OAAO,CAAU;IACjB,IAAI,CAAI;IACR,KAAK,CAAe;IACpB,SAAS,CAAS;IAEX,MAAM,CAAC,OAAO,CAAI,IAAO;QAC9B,MAAM,MAAM,GAAG,IAAI,MAAM,EAAK,CAAC;QAC/B,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;QACtB,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;QACnB,MAAM,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC5C,OAAO,MAAM,CAAC;IAChB,CAAC;IAEM,MAAM,CAAC,MAAM,CAAI,KAAmB,EAAE,IAAQ;QACnD,MAAM,MAAM,GAAG,IAAI,MAAM,EAAK,CAAC;QAC/B,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC;QACvB,MAAM,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC5C,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;QACrB,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;QACrB,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEM,MAAM,CAAC,UAAU,CAAI,KAAmB,EAAE,IAAQ;QACvD,MAAM,MAAM,GAAG,IAAI,MAAM,EAAK,CAAC;QAC/B,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC;QACvB,MAAM,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC5C,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;QACrB,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;QACrB,CAAC;QACD,MAAM,MAAM,CAAC;IACf,CAAC;CACF;AAnCD,wBAmCC","sourcesContent":["import { GenericError } from \"../error/generic.error\";\n\nexport class Result<T> {\n success: boolean;\n data: T;\n error: GenericError;\n timestamp: string;\n\n public static success<T>(data: T): Result<T> {\n const result = new Result<T>();\n result.success = true;\n result.data = data;\n result.timestamp = new Date().toISOString();\n return result;\n }\n\n public static failed<T>(error: GenericError, data?: T): Result<T> {\n const result = new Result<T>();\n result.success = false;\n result.timestamp = new Date().toISOString();\n result.error = error;\n if (data) {\n result.data = data;\n }\n return result;\n }\n\n public static throwError<T>(error: GenericError, data?: T): Result<T> {\n const result = new Result<T>();\n result.success = false;\n result.timestamp = new Date().toISOString();\n result.error = error;\n if (data) {\n result.data = data;\n }\n throw result;\n }\n}\n"]}
@@ -0,0 +1,8 @@
1
+ import { NestMiddleware } from "@nestjs/common";
2
+ import { Request, Response, NextFunction } from "express";
3
+ export declare class AsyncStorageMiddleware implements NestMiddleware {
4
+ private static storage;
5
+ static get(key: string): any;
6
+ static set(key: string, value: any): void;
7
+ use(req: Request, _res: Response, next: NextFunction): void;
8
+ }
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ 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;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var AsyncStorageMiddleware_1;
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.AsyncStorageMiddleware = void 0;
11
+ const common_1 = require("@nestjs/common");
12
+ const async_hooks_1 = require("async_hooks");
13
+ let AsyncStorageMiddleware = class AsyncStorageMiddleware {
14
+ static { AsyncStorageMiddleware_1 = this; }
15
+ static storage = new async_hooks_1.AsyncLocalStorage();
16
+ static get(key) {
17
+ const store = AsyncStorageMiddleware_1.storage.getStore();
18
+ return store?.get(key);
19
+ }
20
+ static set(key, value) {
21
+ const store = AsyncStorageMiddleware_1.storage.getStore();
22
+ if (store) {
23
+ store.set(key, value);
24
+ }
25
+ }
26
+ use(req, _res, next) {
27
+ const store = new Map();
28
+ store.set("request", req);
29
+ AsyncStorageMiddleware_1.storage.run(store, () => {
30
+ next();
31
+ });
32
+ }
33
+ };
34
+ exports.AsyncStorageMiddleware = AsyncStorageMiddleware;
35
+ exports.AsyncStorageMiddleware = AsyncStorageMiddleware = AsyncStorageMiddleware_1 = __decorate([
36
+ (0, common_1.Injectable)()
37
+ ], AsyncStorageMiddleware);
38
+ //# sourceMappingURL=async-storage.middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async-storage.middleware.js","sourceRoot":"","sources":["../../src/middleware/async-storage.middleware.ts"],"names":[],"mappings":";;;;;;;;;;AACA,2CAA4D;AAC5D,6CAAgD;AAIzC,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;;IACzB,MAAM,CAAC,OAAO,GAAG,IAAI,+BAAiB,EAAoB,CAAC;IAEnE,MAAM,CAAC,GAAG,CAAC,GAAW;QACpB,MAAM,KAAK,GAAG,wBAAsB,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QACxD,OAAO,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAED,MAAM,CAAC,GAAG,CAAC,GAAW,EAAE,KAAU;QAChC,MAAM,KAAK,GAAG,wBAAsB,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QACxD,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED,GAAG,CAAC,GAAY,EAAE,IAAc,EAAE,IAAkB;QAClD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAe,CAAC;QACrC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAC1B,wBAAsB,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE;YAC7C,IAAI,EAAE,CAAC;QACT,CAAC,CAAC,CAAC;IACL,CAAC;;AArBU,wDAAsB;iCAAtB,sBAAsB;IADlC,IAAA,mBAAU,GAAE;GACA,sBAAsB,CAsBlC","sourcesContent":["// async-storage.middleware.ts\nimport { Injectable, NestMiddleware } from \"@nestjs/common\";\nimport { AsyncLocalStorage } from \"async_hooks\";\nimport { Request, Response, NextFunction } from \"express\";\n\n@Injectable()\nexport class AsyncStorageMiddleware implements NestMiddleware {\n private static storage = new AsyncLocalStorage<Map<string, any>>();\n\n static get(key: string): any {\n const store = AsyncStorageMiddleware.storage.getStore();\n return store?.get(key);\n }\n\n static set(key: string, value: any): void {\n const store = AsyncStorageMiddleware.storage.getStore();\n if (store) {\n store.set(key, value);\n }\n }\n\n use(req: Request, _res: Response, next: NextFunction) {\n const store = new Map<string, any>();\n store.set(\"request\", req);\n AsyncStorageMiddleware.storage.run(store, () => {\n next();\n });\n }\n}\n"]}
@@ -0,0 +1,5 @@
1
+ import { ArgumentsHost, ExceptionFilter } from "@nestjs/common";
2
+ import { Response } from "express";
3
+ export declare class GlobalExceptionHandler implements ExceptionFilter {
4
+ catch(exception: unknown, host: ArgumentsHost): Response<any, Record<string, any>>;
5
+ }
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ 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;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.GlobalExceptionHandler = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const error_1 = require("../../core-common/error");
12
+ const custom_validation_error_1 = require("../../core-common/error/custom-error/custom-validation-error");
13
+ const result_1 = require("../../core-common/result-model/result");
14
+ let GlobalExceptionHandler = class GlobalExceptionHandler {
15
+ catch(exception, host) {
16
+ const response = host.switchToHttp().getResponse();
17
+ if (exception instanceof result_1.Result) {
18
+ const statusCode = exception.error?.statusCode ?? common_1.HttpStatus.INTERNAL_SERVER_ERROR;
19
+ const payload = {
20
+ statusCode,
21
+ success: false,
22
+ error: {
23
+ code: exception.error?.code ?? "ERROR",
24
+ message: exception.error?.message ?? "An error occurred",
25
+ },
26
+ timestamp: exception.timestamp ?? new Date().toISOString(),
27
+ };
28
+ if (exception.data !== undefined && exception.data !== null) {
29
+ payload.data = exception.data;
30
+ }
31
+ return response.status(statusCode).json(payload);
32
+ }
33
+ if (exception instanceof error_1.GenericError) {
34
+ return response.status(exception.statusCode).json({
35
+ statusCode: exception.statusCode,
36
+ success: false,
37
+ error: {
38
+ code: exception.code,
39
+ message: exception.message,
40
+ },
41
+ timestamp: new Date().toISOString(),
42
+ });
43
+ }
44
+ if (exception instanceof common_1.HttpException) {
45
+ const status = exception.getStatus();
46
+ const res = exception.getResponse();
47
+ const isValidationPipeError = exception.stack?.includes("ValidationPipe");
48
+ if (isValidationPipeError) {
49
+ const validationErrors = new custom_validation_error_1.CustomValidationError(res);
50
+ return response.status(validationErrors.statusCode).json({
51
+ success: false,
52
+ error: {
53
+ code: validationErrors.code,
54
+ message: validationErrors.message,
55
+ validationError: validationErrors.validationErrors,
56
+ },
57
+ timestamp: new Date().toISOString(),
58
+ });
59
+ }
60
+ return response.status(status).json({
61
+ statusCode: status,
62
+ success: false,
63
+ error: {
64
+ code: "HTTP_EXCEPTION",
65
+ message: typeof res === "string"
66
+ ? res
67
+ : (res.message ?? exception.message),
68
+ },
69
+ timestamp: new Date().toISOString(),
70
+ });
71
+ }
72
+ if (exception instanceof Error) {
73
+ return response.status(common_1.HttpStatus.INTERNAL_SERVER_ERROR).json({
74
+ statusCode: common_1.HttpStatus.INTERNAL_SERVER_ERROR,
75
+ success: false,
76
+ error: {
77
+ code: exception.name,
78
+ message: exception.message,
79
+ },
80
+ timestamp: new Date().toISOString(),
81
+ });
82
+ }
83
+ return response.status(common_1.HttpStatus.INTERNAL_SERVER_ERROR).json({
84
+ statusCode: common_1.HttpStatus.INTERNAL_SERVER_ERROR,
85
+ success: false,
86
+ error: {
87
+ code: "UNKNOWN_ERROR",
88
+ message: "Internal server error",
89
+ },
90
+ timestamp: new Date().toISOString(),
91
+ });
92
+ }
93
+ };
94
+ exports.GlobalExceptionHandler = GlobalExceptionHandler;
95
+ exports.GlobalExceptionHandler = GlobalExceptionHandler = __decorate([
96
+ (0, common_1.Catch)()
97
+ ], GlobalExceptionHandler);
98
+ //# sourceMappingURL=global-exeception.filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-exeception.filter.js","sourceRoot":"","sources":["../../../src/middleware/filter/global-exeception.filter.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ArgumentsHost,\n Catch,\n ExceptionFilter,\n HttpException,\n HttpStatus,\n} from \"@nestjs/common\";\nimport { Response } from \"express\";\nimport { GenericError } from \"../../core-common/error\";\nimport { CustomValidationError } from \"../../core-common/error/custom-error/custom-validation-error\";\nimport { Result } from \"../../core-common/result-model/result\";\n\n/**\n * Handles and processes exceptions, providing standardized error responses.\n * This global exception handler can be used to catch and respond to exceptions thrown\n * during HTTP requests and format responses accordingly.\n */\n\n@Catch()\nexport class GlobalExceptionHandler implements ExceptionFilter {\n catch(exception: unknown, host: ArgumentsHost) {\n const response = host.switchToHttp().getResponse<Response>();\n\n /* 1️⃣ Domain Result (highest priority) */\n if (exception instanceof Result) {\n const statusCode =\n exception.error?.statusCode ?? HttpStatus.INTERNAL_SERVER_ERROR;\n\n const payload: any = {\n statusCode,\n success: false,\n error: {\n code: exception.error?.code ?? \"ERROR\",\n message: exception.error?.message ?? \"An error occurred\",\n },\n timestamp: exception.timestamp ?? new Date().toISOString(),\n };\n\n if (exception.data !== undefined && exception.data !== null) {\n payload.data = exception.data;\n }\n\n return response.status(statusCode).json(payload);\n }\n\n /* 2️⃣ Custom domain errors */\n if (exception instanceof GenericError) {\n return response.status(exception.statusCode).json({\n statusCode: exception.statusCode,\n success: false,\n error: {\n code: exception.code,\n message: exception.message,\n },\n timestamp: new Date().toISOString(),\n });\n }\n\n /* 3️⃣ NestJS HTTP exceptions */\n if (exception instanceof HttpException) {\n const status = exception.getStatus();\n const res = exception.getResponse();\n\n const isValidationPipeError = exception.stack?.includes(\"ValidationPipe\");\n\n if (isValidationPipeError) {\n const validationErrors = new CustomValidationError(res);\n return response.status(validationErrors.statusCode).json({\n success: false,\n error: {\n code: validationErrors.code,\n message: validationErrors.message,\n validationError: validationErrors.validationErrors,\n },\n timestamp: new Date().toISOString(),\n });\n }\n\n return response.status(status).json({\n statusCode: status,\n success: false,\n error: {\n code: \"HTTP_EXCEPTION\",\n message:\n typeof res === \"string\"\n ? res\n : ((res as any).message ?? exception.message),\n },\n timestamp: new Date().toISOString(),\n });\n }\n\n /* 4️⃣ Native JS errors (TypeError, Error, etc.) */\n if (exception instanceof Error) {\n return response.status(HttpStatus.INTERNAL_SERVER_ERROR).json({\n statusCode: HttpStatus.INTERNAL_SERVER_ERROR,\n success: false,\n error: {\n code: exception.name,\n message: exception.message,\n },\n timestamp: new Date().toISOString(),\n });\n }\n\n /* 5️⃣ Truly unknown (non-Error throwables) */\n return response.status(HttpStatus.INTERNAL_SERVER_ERROR).json({\n statusCode: HttpStatus.INTERNAL_SERVER_ERROR,\n success: false,\n error: {\n code: \"UNKNOWN_ERROR\",\n message: \"Internal server error\",\n },\n timestamp: new Date().toISOString(),\n });\n }\n}\n"]}
@@ -0,0 +1,5 @@
1
+ export * from './async-storage.middleware';
2
+ export * from './platform-auth.middleware';
3
+ export * from './utils/http-response.formatter';
4
+ export * from "./interceptor/response-handler";
5
+ export * from "./filter/global-exeception.filter";
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./async-storage.middleware"), exports);
18
+ __exportStar(require("./platform-auth.middleware"), exports);
19
+ __exportStar(require("./utils/http-response.formatter"), exports);
20
+ __exportStar(require("./interceptor/response-handler"), exports);
21
+ __exportStar(require("./filter/global-exeception.filter"), exports);
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/middleware/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6DAA0C;AAC1C,6DAA0C;AAC1C,kEAA+C;AAC/C,iEAA8C;AAC9C,oEAAiD","sourcesContent":["export * from './async-storage.middleware'\nexport * from './platform-auth.middleware'\nexport * from './utils/http-response.formatter'\nexport * from \"./interceptor/response-handler\"\nexport * from \"./filter/global-exeception.filter\""]}
@@ -0,0 +1,9 @@
1
+ import { CallHandler, ExecutionContext, NestInterceptor } from "@nestjs/common";
2
+ import { Observable } from "rxjs";
3
+ import { LoggerService } from "@core-common/logger";
4
+ export declare class ResponseHandler implements NestInterceptor {
5
+ private readonly logger;
6
+ constructor(logger: LoggerService);
7
+ intercept(exContext: ExecutionContext, next: CallHandler): Observable<any>;
8
+ private handleResponse;
9
+ }
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ 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;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ResponseHandler = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const rxjs_1 = require("rxjs");
15
+ const http_response_formatter_1 = require("../utils/http-response.formatter");
16
+ const logger_1 = require("../../core-common/logger");
17
+ let ResponseHandler = class ResponseHandler {
18
+ logger;
19
+ constructor(logger) {
20
+ this.logger = logger;
21
+ }
22
+ intercept(exContext, next) {
23
+ return new rxjs_1.Observable((subscriber) => {
24
+ next.handle().subscribe({
25
+ next: (data) => {
26
+ const mapped = this.handleResponse(exContext, data);
27
+ subscriber.next(mapped);
28
+ },
29
+ error: (err) => {
30
+ this.logger.error('Error in ResponseHandler Interceptor', err);
31
+ subscriber.error(err);
32
+ },
33
+ complete: () => {
34
+ subscriber.complete();
35
+ },
36
+ });
37
+ });
38
+ }
39
+ handleResponse(excecutionContext, result) {
40
+ let serverResponse = excecutionContext
41
+ .switchToHttp()
42
+ .getResponse();
43
+ const apiReponse = new http_response_formatter_1.HttpResponseFormatter().getStandardApiResponse(serverResponse.statusCode, result);
44
+ serverResponse.statusCode = apiReponse.statusCode
45
+ ? apiReponse.statusCode
46
+ : apiReponse?.error?.statusCode;
47
+ serverResponse[`statusCode`] = serverResponse.statusCode;
48
+ if (apiReponse?.statusCode) {
49
+ delete apiReponse?.error?.statusCode;
50
+ }
51
+ return apiReponse;
52
+ }
53
+ };
54
+ exports.ResponseHandler = ResponseHandler;
55
+ exports.ResponseHandler = ResponseHandler = __decorate([
56
+ (0, common_1.Injectable)(),
57
+ __metadata("design:paramtypes", [logger_1.LoggerService])
58
+ ], ResponseHandler);
59
+ //# sourceMappingURL=response-handler.js.map