d2982b0f30c1a6afa00d9756a29a8022f1d881f6
[motion.git] / server / config / triggers / util.js
1 var _ = require('lodash');
2
3 function Util() {
4   console.log('Trigger Utils Initialization...');
5 }
6
7 Util.prototype.getActionsByTriggers = function(doc, triggers) {
8   var actions = [];
9   doc.dataValues.from = doc.dataValues.from ? doc.dataValues.from.split(';') : [];
10   doc.dataValues.cc = doc.dataValues.cc ? doc.dataValues.cc.split(';') : [];
11   doc.dataValues.to = doc.dataValues.to ? doc.dataValues.to.split(';') : [];
12   triggers.forEach(function(trigger) {
13     if (trigger.status) {
14       var conditions = {
15         op: null,
16         results: [],
17         subGroups: []
18       };
19
20       var conditionsGroup = JSON.parse(trigger.conditions).group;
21       // console.log(JSON.stringify(conditionsGroup));
22       conditions.op = conditionsGroup.boolean;
23       conditionsGroup.rules.forEach(function(rule) {
24         if (rule.operator) {
25           // console.log('normal rule');
26           conditions.results.push(checkCondition(rule, doc.dataValues));
27         } else if (rule.group) {
28           // console.log('subgroup');
29           var subResults = [];
30           rule.group.rules.forEach(function(subrule) {
31             // console.log('subgroup rule');
32             subResults.push(checkCondition(subrule, doc.dataValues));
33           });
34           conditions.subGroups.push({
35             op: rule.group.boolean,
36             results: subResults
37           })
38         }
39       });
40       console.log(JSON.stringify(conditions));
41
42       var subResults = [],
43         lastResults = [];
44       conditions.subGroups.forEach(function(subElement) {
45         subResults.push(_.reduce(subElement.results.length ? subElement.results : [true], function(total, n) {
46           if (subElement.op === 'AND') {
47             return total && n;
48           } else {
49             return total || n;
50           }
51         }));
52       });
53       lastResults = conditions.results.concat(subResults);
54       var finalResult = _.reduce(lastResults.length ? lastResults : [true], function(total, n) {
55         if (conditions.op === 'AND') {
56           return total && n;
57         } else {
58           return total || n;
59         }
60       })
61       console.log('final result is', finalResult);
62
63       if (finalResult) {
64         //push rules into array to return
65         var actionsGroup = JSON.parse(trigger.actions).group;
66         actions = actions.concat(actionsGroup.rules);
67       }
68     }
69   });
70   doc.dataValues.from = doc.dataValues.from.join(';');
71   doc.dataValues.cc = doc.dataValues.cc.join(';');
72   doc.dataValues.to = doc.dataValues.to.join(';');
73   //return actions array
74   return actions;
75 }
76
77 function checkCondition(rule, doc) {
78   // console.log('trigger value ', trigger[rule.field.value]);
79   // console.log('rule data ', rule.data);
80   var result;
81   switch (rule.operator) {
82     case '=':
83       // console.log('is equal?');
84       result = _.includes(doc[rule.field.value], rule.data);
85       // console.log(result);
86       break;
87     case '<>':
88       // console.log('is not equal?');
89       result = !_.includes(doc[rule.field.value], rule.data);
90       // console.log(result);
91       break;
92     default:
93   }
94   return result;
95 }
96
97 module.exports = Util;