Built motion from commit 06df96e on branch develop.
[motion.git] / server / api / mail_message / mail_message.controller.js
1 'use strict';
2
3 var _ = require('lodash');
4 var async = require('async');
5
6 var htmlToText = require('html-to-text');
7 var formidable = require('formidable');
8 var path = require('path');
9
10 var config = require('../../config/environment');
11 var sequelize = require('../../models').sequelize;
12 var MailMessage = require('../../models').MailMessage;
13 var MailAccount = require('../../models').MailAccount;
14 var MailAttachment = require('../../models').MailAttachment;
15 var MailRoom = require('../../models').MailRoom;
16 var MailAccount = require('../../models').MailAccount;
17 var Contact = require('../../models').Contact;
18
19 var smtp = require('../../config/smtp')();
20
21 // Get list of mail_messages
22 exports.index = function(req, res, next) {
23   var params;
24
25   switch (req.user.role) {
26     case 'admin':
27       params = {
28         where: req.query,
29         order: 'createdAt DESC',
30         include: [{
31           model: Contact,
32           as: 'From'
33         }, {
34           model: Contact,
35           as: 'To'
36         }, {
37           model: Contact,
38           as: 'Cc'
39         }, {
40           model: MailRoom,
41           where: {
42             UserId: req.user.id
43           },
44           include: [{
45             model: MailAccount
46           }]
47         }]
48       }
49
50       break;
51     case 'agent':
52
53       params = {
54         order: 'createdAt DESC',
55         include: [{
56           model: MailRoom,
57           include: [{
58             model: MailAccount
59           }]
60         }]
61       }
62       break;
63     default:
64
65   }
66
67   MailMessage
68     .findAll(params)
69     .then(function(mail_messages) {
70       return res.status(200).send(mail_messages);
71     })
72     .catch(function(err) {
73       return handleError(res, err, next);
74     });
75 };
76
77 // Get a single mail_message
78 exports.show = function(req, res, next) {
79   MailMessage
80     .findById(req.params.id, {
81       include: [{
82         model: Contact,
83         as: 'From'
84       }, {
85         model: Contact,
86         as: 'To'
87       }, {
88         model: Contact,
89         as: 'Cc'
90       }, {
91         model: MailRoom,
92         include: [{
93           model: MailAccount
94         }]
95       }]
96     })
97     .then(function(mail_message) {
98       if (!mail_message) {
99         return res.sendStatus(404);
100       }
101       return res.send(mail_message);
102     })
103     .catch(function(err) {
104       return handleError(res, err, next);
105     });
106 };
107
108 // Creates a new mail_message in the DB.
109 exports.create = function(req, res, next) {
110   console.log(req.body);
111   // 1) Messaggio in uscita
112   var form = new formidable.IncomingForm();
113   form.uploadDir = path.join(config.root, 'server', 'files', 'attachments');
114   form.keepExtensions = true;
115   form.multiples = true;
116
117   if (_.isEmpty(req.body)) {
118     // ATTACHMENT
119     form.parse(req, function(err, form, wrap) {
120       if (err) {
121         return next(err);
122       }
123
124       var file = wrap.file;
125
126       return sequelize
127         .transaction()
128         .then(function(t) {
129           async.waterfall([
130             function(wcallback) {
131               return MailAttachment
132                 .create({
133                   filePath: file.path,
134                   fileName: file.name,
135                   length: file.size,
136                   contentType: file.type
137                 }, {
138                   transaction: t
139                 })
140                 .then(function(mailAttachment) {
141                   wcallback(null, mailAttachment);
142                 })
143                 .catch(function(err) {
144                   wcallback(err);
145                 });
146             },
147             function(mailAttachment, wcallback) {
148               smtp.send(form, mailAttachment, t, function(err, res) {
149                 wcallback(err, res);
150               });
151             },
152           ], function(err, mailMessage) {
153             if (err) {
154               console.log(err);
155               t.rollback();
156               return res.status(404).send(err);
157             } else {
158               console.log(mailMessage);
159               t.commit();
160               return res.status(201).send(mailMessage);
161             }
162           });
163         });
164     });
165   } else {
166     // NO ATTACHMENT
167     return sequelize
168       .transaction()
169       .then(function(t) {
170         async.waterfall([
171           function(wcallback) {
172             smtp.send(req.body, null, t, function(err, res) {
173               wcallback(err, res);
174             });
175           }
176         ], function(err, mailMessage) {
177           if (err) {
178             console.log('err', err);
179             t.rollback();
180             return res.status(404).send(err);
181           } else {
182             console.log('commmit', mailMessage);
183             t.commit();
184             return res.status(201).send(mailMessage);
185           }
186         });
187       });
188   }
189 };
190
191 // Updates an existing mail_message in the DB.
192 exports.update = function(req, res, next) {
193
194   MailMessage
195     .findById(req.params.id, {
196       include: [{
197         all: true
198       }]
199     })
200     .then(function(mail_message) {
201       if (!mail_message) {
202         return res.sendStatus(404);
203       }
204       var updated = _.merge(mail_message, req.body);
205       updated.save()
206         .then(function() {
207           return res.status(200).send(updated);
208         })
209         .catch(function(err) {
210           return handleError(res, err, next);
211         });
212     })
213     .catch(function(err) {
214       return handleError(res, err, next);
215     });
216 };
217
218 // Deletes a mail_message from the DB.
219 exports.destroy = function(req, res, next) {
220   MailMessage
221     .findById(req.params.id)
222     .then(function(mail_message) {
223       if (!mail_message) {
224         return res.sendStatus(404);
225       }
226       mail_message.destroy()
227         .then(function() {
228           return res.sendStatus(204);
229         })
230         .catch(function(err) {
231           return handleError(res, err, next);
232         });
233     })
234     .catch(function(err) {
235       return handleError(res, err, next);
236     });
237 };
238
239 // Deletes a mail_message from the DB.
240 exports.bulkDelete = function(req, res, next) {
241   MailMessage
242     .bulkUpdate({
243       where: {
244         id: {
245           $in: req.body.id
246         }
247       },
248       attributes: {
249         directory: 'TRASH'
250       }
251     })
252     .then(function(mail_message) {
253       if (!mail_message) {
254         return res.sendStatus(404);
255       }
256       mail_message.destroy()
257         .then(function() {
258           return res.sendStatus(204);
259         })
260         .catch(function(err) {
261           return handleError(res, err, next);
262         });
263     })
264     .catch(function(err) {
265       return handleError(res, err, next);
266     });
267 };
268
269 function handleError(res, err, next) {
270   return next(err);
271 }