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