@estgbue/mezgeb 0.0.2 → 0.0.4

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/dist/index.js ADDED
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./mezgeb/client/client.module"), exports);
18
+ __exportStar(require("./mezgeb.module"), exports);
@@ -0,0 +1,133 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.ClientLoggerInterceptor = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const core_1 = require("@nestjs/core");
18
+ const rxjs_1 = require("rxjs");
19
+ const microservices_1 = require("@nestjs/microservices");
20
+ const typeorm_1 = require("typeorm");
21
+ const crypto_1 = require("crypto");
22
+ const event_audit_decorator_1 = require("./event-audit.decorator");
23
+ const ignore_logger_decorator_1 = require("./ignore-logger.decorator");
24
+ const mezgeb_enum_1 = require("../mezgeb.enum");
25
+ let ClientLoggerInterceptor = class ClientLoggerInterceptor {
26
+ constructor(reflector, connection, rmsRMQClient) {
27
+ this.reflector = reflector;
28
+ this.connection = connection;
29
+ this.rmsRMQClient = rmsRMQClient;
30
+ }
31
+ intercept(context, next) {
32
+ const auditRmqEvent = this.reflector.getAllAndOverride(event_audit_decorator_1.AUDIT_RMQ_EVENT, [context.getHandler(), context.getClass()]);
33
+ const isAuditIgnored = this.reflector.getAllAndOverride(ignore_logger_decorator_1.IGNORE_AUDIT_LOGGER, [context.getHandler(), context.getClass()]);
34
+ if (isAuditIgnored)
35
+ return next.handle();
36
+ if (!auditRmqEvent &&
37
+ context.switchToHttp().getRequest().method == mezgeb_enum_1.EAuditLogRequestMethod.GET)
38
+ return next.handle();
39
+ const ds = this.connection;
40
+ const requestId = (ds.requestId = (0, crypto_1.randomUUID)());
41
+ const startTime = Date.now();
42
+ if (auditRmqEvent)
43
+ this.handleEventAuditInitiation(context, next, requestId);
44
+ else
45
+ this.handleRequestAuditInitiation(context, next, requestId);
46
+ return next.handle().pipe((0, rxjs_1.map)((resp) => {
47
+ const { statusCode } = context.switchToHttp().getResponse();
48
+ this.handleTransaction('Commit', statusCode, requestId, startTime);
49
+ return resp;
50
+ }), (0, rxjs_1.catchError)((error) => {
51
+ var _a;
52
+ const statusCode = (_a = error.status) !== null && _a !== void 0 ? _a : error.code;
53
+ this.handleTransaction('Rollback', statusCode, requestId, startTime, error === null || error === void 0 ? void 0 : error.message);
54
+ throw error;
55
+ }), (0, rxjs_1.finalize)(() => {
56
+ const ds = this.connection;
57
+ ds.user = null;
58
+ ds.requestId = null;
59
+ }));
60
+ }
61
+ handleRequestAuditInitiation(context, next, requestId) {
62
+ var _a, _b;
63
+ const req = context.switchToHttp().getRequest();
64
+ const { ip, ips, method, originalUrl, headers, body, params, user } = req;
65
+ const ds = this.connection;
66
+ const userPayload = (ds.user = {
67
+ id: user === null || user === void 0 ? void 0 : user.id,
68
+ name: `${user === null || user === void 0 ? void 0 : user.firstName} ${user === null || user === void 0 ? void 0 : user.lastName}`,
69
+ organizationId: (_a = user === null || user === void 0 ? void 0 : user.organization) === null || _a === void 0 ? void 0 : _a.id,
70
+ organizationName: (_b = user === null || user === void 0 ? void 0 : user.organization) === null || _b === void 0 ? void 0 : _b.name,
71
+ });
72
+ const log = {
73
+ id: requestId,
74
+ requestMethod: method,
75
+ application: process.env.APPLICATION_NAME,
76
+ module: originalUrl.split('/')[2],
77
+ requestBody: originalUrl.includes('/auth') ? {} : body,
78
+ requestHeader: this.mapHeaders(headers),
79
+ statusCode: 201,
80
+ ipAddress: (ips === null || ips === void 0 ? void 0 : ips.length) ? ips[0] : ip,
81
+ executionTime: 0,
82
+ user: userPayload,
83
+ };
84
+ this.rmsRMQClient.emit(mezgeb_enum_1.RegisterRequestAudit, log);
85
+ }
86
+ handleEventAuditInitiation(context, next, requestId) {
87
+ const eventPayload = context.getArgs()[0];
88
+ const eventPattern = context.getArgs()[1].args[2];
89
+ const ds = this.connection;
90
+ const userPayload = (ds.user = {});
91
+ const log = {
92
+ id: requestId,
93
+ requestMethod: mezgeb_enum_1.EAuditLogRequestMethod.EVENT,
94
+ application: process.env.APPLICATION_NAME,
95
+ module: eventPattern,
96
+ requestBody: eventPayload,
97
+ requestHeader: {},
98
+ statusCode: 201,
99
+ ipAddress: '-',
100
+ executionTime: 0,
101
+ user: userPayload,
102
+ };
103
+ this.rmsRMQClient.emit(mezgeb_enum_1.RegisterRequestAudit, log);
104
+ }
105
+ handleTransaction(type, statusCode, requestId, startTime, remark) {
106
+ const executionTime = Date.now() - startTime;
107
+ const approvePayload = {
108
+ requestId,
109
+ executionTime,
110
+ statusCode,
111
+ remark,
112
+ };
113
+ this.rmsRMQClient.emit(type == 'Commit' ? mezgeb_enum_1.CommitRequestAudit : mezgeb_enum_1.RollbackRequestAudit, approvePayload);
114
+ }
115
+ mapHeaders(headers) {
116
+ return Object.assign(Object.assign({}, headers), { authorization: (headers === null || headers === void 0 ? void 0 : headers.authorization) ? 'Bearer [REDACTED]' : undefined, cookie: (headers === null || headers === void 0 ? void 0 : headers.cookie) ? this.mapCookies(headers.cookie) : undefined });
117
+ }
118
+ mapCookies(cookie) {
119
+ return cookie.split(';').reduce((acc, c) => {
120
+ const [key] = c.split('=').map((part) => part.trim());
121
+ acc.push(key);
122
+ return acc;
123
+ }, []);
124
+ }
125
+ };
126
+ exports.ClientLoggerInterceptor = ClientLoggerInterceptor;
127
+ exports.ClientLoggerInterceptor = ClientLoggerInterceptor = __decorate([
128
+ (0, common_1.Injectable)(),
129
+ __param(2, (0, common_1.Inject)(ClientLoggerInterceptor)),
130
+ __metadata("design:paramtypes", [core_1.Reflector,
131
+ typeorm_1.DataSource,
132
+ microservices_1.ClientProxy])
133
+ ], ClientLoggerInterceptor);
@@ -0,0 +1 @@
1
+ "use strict";
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.auditLoggerConfig = void 0;
4
+ const microservices_1 = require("@nestjs/microservices");
5
+ const mezgeb_enum_1 = require("../mezgeb.enum");
6
+ exports.auditLoggerConfig = {
7
+ name: mezgeb_enum_1.ClientLoggerInterceptor,
8
+ transport: microservices_1.Transport.RMQ,
9
+ options: {
10
+ urls: [process.env.RMQ_URL],
11
+ queue: mezgeb_enum_1.AuditLoggerRMQQueue,
12
+ prefetchCount: 1,
13
+ noAck: false,
14
+ isGlobalPrefetchCount: true,
15
+ socketOptions: {
16
+ frameMax: 16384,
17
+ heartbeat: 60,
18
+ },
19
+ queueOptions: {
20
+ durable: true,
21
+ deadLetterExchange: mezgeb_enum_1.AuditDeadLetterExchange,
22
+ deadLetterRoutingKey: mezgeb_enum_1.DeadAuditRoutingKey,
23
+ },
24
+ },
25
+ };
@@ -0,0 +1,30 @@
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.AuditClientModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const core_1 = require("@nestjs/core");
12
+ const microservices_1 = require("@nestjs/microservices");
13
+ const client_logger_config_1 = require("./client.logger.config");
14
+ const client_audit_interceptor_1 = require("./client-audit.interceptor");
15
+ const client_subscriber_1 = require("./client.subscriber");
16
+ let AuditClientModule = class AuditClientModule {
17
+ };
18
+ exports.AuditClientModule = AuditClientModule;
19
+ exports.AuditClientModule = AuditClientModule = __decorate([
20
+ (0, common_1.Module)({
21
+ imports: [microservices_1.ClientsModule.register([client_logger_config_1.auditLoggerConfig])],
22
+ providers: [
23
+ {
24
+ provide: core_1.APP_INTERCEPTOR,
25
+ useClass: client_audit_interceptor_1.ClientLoggerInterceptor,
26
+ },
27
+ client_subscriber_1.ClientSubscriber,
28
+ ],
29
+ })
30
+ ], AuditClientModule);
@@ -0,0 +1,61 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.ClientSubscriber = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const microservices_1 = require("@nestjs/microservices");
18
+ const typeorm_1 = require("typeorm");
19
+ const mezgeb_enum_1 = require("../mezgeb.enum");
20
+ let ClientSubscriber = class ClientSubscriber {
21
+ constructor(dataSource, rmsRMQClient) {
22
+ this.dataSource = dataSource;
23
+ this.rmsRMQClient = rmsRMQClient;
24
+ dataSource.subscribers.push(this);
25
+ }
26
+ afterInsert(event) {
27
+ const ds = this.dataSource;
28
+ const payload = {
29
+ user: ds.user,
30
+ entityName: event.metadata.tableName,
31
+ entityId: event.entity.id,
32
+ entity: event.entity,
33
+ requestId: ds.requestId,
34
+ query: 'INSERT',
35
+ createdAt: new Date(),
36
+ };
37
+ this.rmsRMQClient.emit(mezgeb_enum_1.RecordInsertion, payload);
38
+ }
39
+ afterQuery(event) {
40
+ if (!event.success ||
41
+ !(event.query.startsWith('DELETE') || event.query.startsWith('UPDATE'))) {
42
+ return;
43
+ }
44
+ const ds = this.dataSource;
45
+ const payload = {
46
+ createdAt: new Date(),
47
+ query: event.query,
48
+ requestId: ds.requestId,
49
+ parameters: event.parameters,
50
+ user: ds.user,
51
+ };
52
+ this.rmsRMQClient.emit(event.query.startsWith('DELETE') ? mezgeb_enum_1.RecordDeletion : mezgeb_enum_1.RecordUpdate, payload);
53
+ }
54
+ };
55
+ exports.ClientSubscriber = ClientSubscriber;
56
+ exports.ClientSubscriber = ClientSubscriber = __decorate([
57
+ (0, typeorm_1.EventSubscriber)(),
58
+ __param(1, (0, common_1.Inject)(mezgeb_enum_1.ClientLoggerInterceptor)),
59
+ __metadata("design:paramtypes", [typeorm_1.DataSource,
60
+ microservices_1.ClientProxy])
61
+ ], ClientSubscriber);
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AuditRmqEvent = exports.AUDIT_RMQ_EVENT = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ exports.AUDIT_RMQ_EVENT = 'AuditRmqEvent';
6
+ const AuditRmqEvent = () => (0, common_1.SetMetadata)(exports.AUDIT_RMQ_EVENT, true);
7
+ exports.AuditRmqEvent = AuditRmqEvent;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.IgnoreLoggerAudit = exports.IGNORE_AUDIT_LOGGER = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ exports.IGNORE_AUDIT_LOGGER = 'ignoreAuditLogger';
6
+ const IgnoreLoggerAudit = () => (0, common_1.SetMetadata)(exports.IGNORE_AUDIT_LOGGER, true);
7
+ exports.IgnoreLoggerAudit = IgnoreLoggerAudit;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ApproveTransactionPayload = exports.EmitQueryDTO = exports.CreateEventDTO = exports.UpdateEventDTO = exports.CreateAuditLogDto = void 0;
4
+ class CreateAuditLogDto {
5
+ }
6
+ exports.CreateAuditLogDto = CreateAuditLogDto;
7
+ class UpdateEventDTO {
8
+ }
9
+ exports.UpdateEventDTO = UpdateEventDTO;
10
+ class CreateEventDTO {
11
+ }
12
+ exports.CreateEventDTO = CreateEventDTO;
13
+ class EmitQueryDTO {
14
+ }
15
+ exports.EmitQueryDTO = EmitQueryDTO;
16
+ class ApproveTransactionPayload {
17
+ }
18
+ exports.ApproveTransactionPayload = ApproveTransactionPayload;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RecordDeletion = exports.RecordUpdate = exports.RecordInsertion = exports.RollbackRequestAudit = exports.CommitRequestAudit = exports.RegisterRequestAudit = exports.DeadAuditRoutingKey = exports.AuditDeadLetterExchange = exports.AuditLoggerRMQTopic = exports.AuditLoggerRMQQueue = exports.ClientLoggerInterceptor = exports.EAuditLogRequestMethod = void 0;
4
+ var EAuditLogRequestMethod;
5
+ (function (EAuditLogRequestMethod) {
6
+ EAuditLogRequestMethod["GET"] = "GET";
7
+ EAuditLogRequestMethod["POST"] = "POST";
8
+ EAuditLogRequestMethod["PUT"] = "PUT";
9
+ EAuditLogRequestMethod["DELETE"] = "DELETE";
10
+ EAuditLogRequestMethod["PATCH"] = "PATCH";
11
+ EAuditLogRequestMethod["EVENT"] = "EVENT";
12
+ })(EAuditLogRequestMethod || (exports.EAuditLogRequestMethod = EAuditLogRequestMethod = {}));
13
+ exports.ClientLoggerInterceptor = 'AUDIT_LOGGER_RMQ_CLIENT';
14
+ exports.AuditLoggerRMQQueue = 'audit';
15
+ exports.AuditLoggerRMQTopic = 'audit-log-topic';
16
+ exports.AuditDeadLetterExchange = 'dead_letter_exchange';
17
+ exports.DeadAuditRoutingKey = 'audit.dead';
18
+ exports.RegisterRequestAudit = 'register-request-audit';
19
+ exports.CommitRequestAudit = 'commit-request-audit';
20
+ exports.RollbackRequestAudit = 'rollback-request-audit';
21
+ exports.RecordInsertion = 'record-insertion';
22
+ exports.RecordUpdate = 'record-update';
23
+ exports.RecordDeletion = 'record-delete';
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -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.MezgebModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const client_module_1 = require("./mezgeb/client/client.module");
12
+ let MezgebModule = class MezgebModule {
13
+ };
14
+ exports.MezgebModule = MezgebModule;
15
+ exports.MezgebModule = MezgebModule = __decorate([
16
+ (0, common_1.Module)({
17
+ imports: [
18
+ client_module_1.AuditClientModule
19
+ ],
20
+ providers: [],
21
+ exports: [],
22
+ })
23
+ ], MezgebModule);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@estgbue/mezgeb",
3
- "version": "0.0.2",
3
+ "version": "0.0.4",
4
4
  "main": "./src/index",
5
5
  "exports": {
6
6
  ".": "./dist/index.js"
@@ -10,9 +10,9 @@
10
10
  "dist"
11
11
  ],
12
12
  "dependencies": {
13
- "@nestjs/common": "^11.1.10",
14
- "@nestjs/core": "^11.1.10",
15
- "@nestjs/microservices": "^11.1.10",
13
+ "@nestjs/common": "^11.0.20",
14
+ "@nestjs/core": "^11.0.20",
15
+ "@nestjs/microservices": "^11.1.0",
16
16
  "@nestjs/typeorm": "^11.0.0",
17
17
  "crypto": "^1.0.1",
18
18
  "rxjs": "^7.8.2",