microservice-common-nestjs 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/README.md +452 -0
  2. package/dist/cache/cache.module.d.ts +5 -0
  3. package/dist/cache/cache.module.js +32 -0
  4. package/dist/cache/cache.module.js.map +1 -0
  5. package/dist/cache/cache.service.d.ts +18 -0
  6. package/dist/cache/cache.service.js +68 -0
  7. package/dist/cache/cache.service.js.map +1 -0
  8. package/dist/client/client.interface.d.ts +14 -0
  9. package/dist/client/client.interface.js +3 -0
  10. package/dist/client/client.interface.js.map +1 -0
  11. package/dist/client/http-client.module.d.ts +2 -0
  12. package/dist/client/http-client.module.js +22 -0
  13. package/dist/client/http-client.module.js.map +1 -0
  14. package/dist/client/http-client.service.d.ts +12 -0
  15. package/dist/client/http-client.service.js +100 -0
  16. package/dist/client/http-client.service.js.map +1 -0
  17. package/dist/config/config.interface.d.ts +42 -0
  18. package/dist/config/config.interface.js +3 -0
  19. package/dist/config/config.interface.js.map +1 -0
  20. package/dist/config/config.module.d.ts +2 -0
  21. package/dist/config/config.module.js +28 -0
  22. package/dist/config/config.module.js.map +1 -0
  23. package/dist/config/config.service.d.ts +10 -0
  24. package/dist/config/config.service.js +85 -0
  25. package/dist/config/config.service.js.map +1 -0
  26. package/dist/database/prisma.module.d.ts +21 -0
  27. package/dist/database/prisma.module.js +121 -0
  28. package/dist/database/prisma.module.js.map +1 -0
  29. package/dist/health/health.controller.d.ts +10 -0
  30. package/dist/health/health.controller.js +75 -0
  31. package/dist/health/health.controller.js.map +1 -0
  32. package/dist/health/health.interface.d.ts +14 -0
  33. package/dist/health/health.interface.js +3 -0
  34. package/dist/health/health.interface.js.map +1 -0
  35. package/dist/health/health.module.d.ts +2 -0
  36. package/dist/health/health.module.js +23 -0
  37. package/dist/health/health.module.js.map +1 -0
  38. package/dist/health/health.service.d.ts +10 -0
  39. package/dist/health/health.service.js +25 -0
  40. package/dist/health/health.service.js.map +1 -0
  41. package/dist/http/http-response.decorator.d.ts +6 -0
  42. package/dist/http/http-response.decorator.js +8 -0
  43. package/dist/http/http-response.decorator.js.map +1 -0
  44. package/dist/http/http-response.module.d.ts +2 -0
  45. package/dist/http/http-response.module.js +22 -0
  46. package/dist/http/http-response.module.js.map +1 -0
  47. package/dist/http/http-response.service.d.ts +17 -0
  48. package/dist/http/http-response.service.js +73 -0
  49. package/dist/http/http-response.service.js.map +1 -0
  50. package/dist/http/response.interface.d.ts +10 -0
  51. package/dist/http/response.interface.js +3 -0
  52. package/dist/http/response.interface.js.map +1 -0
  53. package/dist/i18n/i18n.module.d.ts +5 -0
  54. package/dist/i18n/i18n.module.js +32 -0
  55. package/dist/i18n/i18n.module.js.map +1 -0
  56. package/dist/i18n/i18n.service.d.ts +16 -0
  57. package/dist/i18n/i18n.service.js +58 -0
  58. package/dist/i18n/i18n.service.js.map +1 -0
  59. package/dist/index.d.ts +32 -0
  60. package/dist/index.js +50 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/microservice-common.module.d.ts +17 -0
  63. package/dist/microservice-common.module.js +76 -0
  64. package/dist/microservice-common.module.js.map +1 -0
  65. package/dist/middleware/correlation-id.middleware.d.ts +9 -0
  66. package/dist/middleware/correlation-id.middleware.js +34 -0
  67. package/dist/middleware/correlation-id.middleware.js.map +1 -0
  68. package/dist/middleware/cors.middleware.d.ts +9 -0
  69. package/dist/middleware/cors.middleware.js +71 -0
  70. package/dist/middleware/cors.middleware.js.map +1 -0
  71. package/dist/middleware/logging.middleware.d.ts +10 -0
  72. package/dist/middleware/logging.middleware.js +75 -0
  73. package/dist/middleware/logging.middleware.js.map +1 -0
  74. package/dist/middleware/middleware.interface.d.ts +18 -0
  75. package/dist/middleware/middleware.interface.js +3 -0
  76. package/dist/middleware/middleware.interface.js.map +1 -0
  77. package/dist/middleware/middleware.module.d.ts +9 -0
  78. package/dist/middleware/middleware.module.js +61 -0
  79. package/dist/middleware/middleware.module.js.map +1 -0
  80. package/dist/prometheus/prometheus.module.d.ts +8 -0
  81. package/dist/prometheus/prometheus.module.js +44 -0
  82. package/dist/prometheus/prometheus.module.js.map +1 -0
  83. package/dist/prometheus/prometheus.service.d.ts +14 -0
  84. package/dist/prometheus/prometheus.service.js +56 -0
  85. package/dist/prometheus/prometheus.service.js.map +1 -0
  86. package/dist/rate-limit/rate-limit.module.d.ts +4 -0
  87. package/dist/rate-limit/rate-limit.module.js +47 -0
  88. package/dist/rate-limit/rate-limit.module.js.map +1 -0
  89. package/dist/tsconfig.tsbuildinfo +1 -0
  90. package/package.json +88 -0
@@ -0,0 +1,100 @@
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 __importDefault = (this && this.__importDefault) || function (mod) {
9
+ return (mod && mod.__esModule) ? mod : { "default": mod };
10
+ };
11
+ var HttpClientService_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.HttpClientService = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const axios_1 = __importDefault(require("axios"));
16
+ let HttpClientService = HttpClientService_1 = class HttpClientService {
17
+ constructor() {
18
+ this.logger = new common_1.Logger(HttpClientService_1.name);
19
+ this.clients = new Map();
20
+ }
21
+ createClient(name, config) {
22
+ if (this.clients.has(name)) {
23
+ return this.clients.get(name);
24
+ }
25
+ const client = axios_1.default.create(config);
26
+ this.clients.set(name, client);
27
+ return client;
28
+ }
29
+ getClient(name) {
30
+ const client = this.clients.get(name);
31
+ if (!client) {
32
+ throw new Error(`HTTP client "${name}" not found. Create it first using createClient().`);
33
+ }
34
+ return client;
35
+ }
36
+ async request(config) {
37
+ const retryOptions = config.retry || { retries: 0, delay: 0 };
38
+ const { retries = 0, delay = 0, retryCondition } = retryOptions;
39
+ const makeRequest = async (attempt = 1) => {
40
+ try {
41
+ const { retry, ...axiosConfig } = config;
42
+ const response = await axios_1.default.request(axiosConfig);
43
+ return response.data;
44
+ }
45
+ catch (error) {
46
+ const axiosError = error;
47
+ if (attempt > retries) {
48
+ this.logger.error(`Request failed after ${retries} retries: ${axiosError.message}`, axiosError.stack);
49
+ throw error;
50
+ }
51
+ const shouldRetry = retryCondition
52
+ ? retryCondition(error)
53
+ : this.defaultRetryCondition(axiosError);
54
+ if (!shouldRetry) {
55
+ throw error;
56
+ }
57
+ this.logger.warn(`Request failed (attempt ${attempt}/${retries + 1}), retrying in ${delay}ms...`);
58
+ await this.sleep(delay);
59
+ return makeRequest(attempt + 1);
60
+ }
61
+ };
62
+ return makeRequest();
63
+ }
64
+ async withRetry(promise, delay = 0, retries = 0) {
65
+ const makeRequest = async (attempt = 1) => {
66
+ try {
67
+ return await promise;
68
+ }
69
+ catch (error) {
70
+ if (attempt > retries) {
71
+ this.logger.error(`Operation failed after ${retries} retries`, error);
72
+ throw error;
73
+ }
74
+ this.logger.warn(`Operation failed (attempt ${attempt}/${retries + 1}), retrying in ${delay}ms...`);
75
+ await this.sleep(delay);
76
+ return makeRequest(attempt + 1);
77
+ }
78
+ };
79
+ return makeRequest();
80
+ }
81
+ defaultRetryCondition(error) {
82
+ if (!axios_1.default.isAxiosError(error)) {
83
+ return false;
84
+ }
85
+ const axiosError = error;
86
+ if (!axiosError.response) {
87
+ return true;
88
+ }
89
+ const status = axiosError.response.status;
90
+ return status >= 500 && status < 600;
91
+ }
92
+ sleep(ms) {
93
+ return new Promise((resolve) => setTimeout(resolve, ms));
94
+ }
95
+ };
96
+ exports.HttpClientService = HttpClientService;
97
+ exports.HttpClientService = HttpClientService = HttpClientService_1 = __decorate([
98
+ (0, common_1.Injectable)()
99
+ ], HttpClientService);
100
+ //# sourceMappingURL=http-client.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-client.service.js","sourceRoot":"","sources":["../../src/client/http-client.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ export interface DatabaseConfig {
2
+ type: 'postgres' | 'mysql' | 'mariadb';
3
+ host: string;
4
+ port: number;
5
+ username: string;
6
+ password: string;
7
+ database: string;
8
+ sslMode?: string;
9
+ synchronize?: boolean;
10
+ migrationsRun?: boolean;
11
+ logging?: boolean;
12
+ entities?: string[];
13
+ migrations?: string[];
14
+ }
15
+ export interface HttpConfig {
16
+ port: number;
17
+ gracefulShutdownTimeout?: number;
18
+ }
19
+ export interface LogConfig {
20
+ level: string;
21
+ format: 'json' | 'text';
22
+ }
23
+ export interface MicroserviceCommonConfig {
24
+ http: HttpConfig;
25
+ database?: DatabaseConfig;
26
+ log: LogConfig;
27
+ cors?: {
28
+ origin?: string | string[];
29
+ methods?: string[];
30
+ allowedHeaders?: string[];
31
+ exposedHeaders?: string[];
32
+ credentials?: boolean;
33
+ };
34
+ jwt?: {
35
+ secret: string;
36
+ expiresIn?: string;
37
+ };
38
+ rateLimit?: {
39
+ ttl: number;
40
+ limit: number;
41
+ };
42
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=config.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.interface.js","sourceRoot":"","sources":["../../src/config/config.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export declare class ConfigModule {
2
+ }
@@ -0,0 +1,28 @@
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.ConfigModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const config_1 = require("@nestjs/config");
12
+ const config_service_1 = require("../config/config.service");
13
+ let ConfigModule = class ConfigModule {
14
+ };
15
+ exports.ConfigModule = ConfigModule;
16
+ exports.ConfigModule = ConfigModule = __decorate([
17
+ (0, common_1.Module)({
18
+ imports: [
19
+ config_1.ConfigModule.forRoot({
20
+ isGlobal: true,
21
+ envFilePath: ['.env.local', '.env'],
22
+ }),
23
+ ],
24
+ providers: [config_service_1.ConfigService],
25
+ exports: [config_service_1.ConfigService],
26
+ })
27
+ ], ConfigModule);
28
+ //# sourceMappingURL=config.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.module.js","sourceRoot":"","sources":["../../src/config/config.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,2CAAkE;AAClE,4DAAwD;AAYjD,IAAM,YAAY,GAAlB,MAAM,YAAY;CAAG,CAAA;AAAf,oCAAY;uBAAZ,YAAY;IAVxB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,qBAAgB,CAAC,OAAO,CAAC;gBACvB,QAAQ,EAAE,IAAI;gBACd,WAAW,EAAE,CAAC,YAAY,EAAE,MAAM,CAAC;aACpC,CAAC;SACH;QACD,SAAS,EAAE,CAAC,8BAAa,CAAC;QAC1B,OAAO,EAAE,CAAC,8BAAa,CAAC;KACzB,CAAC;GACW,YAAY,CAAG"}
@@ -0,0 +1,10 @@
1
+ import { ConfigService as NestConfigService } from '@nestjs/config';
2
+ import { MicroserviceCommonConfig } from '../config/config.interface';
3
+ export declare class ConfigService<T extends Record<string, unknown> = Record<string, never>> {
4
+ private readonly configService;
5
+ constructor(configService: NestConfigService);
6
+ getConfig(): MicroserviceCommonConfig & T;
7
+ protected getBaseConfig(): MicroserviceCommonConfig;
8
+ protected getExtendedConfig(): Partial<T>;
9
+ private getDatabaseConfig;
10
+ }
@@ -0,0 +1,85 @@
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.ConfigService = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const config_1 = require("@nestjs/config");
15
+ let ConfigService = class ConfigService {
16
+ constructor(configService) {
17
+ this.configService = configService;
18
+ }
19
+ getConfig() {
20
+ const baseConfig = this.getBaseConfig();
21
+ const extendedConfig = this.getExtendedConfig();
22
+ return { ...baseConfig, ...extendedConfig };
23
+ }
24
+ getBaseConfig() {
25
+ return {
26
+ http: {
27
+ port: this.configService.get('PORT', 8080),
28
+ gracefulShutdownTimeout: this.configService.get('GRACEFUL_SHUTDOWN_TIMEOUT', 5000),
29
+ },
30
+ database: this.getDatabaseConfig(),
31
+ log: {
32
+ level: this.configService.get('LOG_LEVEL', 'info'),
33
+ format: this.configService.get('LOG_FORMAT', 'json') || 'json',
34
+ },
35
+ cors: {
36
+ origin: this.configService.get('CORS_ORIGIN', '*'),
37
+ methods: this.configService
38
+ .get('CORS_METHODS', 'GET,POST,PUT,DELETE,OPTIONS,PATCH,HEAD')
39
+ .split(','),
40
+ allowedHeaders: this.configService
41
+ .get('CORS_ALLOWED_HEADERS', 'Content-Type,Authorization,X-Request-ID,X-Correlation-UID,X-Consumer-Custom-ID')
42
+ .split(','),
43
+ exposedHeaders: this.configService
44
+ .get('CORS_EXPOSED_HEADERS', 'Content-Length,Content-Type')
45
+ .split(','),
46
+ credentials: this.configService.get('CORS_CREDENTIALS', false),
47
+ },
48
+ jwt: {
49
+ secret: this.configService.get('JWT_SECRET', ''),
50
+ expiresIn: this.configService.get('JWT_EXPIRES_IN', '1h'),
51
+ },
52
+ rateLimit: {
53
+ ttl: this.configService.get('RATE_LIMIT_TTL', 60),
54
+ limit: this.configService.get('RATE_LIMIT_LIMIT', 100),
55
+ },
56
+ };
57
+ }
58
+ getExtendedConfig() {
59
+ return {};
60
+ }
61
+ getDatabaseConfig() {
62
+ const dbType = this.configService.get('DB_TYPE', 'postgres');
63
+ if (!['postgres', 'mysql', 'mariadb'].includes(dbType)) {
64
+ return undefined;
65
+ }
66
+ return {
67
+ type: dbType,
68
+ host: this.configService.get('DB_HOST', 'localhost'),
69
+ port: this.configService.get('DB_PORT', dbType === 'postgres' ? 5432 : 3306),
70
+ username: this.configService.get('DB_USER', 'demo'),
71
+ password: this.configService.get('DB_PASSWORD', 'demo_password'),
72
+ database: this.configService.get('DB_NAME', 'demo_db'),
73
+ sslMode: this.configService.get('DB_SSLMODE', 'disable'),
74
+ synchronize: this.configService.get('DB_SYNCHRONIZE', false),
75
+ migrationsRun: this.configService.get('DB_MIGRATE', false),
76
+ logging: this.configService.get('DB_LOGGING', false),
77
+ };
78
+ }
79
+ };
80
+ exports.ConfigService = ConfigService;
81
+ exports.ConfigService = ConfigService = __decorate([
82
+ (0, common_1.Injectable)(),
83
+ __metadata("design:paramtypes", [config_1.ConfigService])
84
+ ], ConfigService);
85
+ //# sourceMappingURL=config.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.service.js","sourceRoot":"","sources":["../../src/config/config.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,2CAAoE;AAI7D,IAAM,aAAa,GAAnB,MAAM,aAAa;IACxB,YAA6B,aAAgC;QAAhC,kBAAa,GAAb,aAAa,CAAmB;IAAG,CAAC;IAEjE,SAAS;QACP,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACxC,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAChD,OAAO,EAAE,GAAG,UAAU,EAAE,GAAG,cAAc,EAAkC,CAAC;IAC9E,CAAC;IAES,aAAa;QACrB,OAAO;YACL,IAAI,EAAE;gBACJ,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAS,MAAM,EAAE,IAAI,CAAC;gBAClD,uBAAuB,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAS,2BAA2B,EAAE,IAAI,CAAC;aAC3F;YACD,QAAQ,EAAE,IAAI,CAAC,iBAAiB,EAAE;YAClC,GAAG,EAAE;gBACH,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAS,WAAW,EAAE,MAAM,CAAC;gBAC1D,MAAM,EAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAS,YAAY,EAAE,MAAM,CAAqB,IAAI,MAAM;aAC5F;YACD,IAAI,EAAE;gBACJ,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAS,aAAa,EAAE,GAAG,CAAC;gBAC1D,OAAO,EAAE,IAAI,CAAC,aAAa;qBACxB,GAAG,CAAS,cAAc,EAAE,wCAAwC,CAAC;qBACrE,KAAK,CAAC,GAAG,CAAC;gBACb,cAAc,EAAE,IAAI,CAAC,aAAa;qBAC/B,GAAG,CACF,sBAAsB,EACtB,gFAAgF,CACjF;qBACA,KAAK,CAAC,GAAG,CAAC;gBACb,cAAc,EAAE,IAAI,CAAC,aAAa;qBAC/B,GAAG,CAAS,sBAAsB,EAAE,6BAA6B,CAAC;qBAClE,KAAK,CAAC,GAAG,CAAC;gBACb,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAU,kBAAkB,EAAE,KAAK,CAAC;aACxE;YACD,GAAG,EAAE;gBACH,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAS,YAAY,EAAE,EAAE,CAAC;gBACxD,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAS,gBAAgB,EAAE,IAAI,CAAC;aAClE;YACD,SAAS,EAAE;gBACT,GAAG,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAS,gBAAgB,EAAE,EAAE,CAAC;gBACzD,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAS,kBAAkB,EAAE,GAAG,CAAC;aAC/D;SACF,CAAC;IACJ,CAAC;IAMS,iBAAiB;QACzB,OAAO,EAAgB,CAAC;IAC1B,CAAC;IAEO,iBAAiB;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAS,SAAS,EAAE,UAAU,CAAC,CAAC;QACrE,IAAI,CAAC,CAAC,UAAU,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACvD,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO;YACL,IAAI,EAAE,MAA0C;YAChD,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAS,SAAS,EAAE,WAAW,CAAC;YAC5D,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAS,SAAS,EAAE,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YACpF,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAS,SAAS,EAAE,MAAM,CAAC;YAC3D,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAS,aAAa,EAAE,eAAe,CAAC;YACxE,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAS,SAAS,EAAE,SAAS,CAAC;YAC9D,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAS,YAAY,EAAE,SAAS,CAAC;YAChE,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAU,gBAAgB,EAAE,KAAK,CAAC;YACrE,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAU,YAAY,EAAE,KAAK,CAAC;YACnE,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAU,YAAY,EAAE,KAAK,CAAC;SAC9D,CAAC;IACJ,CAAC;CACF,CAAA;AA1EY,sCAAa;wBAAb,aAAa;IADzB,IAAA,mBAAU,GAAE;qCAEiC,sBAAiB;GADlD,aAAa,CA0EzB"}
@@ -0,0 +1,21 @@
1
+ import { DynamicModule, OnModuleInit, OnModuleDestroy, Type } from '@nestjs/common';
2
+ import { PrismaClient } from '@prisma/client';
3
+ export interface PrismaModuleOptions {
4
+ databaseUrl?: string;
5
+ logLevel?: 'query' | 'info' | 'warn' | 'error';
6
+ }
7
+ export interface PrismaModuleAsyncOptions {
8
+ useFactory: (...args: unknown[]) => PrismaModuleOptions | Promise<PrismaModuleOptions>;
9
+ inject?: Array<string | symbol | Type<unknown>>;
10
+ imports?: Array<Type<unknown> | DynamicModule>;
11
+ }
12
+ export declare class PrismaModule implements OnModuleInit, OnModuleDestroy {
13
+ private readonly prisma;
14
+ constructor(prisma: PrismaClient);
15
+ static forRoot(options?: PrismaModuleOptions): DynamicModule;
16
+ static forRootAsync(options?: PrismaModuleAsyncOptions): DynamicModule;
17
+ onModuleInit(): Promise<void>;
18
+ onModuleDestroy(): Promise<void>;
19
+ private static getDatabaseUrlFromConfig;
20
+ private static buildDatabaseUrl;
21
+ }
@@ -0,0 +1,121 @@
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
+ var PrismaModule_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.PrismaModule = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const client_1 = require("@prisma/client");
16
+ const config_module_1 = require("../config/config.module");
17
+ const config_service_1 = require("../config/config.service");
18
+ let PrismaModule = PrismaModule_1 = class PrismaModule {
19
+ constructor(prisma) {
20
+ this.prisma = prisma;
21
+ }
22
+ static forRoot(options) {
23
+ return {
24
+ module: PrismaModule_1,
25
+ imports: [config_module_1.ConfigModule],
26
+ providers: [
27
+ {
28
+ provide: client_1.PrismaClient,
29
+ useFactory: (configService) => {
30
+ const databaseUrl = options?.databaseUrl || PrismaModule_1.getDatabaseUrlFromConfig(configService);
31
+ if (databaseUrl) {
32
+ process.env.DATABASE_URL = databaseUrl;
33
+ }
34
+ return new client_1.PrismaClient({
35
+ log: options?.logLevel ? [options.logLevel] : ['error', 'warn'],
36
+ });
37
+ },
38
+ inject: [config_service_1.ConfigService],
39
+ },
40
+ {
41
+ provide: PrismaModule_1,
42
+ useFactory: (prisma) => {
43
+ return new PrismaModule_1(prisma);
44
+ },
45
+ inject: [client_1.PrismaClient],
46
+ },
47
+ ],
48
+ exports: [client_1.PrismaClient],
49
+ };
50
+ }
51
+ static forRootAsync(options) {
52
+ const additionalImports = options?.imports || [];
53
+ return {
54
+ module: PrismaModule_1,
55
+ global: true,
56
+ imports: [config_module_1.ConfigModule, ...additionalImports],
57
+ providers: [
58
+ {
59
+ provide: client_1.PrismaClient,
60
+ useFactory: async (...args) => {
61
+ if (!options) {
62
+ throw new Error('Options are required for forRootAsync');
63
+ }
64
+ const moduleOptions = await options.useFactory(...args);
65
+ const configService = args.find((arg) => arg && typeof arg === 'object' && 'getConfig' in arg);
66
+ const databaseUrl = moduleOptions.databaseUrl || PrismaModule_1.getDatabaseUrlFromConfig(configService);
67
+ if (databaseUrl) {
68
+ process.env.DATABASE_URL = databaseUrl;
69
+ }
70
+ return new client_1.PrismaClient({
71
+ log: moduleOptions.logLevel ? [moduleOptions.logLevel] : ['error', 'warn'],
72
+ });
73
+ },
74
+ inject: options?.inject || [],
75
+ },
76
+ {
77
+ provide: PrismaModule_1,
78
+ useFactory: (prisma) => {
79
+ return new PrismaModule_1(prisma);
80
+ },
81
+ inject: [client_1.PrismaClient],
82
+ },
83
+ ],
84
+ exports: [client_1.PrismaClient],
85
+ };
86
+ }
87
+ async onModuleInit() {
88
+ await this.prisma.$connect();
89
+ }
90
+ async onModuleDestroy() {
91
+ await this.prisma.$disconnect();
92
+ }
93
+ static getDatabaseUrlFromConfig(configService) {
94
+ if (!configService) {
95
+ const databaseUrl = process.env.DATABASE_URL;
96
+ if (!databaseUrl) {
97
+ throw new Error('DATABASE_URL environment variable or ConfigService is required');
98
+ }
99
+ return databaseUrl;
100
+ }
101
+ const config = configService.getConfig();
102
+ const dbConfig = config.database;
103
+ if (!dbConfig) {
104
+ throw new Error('Database configuration is required');
105
+ }
106
+ return PrismaModule_1.buildDatabaseUrl(dbConfig);
107
+ }
108
+ static buildDatabaseUrl(dbConfig) {
109
+ const { type, username, password, host, port, database, sslMode } = dbConfig;
110
+ const protocol = type === 'postgres' ? 'postgresql' : type;
111
+ const ssl = sslMode && sslMode !== 'disable' ? '?sslmode=require' : '';
112
+ return `${protocol}://${username}:${password}@${host}:${port}/${database}${ssl}`;
113
+ }
114
+ };
115
+ exports.PrismaModule = PrismaModule;
116
+ exports.PrismaModule = PrismaModule = PrismaModule_1 = __decorate([
117
+ (0, common_1.Global)(),
118
+ (0, common_1.Module)({}),
119
+ __metadata("design:paramtypes", [client_1.PrismaClient])
120
+ ], PrismaModule);
121
+ //# sourceMappingURL=prisma.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prisma.module.js","sourceRoot":"","sources":["../../src/database/prisma.module.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { HealthService } from '../health/health.service';
2
+ import { HealthCheckResult } from './health.interface';
3
+ export declare class HealthController {
4
+ private readonly healthService;
5
+ constructor(healthService: HealthService);
6
+ check(): Promise<HealthCheckResult>;
7
+ ping(): {
8
+ message: string;
9
+ };
10
+ }
@@ -0,0 +1,75 @@
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.HealthController = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const swagger_1 = require("@nestjs/swagger");
15
+ const health_service_1 = require("../health/health.service");
16
+ let HealthController = class HealthController {
17
+ constructor(healthService) {
18
+ this.healthService = healthService;
19
+ }
20
+ async check() {
21
+ const result = await this.healthService.isHealthy('application');
22
+ return {
23
+ status: 'ok',
24
+ info: result,
25
+ details: result,
26
+ };
27
+ }
28
+ ping() {
29
+ return { message: 'pong' };
30
+ }
31
+ };
32
+ exports.HealthController = HealthController;
33
+ __decorate([
34
+ (0, common_1.Get)('health'),
35
+ (0, swagger_1.ApiOperation)({ summary: 'Health check endpoint' }),
36
+ (0, swagger_1.ApiResponse)({
37
+ status: 200,
38
+ description: 'Service is healthy',
39
+ schema: {
40
+ type: 'object',
41
+ properties: {
42
+ status: { type: 'string', example: 'ok' },
43
+ info: { type: 'object' },
44
+ error: { type: 'object' },
45
+ details: { type: 'object' },
46
+ },
47
+ },
48
+ }),
49
+ __metadata("design:type", Function),
50
+ __metadata("design:paramtypes", []),
51
+ __metadata("design:returntype", Promise)
52
+ ], HealthController.prototype, "check", null);
53
+ __decorate([
54
+ (0, common_1.Get)('ping'),
55
+ (0, swagger_1.ApiOperation)({ summary: 'Ping endpoint for connectivity checks' }),
56
+ (0, swagger_1.ApiResponse)({
57
+ status: 200,
58
+ description: 'Pong response',
59
+ schema: {
60
+ type: 'object',
61
+ properties: {
62
+ message: { type: 'string', example: 'pong' },
63
+ },
64
+ },
65
+ }),
66
+ __metadata("design:type", Function),
67
+ __metadata("design:paramtypes", []),
68
+ __metadata("design:returntype", Object)
69
+ ], HealthController.prototype, "ping", null);
70
+ exports.HealthController = HealthController = __decorate([
71
+ (0, swagger_1.ApiTags)('Health'),
72
+ (0, common_1.Controller)(),
73
+ __metadata("design:paramtypes", [health_service_1.HealthService])
74
+ ], HealthController);
75
+ //# sourceMappingURL=health.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.controller.js","sourceRoot":"","sources":["../../src/health/health.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAAiD;AACjD,6CAAqE;AACrE,4DAAwD;AAKjD,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IAC3B,YAA6B,aAA4B;QAA5B,kBAAa,GAAb,aAAa,CAAe;IAAG,CAAC;IAiBvD,AAAN,KAAK,CAAC,KAAK;QACT,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAEjE,OAAO;YACL,MAAM,EAAE,IAAI;YACZ,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,MAAM;SAChB,CAAC;IACJ,CAAC;IAcD,IAAI;QACF,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAC7B,CAAC;CACF,CAAA;AA3CY,4CAAgB;AAkBrB;IAfL,IAAA,YAAG,EAAC,QAAQ,CAAC;IACb,IAAA,sBAAY,EAAC,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC;IAClD,IAAA,qBAAW,EAAC;QACX,MAAM,EAAE,GAAG;QACX,WAAW,EAAE,oBAAoB;QACjC,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE;gBACzC,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACxB,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACzB,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;aAC5B;SACF;KACF,CAAC;;;;6CASD;AAcD;IAZC,IAAA,YAAG,EAAC,MAAM,CAAC;IACX,IAAA,sBAAY,EAAC,EAAE,OAAO,EAAE,uCAAuC,EAAE,CAAC;IAClE,IAAA,qBAAW,EAAC;QACX,MAAM,EAAE,GAAG;QACX,WAAW,EAAE,eAAe;QAC5B,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE;aAC7C;SACF;KACF,CAAC;;;;4CAGD;2BA1CU,gBAAgB;IAF5B,IAAA,iBAAO,EAAC,QAAQ,CAAC;IACjB,IAAA,mBAAU,GAAE;qCAEiC,8BAAa;GAD9C,gBAAgB,CA2C5B"}
@@ -0,0 +1,14 @@
1
+ export interface HealthCheckResult {
2
+ status: 'ok' | 'error';
3
+ info?: Record<string, unknown>;
4
+ error?: Record<string, unknown>;
5
+ details?: Record<string, unknown>;
6
+ timestamp?: string;
7
+ uptime?: number;
8
+ checks?: Record<string, HealthCheckDetail>;
9
+ }
10
+ export interface HealthCheckDetail {
11
+ status: 'up' | 'down';
12
+ message?: string;
13
+ error?: string;
14
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=health.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.interface.js","sourceRoot":"","sources":["../../src/health/health.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export declare class HealthModule {
2
+ }
@@ -0,0 +1,23 @@
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.HealthModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const health_controller_1 = require("../health/health.controller");
12
+ const health_service_1 = require("../health/health.service");
13
+ let HealthModule = class HealthModule {
14
+ };
15
+ exports.HealthModule = HealthModule;
16
+ exports.HealthModule = HealthModule = __decorate([
17
+ (0, common_1.Module)({
18
+ controllers: [health_controller_1.HealthController],
19
+ providers: [health_service_1.HealthService],
20
+ exports: [health_service_1.HealthService],
21
+ })
22
+ ], HealthModule);
23
+ //# sourceMappingURL=health.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.module.js","sourceRoot":"","sources":["../../src/health/health.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,kEAA8D;AAC9D,4DAAwD;AAOjD,IAAM,YAAY,GAAlB,MAAM,YAAY;CAAG,CAAA;AAAf,oCAAY;uBAAZ,YAAY;IALxB,IAAA,eAAM,EAAC;QACN,WAAW,EAAE,CAAC,oCAAgB,CAAC;QAC/B,SAAS,EAAE,CAAC,8BAAa,CAAC;QAC1B,OAAO,EAAE,CAAC,8BAAa,CAAC;KACzB,CAAC;GACW,YAAY,CAAG"}
@@ -0,0 +1,10 @@
1
+ export interface HealthIndicatorResult {
2
+ [key: string]: {
3
+ status: string;
4
+ message?: string;
5
+ [key: string]: unknown;
6
+ };
7
+ }
8
+ export declare class HealthService {
9
+ isHealthy(key: string): Promise<HealthIndicatorResult>;
10
+ }
@@ -0,0 +1,25 @@
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.HealthService = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ let HealthService = class HealthService {
12
+ async isHealthy(key) {
13
+ return {
14
+ [key]: {
15
+ status: 'up',
16
+ message: 'Service is running',
17
+ },
18
+ };
19
+ }
20
+ };
21
+ exports.HealthService = HealthService;
22
+ exports.HealthService = HealthService = __decorate([
23
+ (0, common_1.Injectable)()
24
+ ], HealthService);
25
+ //# sourceMappingURL=health.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.service.js","sourceRoot":"","sources":["../../src/health/health.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4C;AAWrC,IAAM,aAAa,GAAnB,MAAM,aAAa;IACxB,KAAK,CAAC,SAAS,CAAC,GAAW;QACzB,OAAO;YACL,CAAC,GAAG,CAAC,EAAE;gBACL,MAAM,EAAE,IAAI;gBACZ,OAAO,EAAE,oBAAoB;aAC9B;SACF,CAAC;IACJ,CAAC;CACF,CAAA;AATY,sCAAa;wBAAb,aAAa;IADzB,IAAA,mBAAU,GAAE;GACA,aAAa,CASzB"}