@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.
- package/README.md +102 -0
- package/dist/src/decorators/rate-limiting-rule.decorator.d.ts +8 -0
- package/dist/src/decorators/rate-limiting-rule.decorator.js +8 -0
- package/dist/src/decorators/rate-limiting-rule.decorator.js.map +1 -0
- package/dist/src/guards/rate-limiting.guard.d.ts +11 -0
- package/dist/src/guards/rate-limiting.guard.js +105 -0
- package/dist/src/guards/rate-limiting.guard.js.map +1 -0
- package/dist/src/index.d.ts +8 -0
- package/dist/src/index.js +26 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/main.d.ts +1 -0
- package/dist/src/main.js +10 -0
- package/dist/src/main.js.map +1 -0
- package/dist/src/object.utils.d.ts +2 -0
- package/dist/src/object.utils.js +37 -0
- package/dist/src/object.utils.js.map +1 -0
- package/dist/src/rate-limiting.module.d.ts +2 -0
- package/dist/src/rate-limiting.module.js +39 -0
- package/dist/src/rate-limiting.module.js.map +1 -0
- package/dist/src/rules/dto/pagination.dto.d.ts +5 -0
- package/dist/src/rules/dto/pagination.dto.js +51 -0
- package/dist/src/rules/dto/pagination.dto.js.map +1 -0
- package/dist/src/rules/dto/rule.dto.d.ts +21 -0
- package/dist/src/rules/dto/rule.dto.js +185 -0
- package/dist/src/rules/dto/rule.dto.js.map +1 -0
- package/dist/src/rules/interface/pagination.interface.d.ts +6 -0
- package/dist/src/rules/interface/pagination.interface.js +3 -0
- package/dist/src/rules/interface/pagination.interface.js.map +1 -0
- package/dist/src/rules/interface/rule.interface.d.ts +26 -0
- package/dist/src/rules/interface/rule.interface.js +3 -0
- package/dist/src/rules/interface/rule.interface.js.map +1 -0
- package/dist/src/rules/rule.controller.d.ts +13 -0
- package/dist/src/rules/rule.controller.js +99 -0
- package/dist/src/rules/rule.controller.js.map +1 -0
- package/dist/src/rules/rule.module.d.ts +4 -0
- package/dist/src/rules/rule.module.js +44 -0
- package/dist/src/rules/rule.module.js.map +1 -0
- package/dist/src/rules/rule.repository.d.ts +14 -0
- package/dist/src/rules/rule.repository.js +90 -0
- package/dist/src/rules/rule.repository.js.map +1 -0
- package/dist/src/rules/rule.schema.d.ts +28 -0
- package/dist/src/rules/rule.schema.js +149 -0
- package/dist/src/rules/rule.schema.js.map +1 -0
- package/dist/src/rules/rule.service.d.ts +24 -0
- package/dist/src/rules/rule.service.js +205 -0
- package/dist/src/rules/rule.service.js.map +1 -0
- package/dist/src/shared/cache/cache.service.d.ts +9 -0
- package/dist/src/shared/cache/cache.service.js +38 -0
- package/dist/src/shared/cache/cache.service.js.map +1 -0
- package/dist/src/shared/redis/redis.module.d.ts +2 -0
- package/dist/src/shared/redis/redis.module.js +38 -0
- package/dist/src/shared/redis/redis.module.js.map +1 -0
- package/dist/src/shared/redis/redis.service.d.ts +12 -0
- package/dist/src/shared/redis/redis.service.js +65 -0
- package/dist/src/shared/redis/redis.service.js.map +1 -0
- package/dist/src/shared/rule-engine/interface/rule-engine.interface.d.ts +11 -0
- package/dist/src/shared/rule-engine/interface/rule-engine.interface.js +3 -0
- package/dist/src/shared/rule-engine/interface/rule-engine.interface.js.map +1 -0
- package/dist/src/shared/rule-engine/rule-engine.module.d.ts +9 -0
- package/dist/src/shared/rule-engine/rule-engine.module.js +70 -0
- package/dist/src/shared/rule-engine/rule-engine.module.js.map +1 -0
- package/dist/src/shared/rule-engine/rule-engine.service.d.ts +13 -0
- package/dist/src/shared/rule-engine/rule-engine.service.js +87 -0
- package/dist/src/shared/rule-engine/rule-engine.service.js.map +1 -0
- package/dist/src/shared/shared.module.d.ts +2 -0
- package/dist/src/shared/shared.module.js +35 -0
- package/dist/src/shared/shared.module.js.map +1 -0
- package/dist/src/validators/rule.constraint.d.ts +9 -0
- package/dist/src/validators/rule.constraint.js +52 -0
- package/dist/src/validators/rule.constraint.js.map +1 -0
- package/dist/src/validators/rule.validator.d.ts +2 -0
- package/dist/src/validators/rule.validator.js +17 -0
- package/dist/src/validators/rule.validator.js.map +1 -0
- package/dist/test/guards/rate-limiting.guard.spec.d.ts +1 -0
- package/dist/test/guards/rate-limiting.guard.spec.js +93 -0
- package/dist/test/guards/rate-limiting.guard.spec.js.map +1 -0
- package/dist/test/mocks/rate-limiting-module.mocks.d.ts +2 -0
- package/dist/test/mocks/rate-limiting-module.mocks.js +60 -0
- package/dist/test/mocks/rate-limiting-module.mocks.js.map +1 -0
- package/dist/test/mocks/rule-engine.mocks.d.ts +7 -0
- package/dist/test/mocks/rule-engine.mocks.js +11 -0
- package/dist/test/mocks/rule-engine.mocks.js.map +1 -0
- package/dist/test/mocks/rule.mocks.d.ts +34 -0
- package/dist/test/mocks/rule.mocks.js +79 -0
- package/dist/test/mocks/rule.mocks.js.map +1 -0
- package/dist/test/mocks/shared-module.mocks.d.ts +10 -0
- package/dist/test/mocks/shared-module.mocks.js +32 -0
- package/dist/test/mocks/shared-module.mocks.js.map +1 -0
- package/dist/test/mocks/shared.mocks.d.ts +19 -0
- package/dist/test/mocks/shared.mocks.js +29 -0
- package/dist/test/mocks/shared.mocks.js.map +1 -0
- package/dist/test/rules/rules.service.spec.d.ts +1 -0
- package/dist/test/rules/rules.service.spec.js +115 -0
- package/dist/test/rules/rules.service.spec.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- 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,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,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,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
|