@saultechitsolutions/gighub-shared-core 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 (104) hide show
  1. package/dist/audit/audit.module.d.ts +2 -0
  2. package/dist/audit/audit.module.js +25 -0
  3. package/dist/audit/audit.module.js.map +1 -0
  4. package/dist/audit/audit.service.d.ts +16 -0
  5. package/dist/audit/audit.service.js +95 -0
  6. package/dist/audit/audit.service.js.map +1 -0
  7. package/dist/audit/interfaces/audit-log.interface.d.ts +36 -0
  8. package/dist/audit/interfaces/audit-log.interface.js +3 -0
  9. package/dist/audit/interfaces/audit-log.interface.js.map +1 -0
  10. package/dist/context/geolocation.service.d.ts +19 -0
  11. package/dist/context/geolocation.service.js +87 -0
  12. package/dist/context/geolocation.service.js.map +1 -0
  13. package/dist/context/interfaces/request-context.interface.d.ts +29 -0
  14. package/dist/context/interfaces/request-context.interface.js +3 -0
  15. package/dist/context/interfaces/request-context.interface.js.map +1 -0
  16. package/dist/context/request-context.middleware.d.ts +11 -0
  17. package/dist/context/request-context.middleware.js +88 -0
  18. package/dist/context/request-context.middleware.js.map +1 -0
  19. package/dist/context/request-context.module.d.ts +4 -0
  20. package/dist/context/request-context.module.js +27 -0
  21. package/dist/context/request-context.module.js.map +1 -0
  22. package/dist/context/request-context.service.d.ts +24 -0
  23. package/dist/context/request-context.service.js +150 -0
  24. package/dist/context/request-context.service.js.map +1 -0
  25. package/dist/decorators/current-user.decorator.d.ts +1 -0
  26. package/dist/decorators/current-user.decorator.js +10 -0
  27. package/dist/decorators/current-user.decorator.js.map +1 -0
  28. package/dist/decorators/public.decorator.d.ts +2 -0
  29. package/dist/decorators/public.decorator.js +8 -0
  30. package/dist/decorators/public.decorator.js.map +1 -0
  31. package/dist/decorators/roles.decorator.d.ts +2 -0
  32. package/dist/decorators/roles.decorator.js +8 -0
  33. package/dist/decorators/roles.decorator.js.map +1 -0
  34. package/dist/dto/api-response.dto.d.ts +25 -0
  35. package/dist/dto/api-response.dto.js +87 -0
  36. package/dist/dto/api-response.dto.js.map +1 -0
  37. package/dist/dto/base.dto.d.ts +5 -0
  38. package/dist/dto/base.dto.js +7 -0
  39. package/dist/dto/base.dto.js.map +1 -0
  40. package/dist/dto/pagination.dto.d.ts +14 -0
  41. package/dist/dto/pagination.dto.js +59 -0
  42. package/dist/dto/pagination.dto.js.map +1 -0
  43. package/dist/exceptions/api.exception.d.ts +10 -0
  44. package/dist/exceptions/api.exception.js +31 -0
  45. package/dist/exceptions/api.exception.js.map +1 -0
  46. package/dist/exceptions/business.exception.d.ts +12 -0
  47. package/dist/exceptions/business.exception.js +37 -0
  48. package/dist/exceptions/business.exception.js.map +1 -0
  49. package/dist/exceptions/database.exception.d.ts +11 -0
  50. package/dist/exceptions/database.exception.js +34 -0
  51. package/dist/exceptions/database.exception.js.map +1 -0
  52. package/dist/filters/global-exception.filter.d.ts +10 -0
  53. package/dist/filters/global-exception.filter.js +131 -0
  54. package/dist/filters/global-exception.filter.js.map +1 -0
  55. package/dist/filters/http-exception.filter.d.ts +8 -0
  56. package/dist/filters/http-exception.filter.js +48 -0
  57. package/dist/filters/http-exception.filter.js.map +1 -0
  58. package/dist/guards/auth.guard.d.ts +12 -0
  59. package/dist/guards/auth.guard.js +63 -0
  60. package/dist/guards/auth.guard.js.map +1 -0
  61. package/dist/guards/interfaces/endpoint-permission.interface.d.ts +24 -0
  62. package/dist/guards/interfaces/endpoint-permission.interface.js +3 -0
  63. package/dist/guards/interfaces/endpoint-permission.interface.js.map +1 -0
  64. package/dist/guards/interfaces/permission-provider.interface.d.ts +5 -0
  65. package/dist/guards/interfaces/permission-provider.interface.js +3 -0
  66. package/dist/guards/interfaces/permission-provider.interface.js.map +1 -0
  67. package/dist/guards/interfaces/user.auth.d.ts +22 -0
  68. package/dist/guards/interfaces/user.auth.js +13 -0
  69. package/dist/guards/interfaces/user.auth.js.map +1 -0
  70. package/dist/guards/roles.guard.d.ts +17 -0
  71. package/dist/guards/roles.guard.js +111 -0
  72. package/dist/guards/roles.guard.js.map +1 -0
  73. package/dist/guards/roles.module.d.ts +8 -0
  74. package/dist/guards/roles.module.js +36 -0
  75. package/dist/guards/roles.module.js.map +1 -0
  76. package/dist/index.d.ts +25 -0
  77. package/dist/index.js +42 -0
  78. package/dist/index.js.map +1 -0
  79. package/dist/interceptors/logging.interceptor.d.ts +14 -0
  80. package/dist/interceptors/logging.interceptor.js +102 -0
  81. package/dist/interceptors/logging.interceptor.js.map +1 -0
  82. package/dist/interceptors/transform.interceptor.d.ts +12 -0
  83. package/dist/interceptors/transform.interceptor.js +29 -0
  84. package/dist/interceptors/transform.interceptor.js.map +1 -0
  85. package/dist/kafka/interfaces/kafka-config.interface.d.ts +20 -0
  86. package/dist/kafka/interfaces/kafka-config.interface.js +3 -0
  87. package/dist/kafka/interfaces/kafka-config.interface.js.map +1 -0
  88. package/dist/kafka/kafka.module.d.ts +9 -0
  89. package/dist/kafka/kafka.module.js +47 -0
  90. package/dist/kafka/kafka.module.js.map +1 -0
  91. package/dist/kafka/kafka.service.d.ts +24 -0
  92. package/dist/kafka/kafka.service.js +237 -0
  93. package/dist/kafka/kafka.service.js.map +1 -0
  94. package/dist/redis/interfaces/redis-config.interface.d.ts +6 -0
  95. package/dist/redis/interfaces/redis-config.interface.js +3 -0
  96. package/dist/redis/interfaces/redis-config.interface.js.map +1 -0
  97. package/dist/redis/redis.module.d.ts +5 -0
  98. package/dist/redis/redis.module.js +33 -0
  99. package/dist/redis/redis.module.js.map +1 -0
  100. package/dist/redis/redis.service.d.ts +17 -0
  101. package/dist/redis/redis.service.js +78 -0
  102. package/dist/redis/redis.service.js.map +1 -0
  103. package/dist/tsconfig.tsbuildinfo +1 -0
  104. package/package.json +50 -0
@@ -0,0 +1,14 @@
1
+ import { NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
2
+ import { Observable } from 'rxjs';
3
+ import { RequestContextService } from '../context/request-context.service';
4
+ import { NestMiddleware } from '@nestjs/common';
5
+ import { Request, Response, NextFunction } from 'express';
6
+ export declare class LoggingMiddleware implements NestMiddleware {
7
+ use(req: Request, res: Response, next: NextFunction): void;
8
+ }
9
+ export declare class LoggingInterceptor implements NestInterceptor {
10
+ private readonly contextService;
11
+ private readonly logger;
12
+ constructor(contextService: RequestContextService);
13
+ intercept(context: ExecutionContext, next: CallHandler): Observable<any>;
14
+ }
@@ -0,0 +1,102 @@
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 LoggingInterceptor_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.LoggingInterceptor = exports.LoggingMiddleware = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const operators_1 = require("rxjs/operators");
16
+ const request_context_service_1 = require("../context/request-context.service");
17
+ const common_2 = require("@nestjs/common");
18
+ let LoggingMiddleware = class LoggingMiddleware {
19
+ use(req, res, next) {
20
+ console.log("Request full path ::: " + req.originalUrl);
21
+ const incomingRequestDetails = {
22
+ message: '📥 Incoming Request',
23
+ method: req.method,
24
+ path: req.originalUrl,
25
+ timestamp: new Date().toISOString(),
26
+ ip: req.ip,
27
+ protocol: req.protocol,
28
+ hostname: req.hostname,
29
+ secure: req.secure
30
+ };
31
+ if (req.body && Object.keys(req.body).length > 0) {
32
+ incomingRequestDetails.body = req.body;
33
+ }
34
+ if (req.query && Object.keys(req.query).length > 0) {
35
+ incomingRequestDetails.query = req.query;
36
+ }
37
+ if (req.params && Object.keys(req.params).length > 0 && !req.params["0"]) {
38
+ incomingRequestDetails.params = req.params;
39
+ }
40
+ console.log(JSON.stringify(incomingRequestDetails, null, 2));
41
+ const originalSend = res.send;
42
+ res.send = function (body) {
43
+ const contentType = res.getHeader('Content-Type');
44
+ let parsedBody = body;
45
+ if (contentType && String(contentType).includes('application/json')) {
46
+ try {
47
+ if (typeof body === 'string' && body.trim().startsWith('{')) {
48
+ parsedBody = JSON.parse(body);
49
+ }
50
+ else if (Buffer.isBuffer(body)) {
51
+ parsedBody = JSON.parse(body.toString());
52
+ }
53
+ }
54
+ catch (e) {
55
+ console.warn('Failed to parse response body:', e);
56
+ }
57
+ }
58
+ console.log(JSON.stringify({
59
+ message: 'Outgoing Response',
60
+ statusCode: res.statusCode,
61
+ body: parsedBody,
62
+ timestamp: new Date().toISOString()
63
+ }, null, 2));
64
+ res.send = originalSend;
65
+ return res.send(body);
66
+ };
67
+ next();
68
+ }
69
+ };
70
+ exports.LoggingMiddleware = LoggingMiddleware;
71
+ exports.LoggingMiddleware = LoggingMiddleware = __decorate([
72
+ (0, common_2.Injectable)()
73
+ ], LoggingMiddleware);
74
+ let LoggingInterceptor = LoggingInterceptor_1 = class LoggingInterceptor {
75
+ constructor(contextService) {
76
+ this.contextService = contextService;
77
+ this.logger = new common_1.Logger(LoggingInterceptor_1.name);
78
+ }
79
+ intercept(context, next) {
80
+ const request = context.switchToHttp().getRequest();
81
+ const { method, url, body } = request;
82
+ const correlationId = this.contextService.getCorrelationId();
83
+ const startTime = Date.now();
84
+ this.logger.log(`[${correlationId}] ${method} ${url} - Request started`);
85
+ return next.handle().pipe((0, operators_1.tap)({
86
+ next: (data) => {
87
+ const duration = Date.now() - startTime;
88
+ this.logger.log(`[${correlationId}] ${method} ${url} - Completed in ${duration}ms`);
89
+ },
90
+ error: (error) => {
91
+ const duration = Date.now() - startTime;
92
+ this.logger.error(`[${correlationId}] ${method} ${url} - Failed in ${duration}ms`, error.stack);
93
+ },
94
+ }));
95
+ }
96
+ };
97
+ exports.LoggingInterceptor = LoggingInterceptor;
98
+ exports.LoggingInterceptor = LoggingInterceptor = LoggingInterceptor_1 = __decorate([
99
+ (0, common_2.Injectable)(),
100
+ __metadata("design:paramtypes", [request_context_service_1.RequestContextService])
101
+ ], LoggingInterceptor);
102
+ //# sourceMappingURL=logging.interceptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging.interceptor.js","sourceRoot":"","sources":["../../src/interceptors/logging.interceptor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
2
+ import { Observable } from 'rxjs';
3
+ export interface Response<T> {
4
+ statusCode: number;
5
+ message: string;
6
+ data: T;
7
+ timestamp: string;
8
+ path: string;
9
+ }
10
+ export declare class TransformInterceptor<T> implements NestInterceptor<T, Response<T>> {
11
+ intercept(context: ExecutionContext, next: CallHandler): Observable<Response<T>>;
12
+ }
@@ -0,0 +1,29 @@
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.TransformInterceptor = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const operators_1 = require("rxjs/operators");
12
+ let TransformInterceptor = class TransformInterceptor {
13
+ intercept(context, next) {
14
+ const request = context.switchToHttp().getRequest();
15
+ const statusCode = context.switchToHttp().getResponse().statusCode;
16
+ return next.handle().pipe((0, operators_1.map)((data) => ({
17
+ statusCode,
18
+ message: data?.message || 'Success',
19
+ data: data?.data || data,
20
+ timestamp: new Date().toISOString(),
21
+ path: request.url,
22
+ })));
23
+ }
24
+ };
25
+ exports.TransformInterceptor = TransformInterceptor;
26
+ exports.TransformInterceptor = TransformInterceptor = __decorate([
27
+ (0, common_1.Injectable)()
28
+ ], TransformInterceptor);
29
+ //# sourceMappingURL=transform.interceptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform.interceptor.js","sourceRoot":"","sources":["../../src/interceptors/transform.interceptor.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAKwB;AAExB,8CAAqC;AAW9B,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IAE7B,SAAS,CACL,OAAyB,EACzB,IAAiB;QAEjB,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;QACpD,MAAM,UAAU,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC;QAEnE,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CACrB,IAAA,eAAG,EAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACX,UAAU;YACV,OAAO,EAAE,IAAI,EAAE,OAAO,IAAI,SAAS;YACnC,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,IAAI;YACxB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,IAAI,EAAE,OAAO,CAAC,GAAG;SACpB,CAAC,CAAC,CACN,CAAC;IACN,CAAC;CACJ,CAAA;AAnBY,oDAAoB;+BAApB,oBAAoB;IADhC,IAAA,mBAAU,GAAE;GACA,oBAAoB,CAmBhC"}
@@ -0,0 +1,20 @@
1
+ export interface KafkaConfig {
2
+ clientId: string;
3
+ brokers: string[];
4
+ ssl?: boolean;
5
+ sasl?: {
6
+ mechanism: 'scram-sha-512';
7
+ username: string;
8
+ password: string;
9
+ };
10
+ autoCreateTopics?: string[];
11
+ defaultTopicConfig?: {
12
+ numPartitions?: number;
13
+ replicationFactor?: number;
14
+ };
15
+ }
16
+ export interface TopicConfig {
17
+ topic: string;
18
+ numPartitions?: number;
19
+ replicationFactor?: number;
20
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=kafka-config.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kafka-config.interface.js","sourceRoot":"","sources":["../../../src/kafka/interfaces/kafka-config.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ import { DynamicModule } from '@nestjs/common';
2
+ import { KafkaConfig } from './interfaces/kafka-config.interface';
3
+ export declare class KafkaModule {
4
+ static forRoot(config: KafkaConfig): DynamicModule;
5
+ static forRootAsync(options: {
6
+ useFactory: (...args: any[]) => Promise<KafkaConfig> | KafkaConfig;
7
+ inject?: any[];
8
+ }): DynamicModule;
9
+ }
@@ -0,0 +1,47 @@
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 KafkaModule_1;
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.KafkaModule = void 0;
11
+ const common_1 = require("@nestjs/common");
12
+ const kafka_service_1 = require("./kafka.service");
13
+ let KafkaModule = KafkaModule_1 = class KafkaModule {
14
+ static forRoot(config) {
15
+ return {
16
+ module: KafkaModule_1,
17
+ providers: [
18
+ {
19
+ provide: 'KAFKA_CONFIG',
20
+ useValue: config,
21
+ },
22
+ kafka_service_1.KafkaService,
23
+ ],
24
+ exports: [kafka_service_1.KafkaService],
25
+ };
26
+ }
27
+ static forRootAsync(options) {
28
+ return {
29
+ module: KafkaModule_1,
30
+ providers: [
31
+ {
32
+ provide: 'KAFKA_CONFIG',
33
+ useFactory: options.useFactory,
34
+ inject: options.inject || [],
35
+ },
36
+ kafka_service_1.KafkaService,
37
+ ],
38
+ exports: [kafka_service_1.KafkaService],
39
+ };
40
+ }
41
+ };
42
+ exports.KafkaModule = KafkaModule;
43
+ exports.KafkaModule = KafkaModule = KafkaModule_1 = __decorate([
44
+ (0, common_1.Global)(),
45
+ (0, common_1.Module)({})
46
+ ], KafkaModule);
47
+ //# sourceMappingURL=kafka.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kafka.module.js","sourceRoot":"","sources":["../../src/kafka/kafka.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAA+D;AAC/D,mDAA+C;AAKxC,IAAM,WAAW,mBAAjB,MAAM,WAAW;IACpB,MAAM,CAAC,OAAO,CAAC,MAAmB;QAC9B,OAAO;YACH,MAAM,EAAE,aAAW;YACnB,SAAS,EAAE;gBACP;oBACI,OAAO,EAAE,cAAc;oBACvB,QAAQ,EAAE,MAAM;iBACnB;gBACD,4BAAY;aACf;YACD,OAAO,EAAE,CAAC,4BAAY,CAAC;SAC1B,CAAC;IACN,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,OAGnB;QACG,OAAO;YACH,MAAM,EAAE,aAAW;YACnB,SAAS,EAAE;gBACP;oBACI,OAAO,EAAE,cAAc;oBACvB,UAAU,EAAE,OAAO,CAAC,UAAU;oBAC9B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;iBAC/B;gBACD,4BAAY;aACf;YACD,OAAO,EAAE,CAAC,4BAAY,CAAC;SAC1B,CAAC;IACN,CAAC;CACJ,CAAA;AAhCY,kCAAW;sBAAX,WAAW;IAFvB,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,WAAW,CAgCvB"}
@@ -0,0 +1,24 @@
1
+ import { OnModuleInit, OnModuleDestroy } from '@nestjs/common';
2
+ import { Producer, Admin } from 'kafkajs';
3
+ import { KafkaConfig, TopicConfig } from './interfaces/kafka-config.interface';
4
+ export declare class KafkaService implements OnModuleInit, OnModuleDestroy {
5
+ private readonly config;
6
+ private readonly logger;
7
+ private kafka;
8
+ private producer;
9
+ private admin;
10
+ private consumers;
11
+ constructor(config: KafkaConfig);
12
+ onModuleInit(): Promise<void>;
13
+ onModuleDestroy(): Promise<void>;
14
+ createTopics(topics: string[] | TopicConfig[]): Promise<void>;
15
+ publish(topic: string, message: any, key?: string): Promise<void>;
16
+ sendMessage(topic: string, message: string | object): Promise<void>;
17
+ subscribe(topic: string, groupId: string, callback: (message: any) => Promise<void>, fromBeginning?: boolean): Promise<void>;
18
+ subscribeToMultiple(topics: string[], groupId: string, callback: (topic: string, message: any) => Promise<void>, fromBeginning?: boolean): Promise<void>;
19
+ getAdmin(): Admin;
20
+ getProducer(): Producer;
21
+ topicExists(topic: string): Promise<boolean>;
22
+ deleteTopic(topic: string): Promise<void>;
23
+ listTopics(): Promise<string[]>;
24
+ }
@@ -0,0 +1,237 @@
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 __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var KafkaService_1;
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.KafkaService = void 0;
17
+ const common_1 = require("@nestjs/common");
18
+ const kafkajs_1 = require("kafkajs");
19
+ let KafkaService = KafkaService_1 = class KafkaService {
20
+ constructor(config) {
21
+ this.config = config;
22
+ this.logger = new common_1.Logger(KafkaService_1.name);
23
+ this.consumers = new Map();
24
+ this.kafka = new kafkajs_1.Kafka({
25
+ clientId: config.clientId,
26
+ brokers: config.brokers,
27
+ ssl: config.ssl,
28
+ sasl: config.sasl,
29
+ });
30
+ this.producer = this.kafka.producer();
31
+ this.admin = this.kafka.admin();
32
+ }
33
+ async onModuleInit() {
34
+ try {
35
+ await this.producer.connect();
36
+ this.logger.log('Kafka Producer connected');
37
+ await this.admin.connect();
38
+ this.logger.log('Kafka Admin connected');
39
+ if (this.config.autoCreateTopics && this.config.autoCreateTopics.length > 0) {
40
+ await this.createTopics(this.config.autoCreateTopics);
41
+ }
42
+ }
43
+ catch (error) {
44
+ this.logger.error('Failed to initialize Kafka:', error);
45
+ throw error;
46
+ }
47
+ }
48
+ async onModuleDestroy() {
49
+ try {
50
+ await this.producer.disconnect();
51
+ this.logger.log('Kafka Producer disconnected');
52
+ for (const [topic, consumer] of this.consumers.entries()) {
53
+ await consumer.disconnect();
54
+ this.logger.log(`Kafka Consumer for topic "${topic}" disconnected`);
55
+ }
56
+ await this.admin.disconnect();
57
+ this.logger.log('Kafka Admin disconnected');
58
+ }
59
+ catch (error) {
60
+ this.logger.error('Error during Kafka cleanup:', error);
61
+ }
62
+ }
63
+ async createTopics(topics) {
64
+ if (!topics || topics.length === 0) {
65
+ this.logger.warn('No topics provided for creation');
66
+ return;
67
+ }
68
+ try {
69
+ const metadata = await this.admin.fetchTopicMetadata();
70
+ const existingTopics = metadata.topics.map((t) => t.name);
71
+ const topicConfigs = topics.map((topic) => {
72
+ if (typeof topic === 'string') {
73
+ return {
74
+ topic,
75
+ numPartitions: this.config.defaultTopicConfig?.numPartitions || 1,
76
+ replicationFactor: this.config.defaultTopicConfig?.replicationFactor || 1,
77
+ };
78
+ }
79
+ return {
80
+ numPartitions: 1,
81
+ replicationFactor: 1,
82
+ ...topic,
83
+ };
84
+ });
85
+ const topicsToCreate = topicConfigs.filter((config) => !existingTopics.includes(config.topic));
86
+ if (topicsToCreate.length === 0) {
87
+ this.logger.log('All topics already exist. No topics to create.');
88
+ return;
89
+ }
90
+ const created = await this.admin.createTopics({
91
+ topics: topicsToCreate,
92
+ });
93
+ if (created) {
94
+ this.logger.log(`Kafka topics created successfully: ${topicsToCreate.map((t) => t.topic).join(', ')}`);
95
+ }
96
+ else {
97
+ this.logger.warn('Kafka topics creation returned false');
98
+ }
99
+ }
100
+ catch (error) {
101
+ this.logger.error('Error creating Kafka topics:', error);
102
+ }
103
+ }
104
+ async publish(topic, message, key) {
105
+ if (!topic) {
106
+ throw new Error('Topic must be provided');
107
+ }
108
+ try {
109
+ await this.producer.send({
110
+ topic,
111
+ messages: [
112
+ {
113
+ key: key || undefined,
114
+ value: JSON.stringify(message),
115
+ headers: {
116
+ timestamp: Date.now().toString(),
117
+ },
118
+ },
119
+ ],
120
+ });
121
+ this.logger.debug(`Message published to topic "${topic}"`);
122
+ }
123
+ catch (error) {
124
+ this.logger.error(`Error publishing message to topic "${topic}":`, error);
125
+ throw error;
126
+ }
127
+ }
128
+ async sendMessage(topic, message) {
129
+ const payload = typeof message === 'string' ? message : JSON.stringify(message);
130
+ await this.publish(topic, payload);
131
+ }
132
+ async subscribe(topic, groupId, callback, fromBeginning = false) {
133
+ if (!topic || !groupId) {
134
+ throw new Error('Topic and groupId must be provided');
135
+ }
136
+ try {
137
+ const consumer = this.kafka.consumer({ groupId });
138
+ await consumer.connect();
139
+ await consumer.subscribe({ topic, fromBeginning });
140
+ this.logger.log(`Subscribed to topic "${topic}" with group "${groupId}"`);
141
+ await consumer.run({
142
+ eachMessage: async ({ topic, partition, message }) => {
143
+ const value = message.value?.toString();
144
+ if (value) {
145
+ try {
146
+ const parsedMessage = JSON.parse(value);
147
+ await callback(parsedMessage);
148
+ }
149
+ catch (error) {
150
+ this.logger.error(`Error processing message from topic "${topic}":`, error);
151
+ }
152
+ }
153
+ },
154
+ });
155
+ this.consumers.set(`${topic}:${groupId}`, consumer);
156
+ }
157
+ catch (error) {
158
+ this.logger.error(`Error subscribing to topic "${topic}":`, error);
159
+ throw error;
160
+ }
161
+ }
162
+ async subscribeToMultiple(topics, groupId, callback, fromBeginning = false) {
163
+ if (!topics || topics.length === 0 || !groupId) {
164
+ throw new Error('Topics and groupId must be provided');
165
+ }
166
+ try {
167
+ const consumer = this.kafka.consumer({ groupId });
168
+ await consumer.connect();
169
+ for (const topic of topics) {
170
+ await consumer.subscribe({ topic, fromBeginning });
171
+ }
172
+ this.logger.log(`Subscribed to topics [${topics.join(', ')}] with group "${groupId}"`);
173
+ await consumer.run({
174
+ eachMessage: async ({ topic, partition, message }) => {
175
+ const value = message.value?.toString();
176
+ if (value) {
177
+ try {
178
+ const parsedMessage = JSON.parse(value);
179
+ await callback(topic, parsedMessage);
180
+ }
181
+ catch (error) {
182
+ this.logger.error(`Error processing message from topic "${topic}":`, error);
183
+ }
184
+ }
185
+ },
186
+ });
187
+ this.consumers.set(`multi:${groupId}`, consumer);
188
+ }
189
+ catch (error) {
190
+ this.logger.error(`Error subscribing to multiple topics:`, error);
191
+ throw error;
192
+ }
193
+ }
194
+ getAdmin() {
195
+ return this.admin;
196
+ }
197
+ getProducer() {
198
+ return this.producer;
199
+ }
200
+ async topicExists(topic) {
201
+ try {
202
+ const metadata = await this.admin.fetchTopicMetadata({ topics: [topic] });
203
+ return metadata.topics.length > 0 && metadata.topics[0].name === topic;
204
+ }
205
+ catch (error) {
206
+ this.logger.error(`Error checking if topic "${topic}" exists:`, error);
207
+ return false;
208
+ }
209
+ }
210
+ async deleteTopic(topic) {
211
+ try {
212
+ await this.admin.deleteTopics({ topics: [topic] });
213
+ this.logger.log(`Topic "${topic}" deleted successfully`);
214
+ }
215
+ catch (error) {
216
+ this.logger.error(`Error deleting topic "${topic}":`, error);
217
+ throw error;
218
+ }
219
+ }
220
+ async listTopics() {
221
+ try {
222
+ const metadata = await this.admin.fetchTopicMetadata();
223
+ return metadata.topics.map((t) => t.name);
224
+ }
225
+ catch (error) {
226
+ this.logger.error('Error listing topics:', error);
227
+ throw error;
228
+ }
229
+ }
230
+ };
231
+ exports.KafkaService = KafkaService;
232
+ exports.KafkaService = KafkaService = KafkaService_1 = __decorate([
233
+ (0, common_1.Injectable)(),
234
+ __param(0, (0, common_1.Inject)('KAFKA_CONFIG')),
235
+ __metadata("design:paramtypes", [Object])
236
+ ], KafkaService);
237
+ //# sourceMappingURL=kafka.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kafka.service.js","sourceRoot":"","sources":["../../src/kafka/kafka.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export interface RedisConfig {
2
+ host: string;
3
+ port: number;
4
+ password?: string;
5
+ db?: number;
6
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=redis-config.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis-config.interface.js","sourceRoot":"","sources":["../../../src/redis/interfaces/redis-config.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ import { DynamicModule } from '@nestjs/common';
2
+ import { RedisConfig } from './interfaces/redis-config.interface';
3
+ export declare class RedisModule {
4
+ static forRoot(config: RedisConfig): DynamicModule;
5
+ }
@@ -0,0 +1,33 @@
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 RedisModule_1;
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.RedisModule = void 0;
11
+ const common_1 = require("@nestjs/common");
12
+ const redis_service_1 = require("./redis.service");
13
+ let RedisModule = RedisModule_1 = class RedisModule {
14
+ static forRoot(config) {
15
+ return {
16
+ module: RedisModule_1,
17
+ providers: [
18
+ {
19
+ provide: 'REDIS_CONFIG',
20
+ useValue: config,
21
+ },
22
+ redis_service_1.RedisService,
23
+ ],
24
+ exports: [redis_service_1.RedisService],
25
+ };
26
+ }
27
+ };
28
+ exports.RedisModule = RedisModule;
29
+ exports.RedisModule = RedisModule = RedisModule_1 = __decorate([
30
+ (0, common_1.Global)(),
31
+ (0, common_1.Module)({})
32
+ ], RedisModule);
33
+ //# sourceMappingURL=redis.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis.module.js","sourceRoot":"","sources":["../../src/redis/redis.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAA+D;AAC/D,mDAA+C;AAKxC,IAAM,WAAW,mBAAjB,MAAM,WAAW;IACpB,MAAM,CAAC,OAAO,CAAC,MAAmB;QAC9B,OAAO;YACH,MAAM,EAAE,aAAW;YACnB,SAAS,EAAE;gBACP;oBACI,OAAO,EAAE,cAAc;oBACvB,QAAQ,EAAE,MAAM;iBACnB;gBACD,4BAAY;aACf;YACD,OAAO,EAAE,CAAC,4BAAY,CAAC;SAC1B,CAAC;IACN,CAAC;CACJ,CAAA;AAdY,kCAAW;sBAAX,WAAW;IAFvB,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,WAAW,CAcvB"}
@@ -0,0 +1,17 @@
1
+ import { OnModuleDestroy, OnModuleInit } from '@nestjs/common';
2
+ import Redis from 'ioredis';
3
+ import { RedisConfig } from './interfaces/redis-config.interface';
4
+ export declare class RedisService implements OnModuleInit, OnModuleDestroy {
5
+ private readonly config;
6
+ private readonly client;
7
+ constructor(config: RedisConfig);
8
+ onModuleInit(): Promise<void>;
9
+ onModuleDestroy(): Promise<void>;
10
+ getClient(): Redis;
11
+ get<T>(key: string): Promise<T | null>;
12
+ set(key: string, value: any, ttl?: number): Promise<void>;
13
+ del(key: string): Promise<void>;
14
+ exists(key: string): Promise<boolean>;
15
+ expire(key: string, seconds: number): Promise<void>;
16
+ keys(pattern: string): Promise<string[]>;
17
+ }