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