@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,70 @@
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 RuleEngineModule_1;
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.RuleEngineModule = void 0;
11
+ const common_1 = require("@nestjs/common");
12
+ const jexl_1 = require("jexl");
13
+ const index_1 = require("../../index");
14
+ const rule_engine_service_1 = require("./rule-engine.service");
15
+ let RuleEngineModule = RuleEngineModule_1 = class RuleEngineModule {
16
+ static forFeatureAsync(options) {
17
+ const functionsProvider = {
18
+ provide: index_1.CUSTOM_RULE_FUNCTIONS,
19
+ useValue: options?.inject || [],
20
+ };
21
+ const ruleEngineProvider = {
22
+ provide: index_1.RULE_ENGINE_INSTANCE,
23
+ useFactory: (fns) => {
24
+ const jexl = new jexl_1.Jexl();
25
+ const fnsNames = [];
26
+ for (const { name, fn } of fns) {
27
+ jexl.addFunction(name, fn);
28
+ fnsNames.push(name);
29
+ }
30
+ return new rule_engine_service_1.RuleEngineService(jexl, fnsNames);
31
+ },
32
+ inject: [index_1.CUSTOM_RULE_FUNCTIONS],
33
+ };
34
+ return {
35
+ module: RuleEngineModule_1,
36
+ providers: [functionsProvider, ruleEngineProvider],
37
+ exports: [index_1.RULE_ENGINE_INSTANCE],
38
+ };
39
+ }
40
+ static forFeature(functions) {
41
+ const functionsProvider = {
42
+ provide: index_1.CUSTOM_RULE_FUNCTIONS,
43
+ useValue: functions,
44
+ };
45
+ const ruleEngineProvider = {
46
+ provide: index_1.RULE_ENGINE_INSTANCE,
47
+ useFactory: (fns) => {
48
+ const jexl = new jexl_1.Jexl();
49
+ const fnsNames = [];
50
+ for (const { name, fn } of fns) {
51
+ jexl.addFunction(name, fn);
52
+ fnsNames.push(name);
53
+ }
54
+ return new rule_engine_service_1.RuleEngineService(jexl, fnsNames);
55
+ },
56
+ inject: [index_1.CUSTOM_RULE_FUNCTIONS],
57
+ };
58
+ return {
59
+ module: RuleEngineModule_1,
60
+ providers: [functionsProvider, ruleEngineProvider],
61
+ exports: [index_1.RULE_ENGINE_INSTANCE],
62
+ };
63
+ }
64
+ };
65
+ exports.RuleEngineModule = RuleEngineModule;
66
+ exports.RuleEngineModule = RuleEngineModule = RuleEngineModule_1 = __decorate([
67
+ (0, common_1.Global)(),
68
+ (0, common_1.Module)({})
69
+ ], RuleEngineModule);
70
+ //# sourceMappingURL=rule-engine.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-engine.module.js","sourceRoot":"","sources":["../../../../src/shared/rule-engine/rule-engine.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAyE;AACzE,+BAA4B;AAC5B,uCAA0E;AAE1E,+DAA0D;AAInD,IAAM,gBAAgB,wBAAtB,MAAM,gBAAgB;IAC3B,MAAM,CAAC,eAAe,CAAC,OAGtB;QACC,MAAM,iBAAiB,GAAa;YAClC,OAAO,EAAE,6BAAqB;YAC9B,QAAQ,EAAE,OAAO,EAAE,MAAM,IAAI,EAAE;SAChC,CAAC;QAEF,MAAM,kBAAkB,GAAa;YACnC,OAAO,EAAE,4BAAoB;YAC7B,UAAU,EAAE,CAAC,GAAoB,EAAE,EAAE;gBACnC,MAAM,IAAI,GAAG,IAAI,WAAI,EAAE,CAAC;gBACxB,MAAM,QAAQ,GAAa,EAAE,CAAC;gBAE9B,KAAK,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,GAAG,EAAE,CAAC;oBAC/B,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;oBAC3B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACtB,CAAC;gBAED,OAAO,IAAI,uCAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC/C,CAAC;YACD,MAAM,EAAE,CAAC,6BAAqB,CAAC;SAChC,CAAC;QAEF,OAAO;YACL,MAAM,EAAE,kBAAgB;YACxB,SAAS,EAAE,CAAC,iBAAiB,EAAE,kBAAkB,CAAC;YAClD,OAAO,EAAE,CAAC,4BAAoB,CAAC;SAChC,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,SAA0B;QAC1C,MAAM,iBAAiB,GAAa;YAClC,OAAO,EAAE,6BAAqB;YAC9B,QAAQ,EAAE,SAAS;SACpB,CAAC;QAEF,MAAM,kBAAkB,GAAa;YACnC,OAAO,EAAE,4BAAoB;YAC7B,UAAU,EAAE,CAAC,GAAoB,EAAE,EAAE;gBACnC,MAAM,IAAI,GAAG,IAAI,WAAI,EAAE,CAAC;gBACxB,MAAM,QAAQ,GAAa,EAAE,CAAC;gBAE9B,KAAK,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,GAAG,EAAE,CAAC;oBAC/B,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;oBAC3B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACtB,CAAC;gBAED,OAAO,IAAI,uCAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC/C,CAAC;YACD,MAAM,EAAE,CAAC,6BAAqB,CAAC;SAChC,CAAC;QAEF,OAAO;YACL,MAAM,EAAE,kBAAgB;YACxB,SAAS,EAAE,CAAC,iBAAiB,EAAE,kBAAkB,CAAC;YAClD,OAAO,EAAE,CAAC,4BAAoB,CAAC;SAChC,CAAC;IACJ,CAAC;CACF,CAAA;AA7DY,4CAAgB;2BAAhB,gBAAgB;IAF5B,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,gBAAgB,CA6D5B"}
@@ -0,0 +1,13 @@
1
+ import { IRuleFunction } from "./interface/rule-engine.interface";
2
+ export declare class RuleEngineService {
3
+ private readonly jexl;
4
+ private readonly allowedFns;
5
+ constructor(jexl: any, allowedFns: String[]);
6
+ registerCustomFunctions(customFunctions: IRuleFunction[]): Promise<void>;
7
+ evaluate<T>(expression: string, context: T): Promise<boolean>;
8
+ validateExpressionVariables<T>(expression: string, context: T): Promise<string[]>;
9
+ validateFunctionsAreValid(expression: any): String[];
10
+ getAllowedFunctions(): String[];
11
+ private _extractVariables;
12
+ private _validateVariablesInContext;
13
+ }
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RuleEngineService = void 0;
4
+ class RuleEngineService {
5
+ jexl;
6
+ allowedFns;
7
+ constructor(jexl, allowedFns) {
8
+ this.jexl = jexl;
9
+ this.allowedFns = allowedFns;
10
+ }
11
+ async registerCustomFunctions(customFunctions) {
12
+ for (const { name, fn } of customFunctions) {
13
+ this.jexl.addFunction(name, fn);
14
+ }
15
+ }
16
+ evaluate(expression, context) {
17
+ return this.jexl.eval(expression, context);
18
+ }
19
+ async validateExpressionVariables(expression, context) {
20
+ const variables = this._extractVariables(expression);
21
+ const missingVariables = this._validateVariablesInContext(variables, context);
22
+ return missingVariables;
23
+ }
24
+ validateFunctionsAreValid(expression) {
25
+ if (!this.allowedFns || !this.allowedFns?.length)
26
+ return [];
27
+ const usedFunctions = [
28
+ ...expression.matchAll(/([a-zA-Z_][a-zA-Z0-9_]*)\s*\(/g),
29
+ ].map((match) => match[1]);
30
+ const invalidFunctions = usedFunctions.filter((fn) => !this.allowedFns.includes(fn));
31
+ return invalidFunctions;
32
+ }
33
+ getAllowedFunctions() {
34
+ return this.allowedFns;
35
+ }
36
+ _extractVariables(expression) {
37
+ const regex = /[a-zA-Z_$][a-zA-Z0-9_$]*(?:\.[a-zA-Z_$][a-zA-Z0-9_$]*|\[\d+\](?:\.[a-zA-Z_$][a-zA-Z0-9_$]*)*)+|\b[a-zA-Z_$][a-zA-Z0-9_$]*\b/g;
38
+ const functionRegex = /\b[a-zA-Z_$][a-zA-Z0-9_$]*\s*\(/g;
39
+ const functionNames = [];
40
+ let match;
41
+ while ((match = functionRegex.exec(expression)) !== null) {
42
+ functionNames.push(match[0].replace('(', '').trim());
43
+ }
44
+ const allMatches = expression.match(regex) || [];
45
+ const variables = allMatches.filter((variable) => {
46
+ if (functionNames.includes(variable))
47
+ return false;
48
+ return true;
49
+ });
50
+ return [...new Set(variables)];
51
+ }
52
+ _validateVariablesInContext(variables, context) {
53
+ const missingVariables = [];
54
+ const presentVariables = [];
55
+ for (const variable of variables) {
56
+ if (variable.includes('.') || variable.includes('[')) {
57
+ let exists = true;
58
+ let current = context;
59
+ const parts = variable.replace(/\[(\d+)\]/g, '.$1').split('.');
60
+ for (const part of parts) {
61
+ if (current && Object.prototype.hasOwnProperty.call(current, part)) {
62
+ current = current[part];
63
+ }
64
+ else {
65
+ exists = false;
66
+ break;
67
+ }
68
+ }
69
+ if (exists) {
70
+ presentVariables.push(variable);
71
+ }
72
+ else {
73
+ missingVariables.push(variable);
74
+ }
75
+ }
76
+ else if (Object.prototype.hasOwnProperty.call(context, variable)) {
77
+ presentVariables.push(variable);
78
+ }
79
+ else {
80
+ missingVariables.push(variable);
81
+ }
82
+ }
83
+ return missingVariables;
84
+ }
85
+ }
86
+ exports.RuleEngineService = RuleEngineService;
87
+ //# sourceMappingURL=rule-engine.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-engine.service.js","sourceRoot":"","sources":["../../../../src/shared/rule-engine/rule-engine.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare class SharedModule {
2
+ }
@@ -0,0 +1,35 @@
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.SharedModule = void 0;
10
+ const cache_manager_1 = require("@nestjs/cache-manager");
11
+ const common_1 = require("@nestjs/common");
12
+ const cache_manager_redis_store_1 = require("cache-manager-redis-store");
13
+ const cache_service_1 = require("../shared/cache/cache.service");
14
+ const redis_module_1 = require("./redis/redis.module");
15
+ const rule_engine_service_1 = require("./rule-engine/rule-engine.service");
16
+ let SharedModule = class SharedModule {
17
+ };
18
+ exports.SharedModule = SharedModule;
19
+ exports.SharedModule = SharedModule = __decorate([
20
+ (0, common_1.Module)({
21
+ imports: [
22
+ cache_manager_1.CacheModule.registerAsync({
23
+ useFactory: async () => ({
24
+ store: cache_manager_redis_store_1.redisStore,
25
+ host: process.env.REDIS_HOST,
26
+ port: Number(process.env.REDIS_PORT),
27
+ }),
28
+ }),
29
+ redis_module_1.RedisModule
30
+ ],
31
+ providers: [cache_service_1.CacheService, rule_engine_service_1.RuleEngineService],
32
+ exports: [cache_service_1.CacheService, rule_engine_service_1.RuleEngineService]
33
+ })
34
+ ], SharedModule);
35
+ //# sourceMappingURL=shared.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.module.js","sourceRoot":"","sources":["../../../src/shared/shared.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,yDAAoD;AACpD,2CAAwC;AACxC,yEAAuD;AACvD,iEAA6D;AAC7D,uDAAmD;AACnD,2EAAsE;AAgB/D,IAAM,YAAY,GAAlB,MAAM,YAAY;CAAG,CAAA;AAAf,oCAAY;uBAAZ,YAAY;IAdxB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,2BAAW,CAAC,aAAa,CAAC;gBACxB,UAAU,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;oBACvB,KAAK,EAAE,sCAAU;oBACjB,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU;oBAC5B,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;iBACrC,CAAC;aACH,CAAC;YACF,0BAAW;SACZ;QACD,SAAS,EAAE,CAAC,4BAAY,EAAE,uCAAiB,CAAC;QAC5C,OAAO,EAAE,CAAC,4BAAY,EAAE,uCAAiB,CAAC;KAC3C,CAAC;GACW,YAAY,CAAG"}
@@ -0,0 +1,9 @@
1
+ import { ValidationArguments, ValidatorConstraintInterface } from 'class-validator';
2
+ import { RuleService } from '../rules/rule.service';
3
+ export declare class IsValidExpressionConstraint implements ValidatorConstraintInterface {
4
+ private readonly ruleService;
5
+ private errorMessage;
6
+ constructor(ruleService: RuleService);
7
+ validate(value: string, args: ValidationArguments): boolean;
8
+ defaultMessage(args: ValidationArguments): string;
9
+ }
@@ -0,0 +1,52 @@
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.IsValidExpressionConstraint = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const class_validator_1 = require("class-validator");
15
+ const jexl_1 = require("jexl");
16
+ const rule_service_1 = require("../rules/rule.service");
17
+ let IsValidExpressionConstraint = class IsValidExpressionConstraint {
18
+ ruleService;
19
+ errorMessage = 'Invalid expression';
20
+ constructor(ruleService) {
21
+ this.ruleService = ruleService;
22
+ }
23
+ validate(value, args) {
24
+ try {
25
+ const jexl = new jexl_1.Jexl();
26
+ if (typeof value !== 'string') {
27
+ this.errorMessage = 'Expression need to be string!';
28
+ return false;
29
+ }
30
+ const invalidExpressionMessage = this.ruleService.validateRuleExpression(value);
31
+ if (invalidExpressionMessage && invalidExpressionMessage.length) {
32
+ throw new common_1.BadRequestException(invalidExpressionMessage);
33
+ }
34
+ jexl.compile(value);
35
+ return true;
36
+ }
37
+ catch (err) {
38
+ this.errorMessage = `Expression malformed ${err.message}`;
39
+ return false;
40
+ }
41
+ }
42
+ defaultMessage(args) {
43
+ return this.errorMessage;
44
+ }
45
+ };
46
+ exports.IsValidExpressionConstraint = IsValidExpressionConstraint;
47
+ exports.IsValidExpressionConstraint = IsValidExpressionConstraint = __decorate([
48
+ (0, class_validator_1.ValidatorConstraint)({ name: 'IsValidExpression', async: false }),
49
+ (0, common_1.Injectable)(),
50
+ __metadata("design:paramtypes", [rule_service_1.RuleService])
51
+ ], IsValidExpressionConstraint);
52
+ //# sourceMappingURL=rule.constraint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule.constraint.js","sourceRoot":"","sources":["../../../src/validators/rule.constraint.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAAiE;AACjE,qDAIyB;AACzB,+BAA4B;AAC5B,wDAAoD;AAI7C,IAAM,2BAA2B,GAAjC,MAAM,2BAA2B;IAET;IADrB,YAAY,GAAW,oBAAoB,CAAC;IACpD,YAA6B,WAAwB;QAAxB,gBAAW,GAAX,WAAW,CAAa;IAAG,CAAC;IAEzD,QAAQ,CAAC,KAAa,EAAE,IAAyB;QAC/C,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,WAAI,EAAE,CAAC;YAExB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9B,IAAI,CAAC,YAAY,GAAG,+BAA+B,CAAC;gBACpD,OAAO,KAAK,CAAC;YACf,CAAC;YAED,MAAM,wBAAwB,GAC5B,IAAI,CAAC,WAAW,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;YAEjD,IAAI,wBAAwB,IAAI,wBAAwB,CAAC,MAAM,EAAE,CAAC;gBAChE,MAAM,IAAI,4BAAmB,CAAC,wBAAwB,CAAC,CAAC;YAC1D,CAAC;YAED,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,YAAY,GAAG,wBAAwB,GAAG,CAAC,OAAO,EAAE,CAAC;YAC1D,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,cAAc,CAAC,IAAyB;QACtC,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;CACF,CAAA;AA/BY,kEAA2B;sCAA3B,2BAA2B;IAFvC,IAAA,qCAAmB,EAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAChE,IAAA,mBAAU,GAAE;qCAG+B,0BAAW;GAF1C,2BAA2B,CA+BvC"}
@@ -0,0 +1,2 @@
1
+ import { ValidationOptions } from 'class-validator';
2
+ export declare function IsValidExpression(validationOptions?: ValidationOptions): (object: Object, propertyName: string) => void;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.IsValidExpression = IsValidExpression;
4
+ const class_validator_1 = require("class-validator");
5
+ const rule_constraint_1 = require("./rule.constraint");
6
+ function IsValidExpression(validationOptions) {
7
+ return function (object, propertyName) {
8
+ (0, class_validator_1.registerDecorator)({
9
+ name: 'IsValidExpression',
10
+ target: object.constructor,
11
+ propertyName: propertyName,
12
+ options: validationOptions,
13
+ validator: rule_constraint_1.IsValidExpressionConstraint,
14
+ });
15
+ };
16
+ }
17
+ //# sourceMappingURL=rule.validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule.validator.js","sourceRoot":"","sources":["../../../src/validators/rule.validator.ts"],"names":[],"mappings":";;AAGA,8CAUC;AAbD,qDAAuE;AACvE,uDAAgE;AAEhE,SAAgB,iBAAiB,CAAC,iBAAqC;IACrE,OAAO,UAAU,MAAc,EAAE,YAAoB;QACnD,IAAA,mCAAiB,EAAC;YAChB,IAAI,EAAE,mBAAmB;YACzB,MAAM,EAAE,MAAM,CAAC,WAAW;YAC1B,YAAY,EAAE,YAAY;YAC1B,OAAO,EAAE,iBAAiB;YAC1B,SAAS,EAAE,6CAA2B;SACvC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const index_1 = require("src/index");
4
+ const rule_engine_mocks_1 = require("test/mocks/rule-engine.mocks");
5
+ const rule_mocks_1 = require("test/mocks/rule.mocks");
6
+ describe('RateLimitingRuleGuard', () => {
7
+ let guard;
8
+ let reflector;
9
+ const mockExecutionContext = (body) => ({
10
+ getHandler: jest.fn(),
11
+ switchToHttp: () => ({
12
+ getRequest: () => ({ body }),
13
+ }),
14
+ });
15
+ beforeEach(() => {
16
+ reflector = { get: jest.fn() };
17
+ guard = new index_1.RateLimitingRuleGuard(reflector, rule_mocks_1.ruleServiceMock, rule_engine_mocks_1.ruleEngineServiceMock);
18
+ });
19
+ it('should return true if no metadata is defined', async () => {
20
+ reflector.get.mockReturnValue(undefined);
21
+ const context = mockExecutionContext({});
22
+ const result = await guard.canActivate(context);
23
+ expect(result).toBe(true);
24
+ });
25
+ it('should return true if partner is missing', async () => {
26
+ reflector.get.mockReturnValue({
27
+ action: 'CREATE',
28
+ partnerPath: 'partner',
29
+ });
30
+ const context = mockExecutionContext({});
31
+ const result = await guard.canActivate(context);
32
+ expect(result).toBe(true);
33
+ });
34
+ it('should throw if expression is invalid', async () => {
35
+ reflector.get.mockReturnValue({
36
+ action: 'CREATE',
37
+ partnerPath: 'partner',
38
+ });
39
+ const fakeRule = { expression: 'invalid()', variables: {}, variablesRequired: false };
40
+ rule_mocks_1.ruleServiceMock.findAllWithoutPagination.mockResolvedValue([fakeRule]);
41
+ rule_mocks_1.ruleServiceMock.validateRuleExpression.mockReturnValue('invalid expression');
42
+ const context = mockExecutionContext({ partner: 'abc' });
43
+ await expect(guard.canActivate(context)).resolves.toBe(false);
44
+ });
45
+ it('should throw if invalid functions used', async () => {
46
+ reflector.get.mockReturnValue({
47
+ action: 'CREATE',
48
+ partnerPath: 'partner',
49
+ });
50
+ const rule = { expression: 'dangerous()', variables: {}, variablesRequired: false };
51
+ rule_mocks_1.ruleServiceMock.findAllWithoutPagination.mockResolvedValue([rule]);
52
+ rule_mocks_1.ruleServiceMock.validateRuleExpression.mockReturnValue(null);
53
+ rule_engine_mocks_1.ruleEngineServiceMock.validateFunctionsAreValid.mockReturnValue(['dangerous']);
54
+ const context = mockExecutionContext({ partner: 'abc' });
55
+ await expect(guard.canActivate(context)).resolves.toBe(false);
56
+ });
57
+ it('should throw if required variables are missing', async () => {
58
+ reflector.get.mockReturnValue({
59
+ action: 'CREATE',
60
+ partnerPath: 'partner',
61
+ });
62
+ const rule = {
63
+ expression: 'a > 1',
64
+ variables: {},
65
+ variablesRequired: true,
66
+ };
67
+ rule_mocks_1.ruleServiceMock.findAllWithoutPagination.mockResolvedValue([rule]);
68
+ rule_mocks_1.ruleServiceMock.validateRuleExpression.mockReturnValue(null);
69
+ rule_engine_mocks_1.ruleEngineServiceMock.validateFunctionsAreValid.mockReturnValue([]);
70
+ rule_engine_mocks_1.ruleEngineServiceMock.validateExpressionVariables.mockResolvedValue(['a']);
71
+ const context = mockExecutionContext({ partner: 'abc' });
72
+ await expect(guard.canActivate(context)).resolves.toBe(false);
73
+ });
74
+ it('should throw if evaluate returns true', async () => {
75
+ reflector.get.mockReturnValue({
76
+ action: 'CREATE',
77
+ partnerPath: 'partner',
78
+ });
79
+ const rule = {
80
+ expression: 'a > 1',
81
+ variables: { a: 2 },
82
+ variablesRequired: false,
83
+ errorMessage: 'Limit hit',
84
+ };
85
+ rule_mocks_1.ruleServiceMock.findAllWithoutPagination.mockResolvedValue([rule]);
86
+ rule_mocks_1.ruleServiceMock.validateRuleExpression.mockReturnValue(null);
87
+ rule_engine_mocks_1.ruleEngineServiceMock.validateFunctionsAreValid.mockReturnValue([]);
88
+ rule_engine_mocks_1.ruleEngineServiceMock.evaluate.mockResolvedValue(true);
89
+ const context = mockExecutionContext({ partner: 'abc' });
90
+ await expect(guard.canActivate(context)).resolves.toBe(false);
91
+ });
92
+ });
93
+ //# sourceMappingURL=rate-limiting.guard.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limiting.guard.spec.js","sourceRoot":"","sources":["../../../test/guards/rate-limiting.guard.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare class RateLimitingMockModule {
2
+ }
@@ -0,0 +1,60 @@
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.RateLimitingMockModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const config_1 = require("@nestjs/config");
12
+ const mongoose_1 = require("@nestjs/mongoose");
13
+ const mongodb_memory_server_1 = require("mongodb-memory-server");
14
+ const rule_constraint_1 = require("../../src/validators/rule.constraint");
15
+ const rule_mocks_1 = require("./rule.mocks");
16
+ async function getMongoUri() {
17
+ const mongod = await mongodb_memory_server_1.MongoMemoryServer.create();
18
+ return mongod.getUri();
19
+ }
20
+ const mockIsValidExpressionConstraint = {
21
+ provide: rule_constraint_1.IsValidExpressionConstraint,
22
+ useValue: {
23
+ validate: jest.fn(),
24
+ defaultMessage: jest.fn(),
25
+ },
26
+ };
27
+ const mockRuleService = {
28
+ provide: 'RuleService',
29
+ useValue: {
30
+ create: jest.fn(),
31
+ findAll: jest.fn(),
32
+ updateOne: jest.fn(),
33
+ delete: jest.fn(),
34
+ },
35
+ };
36
+ let RateLimitingMockModule = class RateLimitingMockModule {
37
+ };
38
+ exports.RateLimitingMockModule = RateLimitingMockModule;
39
+ exports.RateLimitingMockModule = RateLimitingMockModule = __decorate([
40
+ (0, common_1.Module)({
41
+ imports: [
42
+ config_1.ConfigModule.forRoot({ isGlobal: true }),
43
+ mongoose_1.MongooseModule.forRootAsync({
44
+ useFactory: async () => ({
45
+ uri: await getMongoUri(),
46
+ }),
47
+ inject: [],
48
+ }),
49
+ rule_mocks_1.MockRuleModule,
50
+ ],
51
+ providers: [
52
+ mockIsValidExpressionConstraint,
53
+ mockRuleService,
54
+ ],
55
+ exports: [
56
+ rule_mocks_1.MockRuleModule,
57
+ ],
58
+ })
59
+ ], RateLimitingMockModule);
60
+ //# sourceMappingURL=rate-limiting-module.mocks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limiting-module.mocks.js","sourceRoot":"","sources":["../../../test/mocks/rate-limiting-module.mocks.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,2CAA8C;AAC9C,+CAAkD;AAClD,iEAA0D;AAC1D,0EAAmF;AACnF,6CAA8C;AAE9C,KAAK,UAAU,WAAW;IACxB,MAAM,MAAM,GAAG,MAAM,yCAAiB,CAAC,MAAM,EAAE,CAAC;IAChD,OAAO,MAAM,CAAC,MAAM,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,+BAA+B,GAAG;IACtC,OAAO,EAAE,6CAA2B;IACpC,QAAQ,EAAE;QACR,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE;QACnB,cAAc,EAAE,IAAI,CAAC,EAAE,EAAE;KAC1B;CACF,CAAC;AAEF,MAAM,eAAe,GAAG;IACtB,OAAO,EAAE,aAAa;IACtB,QAAQ,EAAE;QACR,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;QACjB,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE;QAClB,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE;QACpB,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;KAClB;CACF,CAAC;AAqBK,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;CAAG,CAAA;AAAzB,wDAAsB;iCAAtB,sBAAsB;IAnBlC,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,qBAAY,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;YACxC,yBAAc,CAAC,YAAY,CAAC;gBAC1B,UAAU,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;oBACvB,GAAG,EAAE,MAAM,WAAW,EAAE;iBACzB,CAAC;gBACF,MAAM,EAAE,EAAE;aACX,CAAC;YACF,2BAAc;SACf;QACD,SAAS,EAAE;YACT,+BAA+B;YAC/B,eAAe;SAChB;QACD,OAAO,EAAE;YACP,2BAAc;SACf;KACF,CAAC;GACW,sBAAsB,CAAG"}
@@ -0,0 +1,7 @@
1
+ export declare const ruleEngineServiceMock: {
2
+ registerCustomFunctions: jest.Mock<any, any, any>;
3
+ evaluate: jest.Mock<any, any, any>;
4
+ validateExpressionVariables: jest.Mock<any, any, any>;
5
+ validateFunctionsAreValid: jest.Mock<any, any, any>;
6
+ getAllowedFunctions: jest.Mock<any, any, any>;
7
+ };
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ruleEngineServiceMock = void 0;
4
+ exports.ruleEngineServiceMock = {
5
+ registerCustomFunctions: jest.fn(),
6
+ evaluate: jest.fn(),
7
+ validateExpressionVariables: jest.fn(),
8
+ validateFunctionsAreValid: jest.fn(),
9
+ getAllowedFunctions: jest.fn(),
10
+ };
11
+ //# sourceMappingURL=rule-engine.mocks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-engine.mocks.js","sourceRoot":"","sources":["../../../test/mocks/rule-engine.mocks.ts"],"names":[],"mappings":";;;AAAa,QAAA,qBAAqB,GAAG;IACnC,uBAAuB,EAAE,IAAI,CAAC,EAAE,EAAE;IAClC,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE;IACnB,2BAA2B,EAAE,IAAI,CAAC,EAAE,EAAE;IACtC,yBAAyB,EAAE,IAAI,CAAC,EAAE,EAAE;IACpC,mBAAmB,EAAE,IAAI,CAAC,EAAE,EAAE;CAC/B,CAAC"}
@@ -0,0 +1,34 @@
1
+ import { IPagination } from '../../src/rules/interface/pagination.interface';
2
+ import { IRule } from '../../src/rules/interface/rule.interface';
3
+ export type RequiredFields<T> = Omit<Required<T>, 'createdAt' | 'updatedAt' | 'deletedAt'>;
4
+ export declare const ruleFullStub: RequiredFields<IRule>;
5
+ export declare const createRateLimitingStub: Partial<IRule>;
6
+ export declare const rulePaginated: IPagination<IRule[]>;
7
+ export declare const ruleRepositoryMock: {
8
+ save: jest.Mock<Promise<RequiredFields<IRule>>, [data: IRule], any>;
9
+ findAll: any;
10
+ findOneByRateId: any;
11
+ update: jest.Mock<Promise<RequiredFields<IRule>>, [quoteId: string, data: IRule], any>;
12
+ };
13
+ export declare const ruleServiceMock: {
14
+ create: jest.Mock<any, any, any>;
15
+ findAll: jest.Mock<any, any, any>;
16
+ findAllWithoutPagination: jest.Mock<any, any, any>;
17
+ findById: jest.Mock<any, any, any>;
18
+ updateOne: jest.Mock<any, any, any>;
19
+ delete: jest.Mock<any, any, any>;
20
+ validateRuleExpression: jest.Mock<any, any, any>;
21
+ getFromCache: jest.Mock<any, any, any>;
22
+ generateRateLimitingCountCacheKey: jest.Mock<any, any, any>;
23
+ };
24
+ export declare const mockRuleService: {
25
+ findAll: jest.Mock<any, any, any>;
26
+ findById: jest.Mock<any, any, any>;
27
+ findAllWithoutPagination: jest.Mock<any, any, any>;
28
+ };
29
+ export declare const mockRuleRepository: {
30
+ create: jest.Mock<any, any, any>;
31
+ findByCondition: jest.Mock<any, any, any>;
32
+ };
33
+ export declare class MockRuleModule {
34
+ }
@@ -0,0 +1,79 @@
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.MockRuleModule = exports.mockRuleRepository = exports.mockRuleService = exports.ruleServiceMock = exports.ruleRepositoryMock = exports.rulePaginated = exports.createRateLimitingStub = exports.ruleFullStub = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const rule_repository_1 = require("../../src/rules/rule.repository");
12
+ const rule_service_1 = require("../../src/rules/rule.service");
13
+ const shared_module_mocks_1 = require("./shared-module.mocks");
14
+ exports.ruleFullStub = {
15
+ ruleId: 'rule_id',
16
+ name: 'create test',
17
+ targetAction: 'create_test',
18
+ expression: 'count_quote(id) > 1',
19
+ enabled: true,
20
+ errorMessage: 'error to create test',
21
+ partner: 'bolttech',
22
+ provider: 'bolttech',
23
+ variables: {
24
+ startDate: new Date().toString(),
25
+ endDate: new Date().toString(),
26
+ },
27
+ variablesRequired: true,
28
+ productType: ''
29
+ };
30
+ exports.createRateLimitingStub = {
31
+ ...exports.ruleFullStub,
32
+ ruleId: undefined
33
+ };
34
+ exports.rulePaginated = {
35
+ total: 1,
36
+ currentPage: 1,
37
+ totalPages: 1,
38
+ data: [exports.ruleFullStub],
39
+ };
40
+ exports.ruleRepositoryMock = {
41
+ save: jest.fn(async (data) => exports.ruleFullStub),
42
+ findAll: jest.fn((queryParameters) => Promise.resolve(exports.rulePaginated)),
43
+ findOneByRateId: jest.fn(async (id) => exports.ruleFullStub),
44
+ update: jest.fn(async (quoteId, data) => exports.ruleFullStub),
45
+ };
46
+ exports.ruleServiceMock = {
47
+ create: jest.fn(),
48
+ findAll: jest.fn(),
49
+ findAllWithoutPagination: jest.fn(),
50
+ findById: jest.fn(),
51
+ updateOne: jest.fn(),
52
+ delete: jest.fn(),
53
+ validateRuleExpression: jest.fn(),
54
+ getFromCache: jest.fn(),
55
+ generateRateLimitingCountCacheKey: jest.fn()
56
+ };
57
+ exports.mockRuleService = {
58
+ findAll: jest.fn(),
59
+ findById: jest.fn(),
60
+ findAllWithoutPagination: jest.fn(),
61
+ };
62
+ exports.mockRuleRepository = {
63
+ create: jest.fn(),
64
+ findByCondition: jest.fn(),
65
+ };
66
+ let MockRuleModule = class MockRuleModule {
67
+ };
68
+ exports.MockRuleModule = MockRuleModule;
69
+ exports.MockRuleModule = MockRuleModule = __decorate([
70
+ (0, common_1.Module)({
71
+ imports: [shared_module_mocks_1.MockSharedModule],
72
+ providers: [
73
+ { provide: rule_service_1.RuleService, useValue: exports.mockRuleService },
74
+ { provide: rule_repository_1.RuleRepository, useValue: exports.mockRuleRepository },
75
+ ],
76
+ exports: [rule_service_1.RuleService, rule_repository_1.RuleRepository],
77
+ })
78
+ ], MockRuleModule);
79
+ //# sourceMappingURL=rule.mocks.js.map