80cbe70db3828f0e2a91ce646aaae4d4966d86ec
[motion.git] / server / config / triggers / index.js
1 'use strict';
2
3 var _ = require('lodash');
4 var Util = require('./util');
5 var Voice = require('./voice');
6 var Mail = require('./mail');
7 var Chat = require('./chat');
8 var Cm = require('./cm');
9 var Trigger = require('../../models').Trigger;
10 var ReportAgent = require('../../models').ReportAgent;
11 var MailMessage = require('../../models').MailMessage;
12
13 module.exports = function () {
14
15   var util = new Util();
16   var voice = new Voice();
17   var chat = new Chat();
18   var mail = new Mail();
19   var cm = new Cm();
20
21   Trigger
22     .findAll()
23     .then(function (triggers) {
24       synchTriggers(triggers);
25       console.log('Triggers are ', triggers.length);
26       ReportAgent.afterCreate(function (doc) {
27         var actions = util.getActionsByTriggers(doc, _.filter(triggers, {
28           channel: 'voice'
29         }));
30         console.log('After agent create, Actions are ', actions.length);
31         execActions(actions, doc, 'voice', util, voice, mail, cm);
32       })
33       ReportAgent.afterUpdate(function (doc) {
34         var actions = util.getActionsByTriggers(doc, _.filter(triggers, {
35           channel: 'voice'
36         }));
37         console.log('After agent update, Actions are ', actions.length);
38         execActions(actions, doc, 'voice', util, voice, mail, cm);
39       })
40       MailMessage.afterCreate(function (doc) {
41         if (doc.status === 'RECEIVED') {
42           var actions = util.getActionsByTriggers(doc, _.filter(triggers, {
43             channel: 'mail'
44           }));
45           execActions(actions, doc, 'mail', util, voice, mail, cm);
46         }
47       })
48     })
49     .catch(function (err) {
50       console.error(err);
51     });
52 }
53
54
55 function execActions(actions, doc, channel, util, voice, mail, cm) {
56   actions.forEach(function (rule) {
57     console.log('Executing action "' + rule.field.value + '"');
58     switch (rule.field.value) {
59     case 'contactManager':
60       cm.manageContact(doc.dataValues, channel);
61       break;
62     case 'template':
63       mail.sendTemplate(rule.data, rule.data2);
64       break;
65     default:
66     }
67   });
68 }
69
70 function synchTriggers(triggers) {
71   Trigger.afterCreate(function (doc) {
72     updateCollection(triggers, doc);
73     console.log('After create, Triggers are ', triggers.length);
74   });
75   Trigger.afterUpdate(function (doc) {
76     updateCollection(triggers, doc);
77     console.log('After update, Triggers are ', triggers.length);
78   });
79   Trigger.afterDestroy(function (doc) {
80     _.remove(triggers, {
81       id: doc.id
82     });
83     console.log('After destroy, Triggers are ', triggers.length);
84   });
85 }
86
87 function updateCollection(collection, doc) {
88   var oldItem = _.find(collection, {
89     id: doc.id
90   });
91   var index = collection.indexOf(oldItem);
92   if (oldItem) {
93     _.merge(collection[index], doc);
94   } else {
95     collection.unshift(doc);
96   }
97 }