32461ae594cd25d798c15bbaffb51828fd69f7dd
[motion.git] / server / api / mail_account / mail_account.controller.js
1 'use strict';
2
3 var _ = require('lodash');
4 var util = require('util');
5 var async = require('async');
6
7 // IMAP MODULES
8 // var Imap = require("mail-listener2");
9 // SMTP MODULES
10 // var nodemailer = require('nodemailer');
11 // var smtpTransport = require('nodemailer-smtp-transport');
12
13 var sequelize = require('../../models').sequelize;
14 var MailAccount = require('../../models').MailAccount;
15 var MailApplication = require('../../models').MailApplication;
16 var MailServerIn = require('../../models').MailServerIn;
17 var MailServerOut = require('../../models').MailServerOut;
18
19 // Get list of mailAccounts
20 exports.index = function(req, res) {
21
22   var attributes = ['description', 'name', 'address'];
23   var per_page = req.query.per_page ? parseInt(req.query.per_page, 10) : 100;
24   var page = req.query.page ? parseInt(req.query.page, 10) : 0;
25
26   var query = {
27     where: {},
28     limit: per_page,
29     offset: page * per_page,
30     include: [{
31       all: true
32     }]
33   };
34
35   _.forIn(req.query, function(value, key) {
36     switch (key) {
37       case 'per_page':
38       case 'page':
39         break;
40       case 'sort_by':
41         query.order = util.format('%s %s', req.query.sort_by, req.query.sort_order || 'ASC') || null;
42         break;
43       case 'sort_order':
44         break;
45       case '$':
46         query.where.$or = [];
47         attributes.forEach(function(attribute) {
48           var tmp = {};
49           tmp[attribute] = {
50             $like: '%' + value + '%'
51           };
52
53           query.where.$or.push(tmp);
54         });
55         break;
56       default:
57         query.where[key] = {
58           $like: {}
59         };
60         query.where[key].$like = '%' + value + '%';
61     }
62   });
63
64   MailAccount
65     .findAndCountAll(query)
66     .then(function(result) {
67       var total_pages = Math.ceil(result.count / per_page);
68       var next_page = total_pages > (query.offset + 1) ? util.format('%s://%s%s?page=%d', req.protocol, req.headers.host, req.baseUrl, page + 1) : null;
69       var previous_page = page > 0 ? util.format('%s://%s%s?page=%d', req.protocol, req.headers.host, req.baseUrl, page - 1) : null;
70
71       res.status(200).send({
72         count: result.count,
73         rows: result.rows,
74         next_page: next_page,
75         previous_page: previous_page,
76         total_pages: total_pages
77       });
78
79     })
80     .catch(function(err) {
81       return handleError(res, err);
82     });
83 };
84
85 // Get a single mailAccount
86 exports.show = function(req, res, next) {
87   MailAccount
88     .findById(req.params.id, {
89       include: [{
90         all: true
91       }]
92     })
93     .then(function(mailAccount) {
94       if (!mailAccount) {
95         return res.sendStatus(404);
96       }
97       return res.send(mailAccount);
98     })
99     .catch(function(err) {
100       return next(err);
101     });
102 };
103
104 // Creates a new mailAccount in the DB.
105 exports.create = function(req, res, next) {
106
107   return sequelize.transaction(function(t) {
108
109     // chain all your queries here. make sure you return them.
110     return MailAccount
111       .create({
112         name: req.body.name,
113         address: req.body.address,
114         description: req.body.description
115       }, {
116         transaction: t
117       }).then(function(mailAccount) {
118         // MAIL ACCOUNT ID SETUP
119         req.body.incoming.MailAccountId = mailAccount.id;
120         return MailServerIn
121           .create(req.body.incoming, {
122             transaction: t
123           })
124           .then(function(mailServerIn) {
125             // MAIL ACCOUNT ID SETUP
126             req.body.outgoing.MailAccountId = mailAccount.id;
127             return MailServerOut
128               .create(req.body.outgoing, {
129                 transaction: t
130               })
131           });
132       });
133   }).then(function(result) {
134     return res.status(201).send(result);
135   }).catch(function(err) {
136     return next(err);
137   });
138 };
139
140 // Updates an existing mailAccount in the DB.
141 exports.update = function(req, res) {
142   if (req.body.id) {
143     delete req.body.id;
144   }
145   MailAccount
146     .findById(req.params.id)
147     .then(function(mailAccount) {
148       if (!mailAccount) {
149         return res.sendStatus(404);
150       }
151       var updated = _.merge(mailAccount, req.body);
152       updated
153         .save()
154         .then(function() {
155           return res.status(200).send(mailAccount);
156         })
157         .catch(function(err) {
158           return handleError(res, err);
159         });
160     })
161     .catch(function(err) {
162       return handleError(res, err);
163     });
164 };
165
166 // Sort Mail Applications
167 exports.sortApplications = function(req, res, next) {
168
169   MailApplication
170     .findAll({
171       where: {
172         id: req.body.applications
173       }
174     })
175     .then(function(mailApplications) {
176       var tmpMailApplications = mailApplications;
177
178       async.waterfall([
179         function(callback) {
180           MailApplication
181             .destroy({
182               where: {
183                 id: req.body.applications
184               }
185             }).then(function() {
186               console.log('destroy');
187               callback();
188             })
189             .catch(function(err) {
190               callback(err);
191             });
192         },
193         function(callback) {
194           // arg1 now equals 'one' and arg2 now equals 'two'
195           var sortedApplications = [];
196           for (var i = 0; i < req.body.applications.length; i++) {
197             var tmpMailApplication = _.find(tmpMailApplications, {
198               'id': req.body.applications[i]
199             });
200             if (tmpMailApplication) {
201               tmpMailApplication.priority = i + 1;
202               sortedApplications.push(tmpMailApplication.dataValues);
203             }
204           }
205
206           MailApplication
207             .bulkCreate(sortedApplications)
208             .then(function() {
209               console.log('bulkCreate');
210               callback();
211             })
212             .catch(function(err) {
213               callback(err);
214             });
215         },
216         function(callback) {
217           // arg1 now equals 'three'
218           MailApplication
219             .findAll({
220               where: {
221                 id: req.body.applications
222               },
223               order: 'priority',
224               include: [{
225                 all: true
226               }]
227             })
228             .then(function(mailApplications) {
229               console.log(mailApplications);
230               callback(null, mailApplications);
231             })
232             .catch(function(err) {
233               callback(err);
234             });
235         }
236       ], function(err, result) {
237         // result now equals 'done'
238         if (err) {
239           return handleError(res, err);
240         } else {
241           return res.status(201).send(result);
242         }
243       });
244
245     })
246     .catch(function(err) {
247       return handleError(res, err);
248     });
249 };
250
251 // Deletes a mailAccount from the DB.
252 exports.destroy = function(req, res, next) {
253   MailAccount
254     .findById(req.params.id)
255     .then(function(mailAccount) {
256       if (!mailAccount) {
257         return res.sendStatus(404);
258       }
259       mailAccount.destroy()
260         .then(function() {
261           return res.sendStatus(204);
262         })
263         .catch(function(err) {
264           return next(err);
265         });
266     })
267     .catch(function(err) {
268       return next(err);
269     });
270 };
271
272 // Deletes a agent from the DB.
273 exports.bulkDestroy = function(req, res) {
274   MailAccount
275     .destroy({
276       where: {
277         id: req.query.id
278       },
279       individualHooks: true
280     })
281     .then(function() {
282       return res.sendStatus(204);
283     })
284     .catch(function(err) {
285       return handleError(res, err);
286     });
287 };
288
289 function handleError(res, err) {
290   return res.status(500).send(err);
291 }