Built motion from commit 06df96e on branch develop.
[motion.git] / server / api / mail_room / mail_room.controller.js
1 'use strict';
2
3 var _ = require('lodash');
4 var util = require('util');
5
6 var User = require('../../models').User;
7 var Contact = require('../../models').Contact;
8 var MailRoom = require('../../models').MailRoom;
9 var MailMessage = require('../../models').MailMessage;
10 var MailAccount = require('../../models').MailAccount;
11 var MailAttachment = require('../../models').MailAttachment;
12
13 // Get list of mailRooms
14 exports.index = function(req, res, next) {
15
16   var attributes = ['subject', 'from', 'status'];
17   var per_page = req.query.per_page ? parseInt(req.query.per_page, 10) : 100;
18   var page = req.query.page ? parseInt(req.query.page, 10) : 0;
19
20   var query = {
21     where: {},
22     limit: per_page,
23     offset: page * per_page,
24     include: [{
25       all: true
26     }]
27   };
28
29   _.forIn(req.query, function(value, key) {
30     switch (key) {
31       case 'per_page':
32       case 'page':
33         break;
34       case 'sort_by':
35         query.order = util.format('%s %s', req.query.sort_by, req.query.sort_order || 'ASC') || null;
36         break;
37       case 'sort_order':
38         break;
39       case '$':
40         query.where.$or = [];
41         attributes.forEach(function(attribute) {
42           var tmp = {};
43           tmp[attribute] = {
44             $like: '%' + value + '%'
45           };
46
47           query.where.$or.push(tmp);
48         });
49         break;
50       default:
51         query.where[key] = {
52           $like: {}
53         };
54         query.where[key].$like = '%' + value + '%';
55     }
56   });
57
58
59   MailRoom
60     .findAndCountAll(query)
61     .then(function(result) {
62       var total_pages = Math.ceil(result.count / per_page);
63       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;
64       var previous_page = page > 0 ? util.format('%s://%s%s?page=%d', req.protocol, req.headers.host, req.baseUrl, page - 1) : null;
65
66       res.status(200).send({
67         count: result.count,
68         mailRooms: result.rows,
69         next_page: next_page,
70         previous_page: previous_page,
71         total_pages: total_pages
72       });
73
74     })
75     .catch(function(err) {
76       return next(err);
77     });
78 };
79
80 // Get list of agent mailRooms
81 exports.agentIndex = function(req, res, next) {
82   MailRoom
83     .findAll({
84       where: {
85         UserId: req.params.id
86       },
87       include: [{
88         all: true
89       }]
90     })
91     .then(function(mailRooms) {
92       return res.status(200).send(mailRooms);
93     })
94     .catch(function(err) {
95       return next(err);
96     });
97 };
98
99 // Get a single mailRoom
100 exports.show = function(req, res, next) {
101   MailRoom
102     .findById(req.params.id, {
103       include: [{
104         model: MailMessage,
105         include: [{
106           all: true
107         }]
108       }, {
109         model: MailAccount
110       }]
111     })
112     .then(function(mailRoom) {
113       if (!mailRoom) {
114         return res.sendStatus(404);
115       }
116
117       return res.send(mailRoom);
118     })
119     .catch(function(err) {
120       return next(err);
121     });
122 };
123
124 // Creates a new mailRoom in the DB.
125 exports.create = function(req, res, next) {
126   MailRoom
127     .create(req.body)
128     .then(function(mailRoom) {
129       return res.status(201).send(mailRoom);
130     })
131     .catch(function(err) {
132       return next(err);
133     });
134 };
135
136 // Updates an existing mailRoom in the DB.
137 exports.update = function(req, res, next) {
138   MailRoom
139     .findById(req.params.id)
140     .then(function(mailRoom) {
141       if (!mailRoom) {
142         return res.sendStatus(404);
143       }
144
145       // CHECK IF MAIL IS ALREADY ASSIGNED
146       if (mailRoom.jobId) {
147         return next(new Error('Mail already assigned'));
148       }
149
150       var updated = _.merge(mailRoom, req.body);
151       updated
152         .save()
153         .then(function() {
154           return res.status(200).send(mailRoom);
155         })
156         .catch(function(err) {
157           return next(err);
158         });
159     })
160     .catch(function(err) {
161       return next(err);
162     });
163 };
164
165 // Deletes a mailRoom from the DB.
166 exports.destroy = function(req, res, next) {
167   MailRoom
168     .findById(req.params.id)
169     .then(function(mailRoom) {
170       if (!mailRoom) {
171         return res.sendStatus(404);
172       }
173       mailRoom.destroy()
174         .then(function() {
175           return res.sendStatus(204);
176         })
177         .catch(function(err) {
178           return next(err);
179         });
180     })
181     .catch(function(err) {
182       return next(err);
183     });
184 };
185
186 // Deletes a agent from the DB.
187 exports.bulkDestroy = function(req, res) {
188   MailRoom
189     .destroy({
190       where: {
191         id: req.query.id
192       },
193       individualHooks: true
194     })
195     .then(function() {
196       return res.sendStatus(200);
197     })
198     .catch(function(err) {
199       return handleError(res, err);
200     });
201 };
202
203 function handleError(res, err) {
204   return res.status(500).send(err);
205 }