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.
- package/README.md +452 -0
- package/dist/cache/cache.module.d.ts +5 -0
- package/dist/cache/cache.module.js +32 -0
- package/dist/cache/cache.module.js.map +1 -0
- package/dist/cache/cache.service.d.ts +18 -0
- package/dist/cache/cache.service.js +68 -0
- package/dist/cache/cache.service.js.map +1 -0
- package/dist/client/client.interface.d.ts +14 -0
- package/dist/client/client.interface.js +3 -0
- package/dist/client/client.interface.js.map +1 -0
- package/dist/client/http-client.module.d.ts +2 -0
- package/dist/client/http-client.module.js +22 -0
- package/dist/client/http-client.module.js.map +1 -0
- package/dist/client/http-client.service.d.ts +12 -0
- package/dist/client/http-client.service.js +100 -0
- package/dist/client/http-client.service.js.map +1 -0
- package/dist/config/config.interface.d.ts +42 -0
- package/dist/config/config.interface.js +3 -0
- package/dist/config/config.interface.js.map +1 -0
- package/dist/config/config.module.d.ts +2 -0
- package/dist/config/config.module.js +28 -0
- package/dist/config/config.module.js.map +1 -0
- package/dist/config/config.service.d.ts +10 -0
- package/dist/config/config.service.js +85 -0
- package/dist/config/config.service.js.map +1 -0
- package/dist/database/prisma.module.d.ts +21 -0
- package/dist/database/prisma.module.js +121 -0
- package/dist/database/prisma.module.js.map +1 -0
- package/dist/health/health.controller.d.ts +10 -0
- package/dist/health/health.controller.js +75 -0
- package/dist/health/health.controller.js.map +1 -0
- package/dist/health/health.interface.d.ts +14 -0
- package/dist/health/health.interface.js +3 -0
- package/dist/health/health.interface.js.map +1 -0
- package/dist/health/health.module.d.ts +2 -0
- package/dist/health/health.module.js +23 -0
- package/dist/health/health.module.js.map +1 -0
- package/dist/health/health.service.d.ts +10 -0
- package/dist/health/health.service.js +25 -0
- package/dist/health/health.service.js.map +1 -0
- package/dist/http/http-response.decorator.d.ts +6 -0
- package/dist/http/http-response.decorator.js +8 -0
- package/dist/http/http-response.decorator.js.map +1 -0
- package/dist/http/http-response.module.d.ts +2 -0
- package/dist/http/http-response.module.js +22 -0
- package/dist/http/http-response.module.js.map +1 -0
- package/dist/http/http-response.service.d.ts +17 -0
- package/dist/http/http-response.service.js +73 -0
- package/dist/http/http-response.service.js.map +1 -0
- package/dist/http/response.interface.d.ts +10 -0
- package/dist/http/response.interface.js +3 -0
- package/dist/http/response.interface.js.map +1 -0
- package/dist/i18n/i18n.module.d.ts +5 -0
- package/dist/i18n/i18n.module.js +32 -0
- package/dist/i18n/i18n.module.js.map +1 -0
- package/dist/i18n/i18n.service.d.ts +16 -0
- package/dist/i18n/i18n.service.js +58 -0
- package/dist/i18n/i18n.service.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.js +50 -0
- package/dist/index.js.map +1 -0
- package/dist/microservice-common.module.d.ts +17 -0
- package/dist/microservice-common.module.js +76 -0
- package/dist/microservice-common.module.js.map +1 -0
- package/dist/middleware/correlation-id.middleware.d.ts +9 -0
- package/dist/middleware/correlation-id.middleware.js +34 -0
- package/dist/middleware/correlation-id.middleware.js.map +1 -0
- package/dist/middleware/cors.middleware.d.ts +9 -0
- package/dist/middleware/cors.middleware.js +71 -0
- package/dist/middleware/cors.middleware.js.map +1 -0
- package/dist/middleware/logging.middleware.d.ts +10 -0
- package/dist/middleware/logging.middleware.js +75 -0
- package/dist/middleware/logging.middleware.js.map +1 -0
- package/dist/middleware/middleware.interface.d.ts +18 -0
- package/dist/middleware/middleware.interface.js +3 -0
- package/dist/middleware/middleware.interface.js.map +1 -0
- package/dist/middleware/middleware.module.d.ts +9 -0
- package/dist/middleware/middleware.module.js +61 -0
- package/dist/middleware/middleware.module.js.map +1 -0
- package/dist/prometheus/prometheus.module.d.ts +8 -0
- package/dist/prometheus/prometheus.module.js +44 -0
- package/dist/prometheus/prometheus.module.js.map +1 -0
- package/dist/prometheus/prometheus.service.d.ts +14 -0
- package/dist/prometheus/prometheus.service.js +56 -0
- package/dist/prometheus/prometheus.service.js.map +1 -0
- package/dist/rate-limit/rate-limit.module.d.ts +4 -0
- package/dist/rate-limit/rate-limit.module.js +47 -0
- package/dist/rate-limit/rate-limit.module.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- 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 @@
|
|
|
1
|
+
{"version":3,"file":"config.interface.js","sourceRoot":"","sources":["../../src/config/config.interface.ts"],"names":[],"mappings":""}
|
|
@@ -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":"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"}
|
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"health.interface.js","sourceRoot":"","sources":["../../src/health/health.interface.ts"],"names":[],"mappings":""}
|
|
@@ -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,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"}
|