@edirect/rate-limit-module 0.1.2

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 (96) hide show
  1. package/README.md +102 -0
  2. package/dist/src/decorators/rate-limiting-rule.decorator.d.ts +8 -0
  3. package/dist/src/decorators/rate-limiting-rule.decorator.js +8 -0
  4. package/dist/src/decorators/rate-limiting-rule.decorator.js.map +1 -0
  5. package/dist/src/guards/rate-limiting.guard.d.ts +11 -0
  6. package/dist/src/guards/rate-limiting.guard.js +105 -0
  7. package/dist/src/guards/rate-limiting.guard.js.map +1 -0
  8. package/dist/src/index.d.ts +8 -0
  9. package/dist/src/index.js +26 -0
  10. package/dist/src/index.js.map +1 -0
  11. package/dist/src/main.d.ts +1 -0
  12. package/dist/src/main.js +10 -0
  13. package/dist/src/main.js.map +1 -0
  14. package/dist/src/object.utils.d.ts +2 -0
  15. package/dist/src/object.utils.js +37 -0
  16. package/dist/src/object.utils.js.map +1 -0
  17. package/dist/src/rate-limiting.module.d.ts +2 -0
  18. package/dist/src/rate-limiting.module.js +39 -0
  19. package/dist/src/rate-limiting.module.js.map +1 -0
  20. package/dist/src/rules/dto/pagination.dto.d.ts +5 -0
  21. package/dist/src/rules/dto/pagination.dto.js +51 -0
  22. package/dist/src/rules/dto/pagination.dto.js.map +1 -0
  23. package/dist/src/rules/dto/rule.dto.d.ts +21 -0
  24. package/dist/src/rules/dto/rule.dto.js +185 -0
  25. package/dist/src/rules/dto/rule.dto.js.map +1 -0
  26. package/dist/src/rules/interface/pagination.interface.d.ts +6 -0
  27. package/dist/src/rules/interface/pagination.interface.js +3 -0
  28. package/dist/src/rules/interface/pagination.interface.js.map +1 -0
  29. package/dist/src/rules/interface/rule.interface.d.ts +26 -0
  30. package/dist/src/rules/interface/rule.interface.js +3 -0
  31. package/dist/src/rules/interface/rule.interface.js.map +1 -0
  32. package/dist/src/rules/rule.controller.d.ts +13 -0
  33. package/dist/src/rules/rule.controller.js +99 -0
  34. package/dist/src/rules/rule.controller.js.map +1 -0
  35. package/dist/src/rules/rule.module.d.ts +4 -0
  36. package/dist/src/rules/rule.module.js +44 -0
  37. package/dist/src/rules/rule.module.js.map +1 -0
  38. package/dist/src/rules/rule.repository.d.ts +14 -0
  39. package/dist/src/rules/rule.repository.js +90 -0
  40. package/dist/src/rules/rule.repository.js.map +1 -0
  41. package/dist/src/rules/rule.schema.d.ts +28 -0
  42. package/dist/src/rules/rule.schema.js +149 -0
  43. package/dist/src/rules/rule.schema.js.map +1 -0
  44. package/dist/src/rules/rule.service.d.ts +24 -0
  45. package/dist/src/rules/rule.service.js +205 -0
  46. package/dist/src/rules/rule.service.js.map +1 -0
  47. package/dist/src/shared/cache/cache.service.d.ts +9 -0
  48. package/dist/src/shared/cache/cache.service.js +38 -0
  49. package/dist/src/shared/cache/cache.service.js.map +1 -0
  50. package/dist/src/shared/redis/redis.module.d.ts +2 -0
  51. package/dist/src/shared/redis/redis.module.js +38 -0
  52. package/dist/src/shared/redis/redis.module.js.map +1 -0
  53. package/dist/src/shared/redis/redis.service.d.ts +12 -0
  54. package/dist/src/shared/redis/redis.service.js +65 -0
  55. package/dist/src/shared/redis/redis.service.js.map +1 -0
  56. package/dist/src/shared/rule-engine/interface/rule-engine.interface.d.ts +11 -0
  57. package/dist/src/shared/rule-engine/interface/rule-engine.interface.js +3 -0
  58. package/dist/src/shared/rule-engine/interface/rule-engine.interface.js.map +1 -0
  59. package/dist/src/shared/rule-engine/rule-engine.module.d.ts +9 -0
  60. package/dist/src/shared/rule-engine/rule-engine.module.js +70 -0
  61. package/dist/src/shared/rule-engine/rule-engine.module.js.map +1 -0
  62. package/dist/src/shared/rule-engine/rule-engine.service.d.ts +13 -0
  63. package/dist/src/shared/rule-engine/rule-engine.service.js +87 -0
  64. package/dist/src/shared/rule-engine/rule-engine.service.js.map +1 -0
  65. package/dist/src/shared/shared.module.d.ts +2 -0
  66. package/dist/src/shared/shared.module.js +35 -0
  67. package/dist/src/shared/shared.module.js.map +1 -0
  68. package/dist/src/validators/rule.constraint.d.ts +9 -0
  69. package/dist/src/validators/rule.constraint.js +52 -0
  70. package/dist/src/validators/rule.constraint.js.map +1 -0
  71. package/dist/src/validators/rule.validator.d.ts +2 -0
  72. package/dist/src/validators/rule.validator.js +17 -0
  73. package/dist/src/validators/rule.validator.js.map +1 -0
  74. package/dist/test/guards/rate-limiting.guard.spec.d.ts +1 -0
  75. package/dist/test/guards/rate-limiting.guard.spec.js +93 -0
  76. package/dist/test/guards/rate-limiting.guard.spec.js.map +1 -0
  77. package/dist/test/mocks/rate-limiting-module.mocks.d.ts +2 -0
  78. package/dist/test/mocks/rate-limiting-module.mocks.js +60 -0
  79. package/dist/test/mocks/rate-limiting-module.mocks.js.map +1 -0
  80. package/dist/test/mocks/rule-engine.mocks.d.ts +7 -0
  81. package/dist/test/mocks/rule-engine.mocks.js +11 -0
  82. package/dist/test/mocks/rule-engine.mocks.js.map +1 -0
  83. package/dist/test/mocks/rule.mocks.d.ts +34 -0
  84. package/dist/test/mocks/rule.mocks.js +79 -0
  85. package/dist/test/mocks/rule.mocks.js.map +1 -0
  86. package/dist/test/mocks/shared-module.mocks.d.ts +10 -0
  87. package/dist/test/mocks/shared-module.mocks.js +32 -0
  88. package/dist/test/mocks/shared-module.mocks.js.map +1 -0
  89. package/dist/test/mocks/shared.mocks.d.ts +19 -0
  90. package/dist/test/mocks/shared.mocks.js +29 -0
  91. package/dist/test/mocks/shared.mocks.js.map +1 -0
  92. package/dist/test/rules/rules.service.spec.d.ts +1 -0
  93. package/dist/test/rules/rules.service.spec.js +115 -0
  94. package/dist/test/rules/rules.service.spec.js.map +1 -0
  95. package/dist/tsconfig.tsbuildinfo +1 -0
  96. package/package.json +46 -0
@@ -0,0 +1,149 @@
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.RateLimitingRuleSchema = exports.RateLimitingRule = void 0;
13
+ const mongoose_1 = require("@nestjs/mongoose");
14
+ const uuid_1 = require("uuid");
15
+ let RateLimitingRule = class RateLimitingRule {
16
+ ruleId;
17
+ name;
18
+ targetAction;
19
+ expression;
20
+ enabled;
21
+ errorMessage;
22
+ partner;
23
+ provider;
24
+ productType;
25
+ variables;
26
+ variablesRequired;
27
+ deletedAt;
28
+ createdAt;
29
+ updatedAt;
30
+ };
31
+ exports.RateLimitingRule = RateLimitingRule;
32
+ __decorate([
33
+ (0, mongoose_1.Prop)({
34
+ required: true,
35
+ unique: true,
36
+ default: uuid_1.v4,
37
+ type: String
38
+ }),
39
+ __metadata("design:type", String)
40
+ ], RateLimitingRule.prototype, "ruleId", void 0);
41
+ __decorate([
42
+ (0, mongoose_1.Prop)({
43
+ required: true,
44
+ type: String,
45
+ }),
46
+ __metadata("design:type", String)
47
+ ], RateLimitingRule.prototype, "name", void 0);
48
+ __decorate([
49
+ (0, mongoose_1.Prop)({
50
+ required: true,
51
+ type: String
52
+ }),
53
+ __metadata("design:type", String)
54
+ ], RateLimitingRule.prototype, "targetAction", void 0);
55
+ __decorate([
56
+ (0, mongoose_1.Prop)({
57
+ required: true,
58
+ type: String
59
+ }),
60
+ __metadata("design:type", String)
61
+ ], RateLimitingRule.prototype, "expression", void 0);
62
+ __decorate([
63
+ (0, mongoose_1.Prop)({
64
+ required: true,
65
+ default: true,
66
+ type: Boolean,
67
+ }),
68
+ __metadata("design:type", Boolean)
69
+ ], RateLimitingRule.prototype, "enabled", void 0);
70
+ __decorate([
71
+ (0, mongoose_1.Prop)({
72
+ required: false,
73
+ type: String
74
+ }),
75
+ __metadata("design:type", String)
76
+ ], RateLimitingRule.prototype, "errorMessage", void 0);
77
+ __decorate([
78
+ (0, mongoose_1.Prop)({
79
+ required: true,
80
+ type: String
81
+ }),
82
+ __metadata("design:type", String)
83
+ ], RateLimitingRule.prototype, "partner", void 0);
84
+ __decorate([
85
+ (0, mongoose_1.Prop)({
86
+ required: false,
87
+ type: String
88
+ }),
89
+ __metadata("design:type", String)
90
+ ], RateLimitingRule.prototype, "provider", void 0);
91
+ __decorate([
92
+ (0, mongoose_1.Prop)({
93
+ required: false,
94
+ type: String
95
+ }),
96
+ __metadata("design:type", String)
97
+ ], RateLimitingRule.prototype, "productType", void 0);
98
+ __decorate([
99
+ (0, mongoose_1.Prop)({
100
+ required: false,
101
+ type: Object
102
+ }),
103
+ __metadata("design:type", Object)
104
+ ], RateLimitingRule.prototype, "variables", void 0);
105
+ __decorate([
106
+ (0, mongoose_1.Prop)({
107
+ required: false,
108
+ type: Boolean
109
+ }),
110
+ __metadata("design:type", Boolean)
111
+ ], RateLimitingRule.prototype, "variablesRequired", void 0);
112
+ __decorate([
113
+ (0, mongoose_1.Prop)({
114
+ required: false,
115
+ type: Date
116
+ }),
117
+ __metadata("design:type", Date)
118
+ ], RateLimitingRule.prototype, "deletedAt", void 0);
119
+ __decorate([
120
+ (0, mongoose_1.Prop)({
121
+ required: false,
122
+ type: Date
123
+ }),
124
+ __metadata("design:type", Date)
125
+ ], RateLimitingRule.prototype, "createdAt", void 0);
126
+ __decorate([
127
+ (0, mongoose_1.Prop)({
128
+ required: false,
129
+ type: Date
130
+ }),
131
+ __metadata("design:type", Date)
132
+ ], RateLimitingRule.prototype, "updatedAt", void 0);
133
+ exports.RateLimitingRule = RateLimitingRule = __decorate([
134
+ (0, mongoose_1.Schema)({ timestamps: true })
135
+ ], RateLimitingRule);
136
+ exports.RateLimitingRuleSchema = mongoose_1.SchemaFactory.createForClass(RateLimitingRule);
137
+ exports.RateLimitingRuleSchema.index({
138
+ partner: 1,
139
+ provider: 1,
140
+ productType: 1
141
+ });
142
+ exports.RateLimitingRuleSchema.index({
143
+ partner: 1,
144
+ provider: 1,
145
+ });
146
+ exports.RateLimitingRuleSchema.index({
147
+ partner: 1,
148
+ });
149
+ //# sourceMappingURL=rule.schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule.schema.js","sourceRoot":"","sources":["../../../src/rules/rule.schema.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,+CAA+D;AAE/D,+BAAoC;AAM7B,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IAO3B,MAAM,CAAS;IAMf,IAAI,CAAS;IAMb,YAAY,CAAU;IAMtB,UAAU,CAAS;IAOnB,OAAO,CAAU;IAMjB,YAAY,CAAU;IAMtB,OAAO,CAAS;IAMhB,QAAQ,CAAU;IAMlB,WAAW,CAAU;IAMrB,SAAS,CAA0B;IAMnC,iBAAiB,CAAW;IAM5B,SAAS,CAAQ;IAMjB,SAAS,CAAQ;IAMjB,SAAS,CAAQ;CAClB,CAAA;AAvFY,4CAAgB;AAO3B;IANC,IAAA,eAAI,EAAC;QACJ,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,SAAM;QACf,IAAI,EAAE,MAAM;KACb,CAAC;;gDACa;AAMf;IAJC,IAAA,eAAI,EAAC;QACJ,QAAQ,EAAE,IAAI;QACd,IAAI,EAAE,MAAM;KACb,CAAC;;8CACW;AAMb;IAJC,IAAA,eAAI,EAAC;QACJ,QAAQ,EAAE,IAAI;QACd,IAAI,EAAE,MAAM;KACb,CAAC;;sDACoB;AAMtB;IAJC,IAAA,eAAI,EAAC;QACJ,QAAQ,EAAE,IAAI;QACd,IAAI,EAAE,MAAM;KACb,CAAC;;oDACiB;AAOnB;IALC,IAAA,eAAI,EAAC;QACJ,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,OAAO;KACd,CAAC;;iDACe;AAMjB;IAJC,IAAA,eAAI,EAAC;QACJ,QAAQ,EAAE,KAAK;QACf,IAAI,EAAE,MAAM;KACb,CAAC;;sDACoB;AAMtB;IAJC,IAAA,eAAI,EAAC;QACJ,QAAQ,EAAE,IAAI;QACd,IAAI,EAAE,MAAM;KACb,CAAC;;iDACc;AAMhB;IAJC,IAAA,eAAI,EAAC;QACJ,QAAQ,EAAE,KAAK;QACf,IAAI,EAAE,MAAM;KACb,CAAC;;kDACgB;AAMlB;IAJC,IAAA,eAAI,EAAC;QACJ,QAAQ,EAAE,KAAK;QACf,IAAI,EAAE,MAAM;KACb,CAAC;;qDACmB;AAMrB;IAJC,IAAA,eAAI,EAAC;QACJ,QAAQ,EAAE,KAAK;QACf,IAAI,EAAE,MAAM;KACb,CAAC;;mDACiC;AAMnC;IAJC,IAAA,eAAI,EAAC;QACJ,QAAQ,EAAE,KAAK;QACf,IAAI,EAAE,OAAO;KACd,CAAC;;2DAC0B;AAM5B;IAJC,IAAA,eAAI,EAAC;QACJ,QAAQ,EAAE,KAAK;QACf,IAAI,EAAE,IAAI;KACX,CAAC;8BACU,IAAI;mDAAC;AAMjB;IAJC,IAAA,eAAI,EAAC;QACJ,QAAQ,EAAE,KAAK;QACf,IAAI,EAAE,IAAI;KACX,CAAC;8BACU,IAAI;mDAAC;AAMjB;IAJC,IAAA,eAAI,EAAC;QACJ,QAAQ,EAAE,KAAK;QACf,IAAI,EAAE,IAAI;KACX,CAAC;8BACU,IAAI;mDAAC;2BAtFN,gBAAgB;IAD5B,IAAA,iBAAM,EAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;GAChB,gBAAgB,CAuF5B;AAEY,QAAA,sBAAsB,GAAG,wBAAa,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;AAErF,8BAAsB,CAAC,KAAK,CAAC;IAC3B,OAAO,EAAE,CAAC;IACV,QAAQ,EAAE,CAAC;IACX,WAAW,EAAE,CAAC;CACf,CAAC,CAAC;AAEH,8BAAsB,CAAC,KAAK,CAAC;IAC3B,OAAO,EAAE,CAAC;IACV,QAAQ,EAAE,CAAC;CACZ,CAAC,CAAC;AAEH,8BAAsB,CAAC,KAAK,CAAC;IAC3B,OAAO,EAAE,CAAC;CACX,CAAC,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { LoggerService } from '@edirect/logger';
2
+ import { CacheService } from '../shared/cache/cache.service';
3
+ import { CreateRuleDTO } from './dto/rule.dto';
4
+ import { IPagination } from './interface/pagination.interface';
5
+ import { IFindRule, IRule } from './interface/rule.interface';
6
+ import { RuleRepository } from './rule.repository';
7
+ export declare class RuleService {
8
+ private readonly logger;
9
+ private readonly repository;
10
+ private readonly cacheService;
11
+ private readonly MAX_EXPRESSION_LENGTH;
12
+ private readonly MAX_EXPRESSION_DEPTH;
13
+ private readonly FORBIDDEN_PATTERNS;
14
+ constructor(logger: LoggerService, repository: RuleRepository, cacheService: CacheService);
15
+ create(input: CreateRuleDTO): Promise<IRule>;
16
+ findAll(queryParameters: IFindRule): Promise<IPagination<IRule[]>>;
17
+ findAllWithoutPagination(queryParameters: IFindRule): Promise<IRule[]>;
18
+ findById(id: string): Promise<IRule>;
19
+ updateOne(id: string, fieldsToUpdate: Partial<IRule>): Promise<IRule | null>;
20
+ delete(id: string): Promise<void>;
21
+ validateRuleExpression(expression: string): string | null;
22
+ private getFromCache;
23
+ private generateRateLimitingCountCacheKey;
24
+ }
@@ -0,0 +1,205 @@
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.RuleService = void 0;
13
+ const logger_1 = require("@edirect/logger");
14
+ const common_1 = require("@nestjs/common");
15
+ const object_utils_1 = require("../object.utils");
16
+ const cache_service_1 = require("../shared/cache/cache.service");
17
+ const rule_repository_1 = require("./rule.repository");
18
+ let RuleService = class RuleService {
19
+ logger;
20
+ repository;
21
+ cacheService;
22
+ MAX_EXPRESSION_LENGTH = 500;
23
+ MAX_EXPRESSION_DEPTH = 8;
24
+ FORBIDDEN_PATTERNS = [
25
+ /constructor/i,
26
+ /__proto__/i,
27
+ /prototype/i,
28
+ /process/i,
29
+ /global/i,
30
+ /require/i,
31
+ /import/i,
32
+ /eval/i,
33
+ /Function/i,
34
+ /setTimeout/i,
35
+ /setInterval/i,
36
+ /api/i,
37
+ /request/i,
38
+ /\[".*"\s*\+\s*".*"\]/,
39
+ ];
40
+ constructor(logger, repository, cacheService) {
41
+ this.logger = logger;
42
+ this.repository = repository;
43
+ this.cacheService = cacheService;
44
+ }
45
+ async create(input) {
46
+ try {
47
+ if (!input)
48
+ throw new common_1.BadRequestException('[ERROR] payload invalid!');
49
+ const cacheKey = this.generateRateLimitingCountCacheKey({
50
+ partner: input?.partner,
51
+ provider: input?.provider,
52
+ productType: input?.productType,
53
+ });
54
+ if (cacheKey || cacheKey === '') {
55
+ const isDeleted = await this.cacheService.delete([cacheKey]);
56
+ if (!isDeleted) {
57
+ await this.cacheService.deleteByPattern('rate-limit-config');
58
+ }
59
+ }
60
+ return this.repository.save(input);
61
+ }
62
+ catch (error) {
63
+ this.logger.error(`[ERROR] error to create rate limiting `, error);
64
+ throw error;
65
+ }
66
+ }
67
+ async findAll(queryParameters) {
68
+ try {
69
+ return this.repository.findAll(queryParameters);
70
+ }
71
+ catch (error) {
72
+ this.logger.error('[ERROR] error to find rate limiting', error);
73
+ throw new common_1.InternalServerErrorException();
74
+ }
75
+ }
76
+ async findAllWithoutPagination(queryParameters) {
77
+ try {
78
+ const cachedData = await this.getFromCache(queryParameters);
79
+ if (cachedData && cachedData.length)
80
+ return cachedData;
81
+ const { data } = await this.repository.findAll(queryParameters);
82
+ const cacheKey = this.generateRateLimitingCountCacheKey({
83
+ partner: queryParameters?.partner,
84
+ provider: queryParameters?.provider,
85
+ productType: queryParameters?.productType
86
+ });
87
+ if (data && data.length) {
88
+ await this.cacheService.set(cacheKey, JSON.stringify(data), 3600);
89
+ }
90
+ return data;
91
+ }
92
+ catch (error) {
93
+ this.logger.error('[ERROR] error to find rate limiting', error);
94
+ throw new common_1.InternalServerErrorException();
95
+ }
96
+ }
97
+ async findById(id) {
98
+ try {
99
+ const rate = await this.repository.findOneByRateId(id);
100
+ if (!rate)
101
+ throw new common_1.NotFoundException('Rate Limiting rule');
102
+ return rate;
103
+ }
104
+ catch (error) {
105
+ this.logger.error('[ERROR] error to find quote by ID', error);
106
+ throw error;
107
+ }
108
+ }
109
+ async updateOne(id, fieldsToUpdate) {
110
+ try {
111
+ if (!id)
112
+ throw new common_1.NotFoundException('Rate Limiting rule');
113
+ const current = await this.repository.findOneByRateId(id);
114
+ if (!current)
115
+ throw new common_1.NotFoundException('Rate Limiting rule');
116
+ if (current.deletedAt) {
117
+ throw new common_1.GoneException(`Already Deleted at ${current.deletedAt}`);
118
+ }
119
+ const cacheKey = this.generateRateLimitingCountCacheKey({
120
+ partner: current?.partner,
121
+ provider: current?.provider,
122
+ productType: current?.productType,
123
+ });
124
+ if (cacheKey || cacheKey === '') {
125
+ const isDeleted = await this.cacheService.delete([cacheKey]);
126
+ if (!isDeleted) {
127
+ await this.cacheService.deleteByPattern('rate-limit-config');
128
+ }
129
+ }
130
+ return this.repository.update(id, fieldsToUpdate);
131
+ }
132
+ catch (error) {
133
+ this.logger.error(`[ERROR] error to update ${id}`, error);
134
+ throw error;
135
+ }
136
+ }
137
+ async delete(id) {
138
+ try {
139
+ if (!id)
140
+ throw new common_1.NotFoundException('Rate limiting rule');
141
+ const rule = await this.repository.findOneByRateId(id);
142
+ if (rule?.deletedAt) {
143
+ throw new common_1.GoneException(`Already Deleted at ${rule.deletedAt}`);
144
+ }
145
+ await this.repository.update(id, {
146
+ deletedAt: new Date(),
147
+ });
148
+ }
149
+ catch (error) {
150
+ this.logger.error(`[ERROR] Error to delete rule`, error);
151
+ throw error;
152
+ }
153
+ }
154
+ validateRuleExpression(expression) {
155
+ if (expression.length > this.MAX_EXPRESSION_LENGTH) {
156
+ return `Expression too long: ${expression.length} chars`;
157
+ }
158
+ for (const pattern of this.FORBIDDEN_PATTERNS) {
159
+ if (pattern.test(expression)) {
160
+ return `Expression contains forbidden pattern: ${pattern}`;
161
+ }
162
+ }
163
+ if ((0, object_utils_1.calculateDepth)(expression) > this.MAX_EXPRESSION_DEPTH) {
164
+ return `Expression too complex`;
165
+ }
166
+ return null;
167
+ }
168
+ async getFromCache(queryParameters) {
169
+ const cacheKey = this.generateRateLimitingCountCacheKey({
170
+ partner: queryParameters?.partner,
171
+ provider: queryParameters?.provider,
172
+ productType: queryParameters?.productType
173
+ });
174
+ const cachedData = await this.cacheService.get(cacheKey);
175
+ if (cachedData && cachedData.length) {
176
+ this.logger.info(`[INFO] Cache hit for: ${cachedData}`);
177
+ return cachedData;
178
+ }
179
+ return [];
180
+ }
181
+ generateRateLimitingCountCacheKey(params) {
182
+ if (!params.partner && !params.provider)
183
+ return '';
184
+ const parameters = {
185
+ ...params,
186
+ enabled: 'true',
187
+ };
188
+ const orderedParams = Object.keys(parameters)
189
+ .sort()
190
+ .reduce((obj, key) => {
191
+ obj[key] = params[key];
192
+ return obj;
193
+ }, {});
194
+ return `rate-limit-config:${JSON.stringify(orderedParams)}`;
195
+ }
196
+ ;
197
+ };
198
+ exports.RuleService = RuleService;
199
+ exports.RuleService = RuleService = __decorate([
200
+ (0, common_1.Injectable)(),
201
+ __metadata("design:paramtypes", [logger_1.LoggerService,
202
+ rule_repository_1.RuleRepository,
203
+ cache_service_1.CacheService])
204
+ ], RuleService);
205
+ //# sourceMappingURL=rule.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule.service.js","sourceRoot":"","sources":["../../../src/rules/rule.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { RedisService } from '../redis/redis.service';
2
+ export declare class CacheService {
3
+ private readonly redis;
4
+ constructor(redis: RedisService);
5
+ get<T>(key: string): Promise<T | null>;
6
+ set(key: string, value: any, ttl?: number): Promise<void>;
7
+ delete(keys: string[]): Promise<number>;
8
+ deleteByPattern(pattern: string): Promise<number>;
9
+ }
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __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.CacheService = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const redis_service_1 = require("../redis/redis.service");
15
+ let CacheService = class CacheService {
16
+ redis;
17
+ constructor(redis) {
18
+ this.redis = redis;
19
+ }
20
+ async get(key) {
21
+ return this.redis.get(key);
22
+ }
23
+ set(key, value, ttl) {
24
+ return this.redis.set(key, JSON.stringify(value), ttl);
25
+ }
26
+ delete(keys) {
27
+ return this.redis.delKeys(keys);
28
+ }
29
+ deleteByPattern(pattern) {
30
+ return this.redis.deleteByPattern(pattern);
31
+ }
32
+ };
33
+ exports.CacheService = CacheService;
34
+ exports.CacheService = CacheService = __decorate([
35
+ (0, common_1.Injectable)(),
36
+ __metadata("design:paramtypes", [redis_service_1.RedisService])
37
+ ], CacheService);
38
+ //# sourceMappingURL=cache.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.service.js","sourceRoot":"","sources":["../../../../src/shared/cache/cache.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,0DAAsD;AAG/C,IAAM,YAAY,GAAlB,MAAM,YAAY;IACM;IAA7B,YAA6B,KAAmB;QAAnB,UAAK,GAAL,KAAK,CAAc;IAAG,CAAC;IAEpD,KAAK,CAAC,GAAG,CAAI,GAAW;QACtB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAI,GAAG,CAAC,CAAC;IAChC,CAAC;IAED,GAAG,CAAC,GAAW,EAAE,KAAU,EAAE,GAAY;QACvC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,CAAC,IAAc;QACnB,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,eAAe,CAAC,OAAe;QAC7B,OAAO,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;CACF,CAAA;AAlBY,oCAAY;uBAAZ,YAAY;IADxB,IAAA,mBAAU,GAAE;qCAEyB,4BAAY;GADrC,YAAY,CAkBxB"}
@@ -0,0 +1,2 @@
1
+ export declare class RedisModule {
2
+ }
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.RedisModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const config_1 = require("@nestjs/config");
12
+ const ioredis_1 = require("ioredis");
13
+ const redis_service_1 = require("./redis.service");
14
+ let RedisModule = class RedisModule {
15
+ };
16
+ exports.RedisModule = RedisModule;
17
+ exports.RedisModule = RedisModule = __decorate([
18
+ (0, common_1.Global)(),
19
+ (0, common_1.Module)({
20
+ imports: [config_1.ConfigModule],
21
+ providers: [
22
+ {
23
+ provide: 'REDIS_CLIENT',
24
+ useFactory: (config) => {
25
+ return new ioredis_1.default({
26
+ host: config.get('REDIS_HOST'),
27
+ port: config.get('REDIS_PORT'),
28
+ password: config.get('REDIS_PASSWORD')
29
+ });
30
+ },
31
+ inject: [config_1.ConfigService],
32
+ },
33
+ redis_service_1.RedisService,
34
+ ],
35
+ exports: ['REDIS_CLIENT', redis_service_1.RedisService],
36
+ })
37
+ ], RedisModule);
38
+ //# sourceMappingURL=redis.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis.module.js","sourceRoot":"","sources":["../../../../src/shared/redis/redis.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAgD;AAChD,2CAA6D;AAC7D,qCAA4B;AAC5B,mDAA+C;AAsBxC,IAAM,WAAW,GAAjB,MAAM,WAAW;CAAG,CAAA;AAAd,kCAAW;sBAAX,WAAW;IApBvB,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,qBAAY,CAAC;QACvB,SAAS,EAAE;YACT;gBACE,OAAO,EAAE,cAAc;gBACvB,UAAU,EAAE,CAAC,MAAqB,EAAE,EAAE;oBACpC,OAAO,IAAI,iBAAK,CAAC;wBACf,IAAI,EAAE,MAAM,CAAC,GAAG,CAAS,YAAY,CAAC;wBACtC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAS,YAAY,CAAC;wBACtC,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAS,gBAAgB,CAAC;qBAC/C,CAAC,CAAC;gBACL,CAAC;gBACD,MAAM,EAAE,CAAC,sBAAa,CAAC;aACxB;YACD,4BAAY;SACb;QACD,OAAO,EAAE,CAAC,cAAc,EAAE,4BAAY,CAAC;KACxC,CAAC;GAEW,WAAW,CAAG"}
@@ -0,0 +1,12 @@
1
+ import { OnModuleDestroy } from '@nestjs/common';
2
+ import Redis from 'ioredis';
3
+ export declare class RedisService implements OnModuleDestroy {
4
+ private readonly client;
5
+ constructor(client: Redis);
6
+ get<T>(key: string): Promise<T | null>;
7
+ set(key: string, value: any, ttlSeconds?: number): Promise<void>;
8
+ delKeys(keys: string[]): Promise<number>;
9
+ scan(pattern: string, count?: number): Promise<string[]>;
10
+ deleteByPattern(pattern: string): Promise<number>;
11
+ onModuleDestroy(): void;
12
+ }
@@ -0,0 +1,65 @@
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.RedisService = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const ioredis_1 = require("ioredis");
18
+ let RedisService = class RedisService {
19
+ client;
20
+ constructor(client) {
21
+ this.client = client;
22
+ }
23
+ async get(key) {
24
+ const raw = await this.client.get(key);
25
+ return raw ? JSON.parse(raw) : null;
26
+ }
27
+ async set(key, value, ttlSeconds) {
28
+ const str = JSON.stringify(value);
29
+ if (ttlSeconds) {
30
+ await this.client.set(key, JSON.stringify(str), 'EX', ttlSeconds);
31
+ }
32
+ else {
33
+ await this.client.set(key, JSON.stringify(str));
34
+ }
35
+ }
36
+ async delKeys(keys) {
37
+ if (keys.length === 0)
38
+ return 0;
39
+ return this.client.del(...keys);
40
+ }
41
+ async scan(pattern, count = 100) {
42
+ let cursor = '0';
43
+ const found = [];
44
+ do {
45
+ const [nextCursor, keys] = await this.client.scan(cursor, 'MATCH', pattern, 'COUNT', count);
46
+ cursor = nextCursor;
47
+ found.push(...keys);
48
+ } while (cursor !== '0');
49
+ return found;
50
+ }
51
+ async deleteByPattern(pattern) {
52
+ const keys = await this.scan(pattern);
53
+ return this.delKeys(keys);
54
+ }
55
+ onModuleDestroy() {
56
+ this.client.quit();
57
+ }
58
+ };
59
+ exports.RedisService = RedisService;
60
+ exports.RedisService = RedisService = __decorate([
61
+ (0, common_1.Injectable)(),
62
+ __param(0, (0, common_1.Inject)('REDIS_CLIENT')),
63
+ __metadata("design:paramtypes", [ioredis_1.default])
64
+ ], RedisService);
65
+ //# sourceMappingURL=redis.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis.service.js","sourceRoot":"","sources":["../../../../src/shared/redis/redis.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAqE;AACrE,qCAA4B;AAGrB,IAAM,YAAY,GAAlB,MAAM,YAAY;IAGJ;IAFnB,YAEmB,MAAa;QAAb,WAAM,GAAN,MAAM,CAAO;IAC7B,CAAC;IAEJ,KAAK,CAAC,GAAG,CAAI,GAAW;QACtB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvC,OAAO,GAAG,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAU,EAAE,UAAmB;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;QACpE,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAc;QAC1B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAe,EAAE,KAAK,GAAG,GAAG;QACrC,IAAI,MAAM,GAAG,GAAG,CAAC;QACjB,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,GAAG,CAAC;YACF,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;YAC5F,MAAM,GAAG,UAAU,CAAC;YACpB,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QACtB,CAAC,QAAQ,MAAM,KAAK,GAAG,EAAE;QAEzB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,OAAe;QACnC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAED,eAAe;QACb,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACrB,CAAC;CACF,CAAA;AA9CY,oCAAY;uBAAZ,YAAY;IADxB,IAAA,mBAAU,GAAE;IAGR,WAAA,IAAA,eAAM,EAAC,cAAc,CAAC,CAAA;qCACE,iBAAK;GAHrB,YAAY,CA8CxB"}
@@ -0,0 +1,11 @@
1
+ export interface IRuleFunction {
2
+ fn: (...args: any[]) => Promise<any>;
3
+ params: string[];
4
+ description: string;
5
+ name: string;
6
+ }
7
+ export interface RuleEngineInterface {
8
+ evaluate<T>(expression: string, context: T): Promise<boolean>;
9
+ registerCustomFunctions(customFunctions: IRuleFunction[]): void;
10
+ validateExpressionVariables<T>(expression: string, context: T): Promise<string[]>;
11
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=rule-engine.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-engine.interface.js","sourceRoot":"","sources":["../../../../../src/shared/rule-engine/interface/rule-engine.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ import { DynamicModule } from '@nestjs/common';
2
+ import { IRuleFunction } from './interface/rule-engine.interface';
3
+ export declare class RuleEngineModule {
4
+ static forFeatureAsync(options: {
5
+ useFactory: (...args: any[]) => Promise<IRuleFunction[]> | IRuleFunction[];
6
+ inject?: any[];
7
+ }): DynamicModule;
8
+ static forFeature(functions: IRuleFunction[]): DynamicModule;
9
+ }