UNPKG

8.99 kBJavaScriptView Raw
1var colors = require('colors');
2var RuleEngine = require('../index');
3var rules = [
4 /**** Rule 1 ****/
5 {
6 "name": "transaction minimum 500",
7 "priority": 3,
8 "on": true,
9 "condition": function(R) {
10 R.when(this.transactionTotal < 500);
11 },
12 "consequence": function(R) {
13 console.log("Rule 1 matched - blocks transactions below value 500. Rejecting payment.");
14 this.result = false;
15 R.stop();
16 }
17 },
18 /**** Rule 2 ****/
19 {
20 "name": "high credibility customer - avoid checks and bypass",
21 "priority": 2,
22 "on": true,
23 "condition": function(R) {
24 R.when(this.userCredibility && this.userCredibility > 5);
25 },
26 "consequence": function(R) {
27 console.log("Rule 2 matched - user credibility is more, then avoid further check. Accepting payment.");
28 this.result = true;
29 R.stop();
30 }
31 },
32 /**** Rule 3 ****/
33 {
34 "name": "block AME > 10000",
35 "priority": 4,
36 "on": true,
37 "condition": function(R) {
38 R.when(this.cardType == "Credit Card" && this.cardIssuer == "American Express" && this.transactionTotal > 1000);
39 },
40 "consequence": function(R) {
41 console.log("Rule 3 matched - filter American Express payment above 10000. Rejecting payment.");
42 this.result = false;
43 R.stop();
44 }
45 },
46 /**** Rule 4 ****/
47 {
48 "name": "block Cashcard Payment",
49 "priority": 8,
50 "on": true,
51 "condition": function(R) {
52 R.when(this.cardType == "Cash Card");
53 },
54 "consequence": function(R) {
55 console.log("Rule 4 matched - reject the payment if cash card. Rejecting payment.");
56 this.result = false;
57 R.stop();
58 }
59 },
60 /**** Rule 5 ****/
61 {
62 "name": "block guest payment above 10000",
63 "priority": 6,
64 "on": true,
65 "condition": function(R) {
66 R.when(this.customerType && this.transactionTotal > 10000 && this.customerType == "guest");
67 },
68 "consequence": function(R) {
69 console.log("Rule 5 matched - reject if above 10000 and customer type is guest. Rejecting payment.");
70 this.result = false;
71 R.stop();
72 }
73 },
74 /**** Rule 6 ****/
75 {
76 "name": "is customer guest?",
77 "priority": 7,
78 "on": true,
79 "condition": function(R) {
80 R.when(!this.userLoggedIn);
81 },
82 "consequence": function(R) {
83 console.log("Rule 6 matched - support rule written for blocking payment above 10000 from guests.");
84 console.log("Process left to chain with rule 5.");
85 this.customerType = "guest";
86 R.next(); // the fact has been altered, so all rules will run again. No need to restart.
87 }
88 },
89 /**** Rule 7 ****/
90 {
91 "name": "block payment from specific app",
92 "priority": 5,
93 "on": true,
94 "condition": function(R) {
95 R.when(this.appCode && this.appCode === "MOBI4");
96 },
97 "consequence": function(R) {
98 console.log("Rule 7 matched - block payment for Mobile. Reject Payment.");
99 this.result = false;
100 R.stop();
101 }
102 },
103 /**** Rule 8 ****/
104 {
105 "name": "event risk score",
106 "priority": 2,
107 "on": true,
108 "condition": function(R) {
109 R.when(this.eventRiskFactor && this.eventRiskFactor < 5);
110 },
111 "consequence": function(R) {
112 console.log("Rule 8 matched - the event is not critical, so accept");
113 this.result = true;
114 R.stop();
115 }
116 },
117 /**** Rule 9 ****/
118 {
119 "name": "block ip range set",
120 "priority": 3,
121 "on": true,
122 "condition": function(R) {
123 var ipList = ["10.X.X.X", "12.122.X.X", "12.211.X.X", "64.X.X.X", "64.23.X.X", "74.23.211.92"];
124 var allowedRegexp = new RegExp('^(?:' + ipList.join('|').replace(/\./g, '\\.').replace(/X/g, '[^.]+') + ')$');
125 R.when(this.userIP && this.userIP.match(allowedRegexp));
126 },
127 "consequence": function(R) {
128 console.log("Rule 9 matched - ip falls in the given list, then block. Rejecting payment.");
129 this.result = false;
130 R.stop();
131 }
132 },
133 /**** Rule 10 ****/
134 {
135 "name": "check if user's name is blacklisted",
136 "priority": 1,
137 "on": true,
138 "condition": function(R) {
139 var blacklist = ["user4"];
140 R.when(this && blacklist.indexOf(this.name) > -1);
141 },
142 "consequence": function(R) {
143 console.log("Rule 10 matched - the user is malicious, then block. Rejecting payment.");
144 this.result = false;
145 R.stop();
146 }
147 }
148];
149/** example of cash card user, so payment blocked. ****/
150var user1 = {
151 "userIP": "10.3.4.5",
152 "name": "user1",
153 "eventRiskFactor": 6,
154 "userCredibility": 1,
155 "appCode": "WEB1",
156 "userLoggedIn": false,
157 "transactionTotal": 12000,
158 "cardType": "Cash Card",
159 "cardIssuer": "OXI",
160};
161/** example of payment from blocked app, so payemnt blocked. ****/
162var user2 = {
163 "userIP": "27.3.4.5",
164 "name": "user2",
165 "eventRiskFactor": 2,
166 "userCredibility": 2,
167 "appCode": "MOBI4",
168 "userLoggedIn": true,
169 "transactionTotal": 500,
170 "cardType": "Credit Card",
171 "cardIssuer": "VISA",
172};
173/** example of low priority event, so skips frther checks. ****/
174var user3 = {
175 "userIP": "27.3.4.5",
176 "name": "user3",
177 "eventRiskFactor": 2,
178 "userCredibility": 2,
179 "appCode": "WEB1",
180 "userLoggedIn": true,
181 "transactionTotal": 500,
182 "cardType": "Credit Card",
183 "cardIssuer": "VISA",
184};
185/** malicious list of users in rule 10 matches and exists. ****/
186var user4 = {
187 "userIP": "27.3.4.5",
188 "name": "user4",
189 "eventRiskFactor": 8,
190 "userCredibility": 2,
191 "appCode": "WEB1",
192 "userLoggedIn": true,
193 "transactionTotal": 500,
194 "cardType": "Credit Card",
195 "cardIssuer": "VISA",
196};
197/** highly credible user exempted from further checks. ****/
198var user5 = {
199 "userIP": "27.3.4.5",
200 "name": "user5",
201 "eventRiskFactor": 8,
202 "userCredibility": 8,
203 "appCode": "WEB1",
204 "userLoggedIn": true,
205 "transactionTotal": 500,
206 "cardType": "Credit Card",
207 "cardIssuer": "VISA",
208};
209/** example of a user whose ip listed in malicious list. ****/
210var user6 = {
211 "userIP": "10.3.4.5",
212 "name": "user6",
213 "eventRiskFactor": 8,
214 "userCredibility": 2,
215 "appCode": "WEB1",
216 "userLoggedIn": true,
217 "transactionTotal": 500,
218 "cardType": "Credit Card",
219 "cardIssuer": "VISA",
220};
221/** example of a chaned up rule. will take two iterations. ****/
222var user7 = {
223 "userIP": "27.3.4.5",
224 "name": "user7",
225 "eventRiskFactor": 2,
226 "userCredibility": 2,
227 "appCode": "WEB1",
228 "userLoggedIn": false,
229 "transactionTotal": 100000,
230 "cardType": "Credit Card",
231 "cardIssuer": "VISA",
232};
233/** none of rule matches and fires exit clearance with accepted payment. ****/
234var user8 = {
235 "userIP": "27.3.4.5",
236 "name": "user8",
237 "eventRiskFactor": 8,
238 "userCredibility": 2,
239 "appCode": "WEB1",
240 "userLoggedIn": true,
241 "transactionTotal": 500,
242 "cardType": "Credit Card",
243 "cardIssuer": "VISA",
244};
245var R = new RuleEngine(rules);
246console.log("----------".blue);
247console.log("start execution of rules".blue);
248console.log("----------".blue);
249R.execute(user7, function(result) {
250 if (result.result) console.log("Completed", "User7 Accepted".green);
251 else console.log("Completed", "User7 Rejected".red);
252});
253R.execute(user1, function(result) {
254 if (result.result) console.log("Completed", "User1 Accepted".green);
255 else console.log("Completed", "User1 Rejected".red);
256});
257R.execute(user2, function(result) {
258 if (result.result) console.log("Completed", "User2 Accepted".green);
259 else console.log("Completed", "User2 Rejected".red);
260});
261R.execute(user3, function(result) {
262 if (result.result) console.log("Completed", "User3 Accepted".green);
263 else console.log("Completed", "User3 Rejected".red);
264});
265R.execute(user4, function(result) {
266 if (result.result) console.log("Completed", "User4 Accepted".green);
267 else console.log("Completed", "User4 Rejected".red);
268});
269R.execute(user5, function(result) {
270 if (result.result) console.log("Completed", "User5 Accepted".green);
271 else console.log("Completed", "User5 Rejected".red);
272});
273R.execute(user6, function(result) {
274 if (result.result) console.log("Completed", "User6 Accepted".green);
275 else console.log("Completed", "User6 Rejected".red);
276});
277R.execute(user8, function(result) {
278 if (result.result) console.log("Completed", "User8 Accepted".green);
279 else console.log("Completed", "User8 Rejected".red);
280});
\No newline at end of file