Built motion from commit 5e31ea4.|0.0.32
[motion.git] / server / api / user / user.controller.js
1 'use strict';
2
3 var User = require('../../models').User;
4 var Module = require('../../models').Module;
5 var config = require('../../config/environment');
6
7 var passport = require('passport');
8 var moment = require('moment');
9 var jwt = require('jsonwebtoken');
10 var uploadFile = require('upload-file');
11 var path = require('path');
12 var fs = require('fs');
13 var _ = require('lodash');
14 var util = require('util');
15 var sr = require('simple-random');
16
17 /**
18  * Get list of admin/user
19  */
20 exports.index = function(req, res, next) {
21
22   var attributes = ['fullname', 'name', 'email', 'role'];
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       role: ['admin', 'user']
29     },
30     limit: per_page,
31     offset: page * per_page
32   };
33
34   _.forIn(req.query, function(value, key) {
35     switch (key) {
36       case 'per_page':
37       case 'page':
38         break;
39       case 'sort_by':
40         query.order = util.format('%s %s', req.query.sort_by, req.query.sort_order || 'ASC') || null;
41         break;
42       case 'sort_order':
43         break;
44       case '$':
45         query.where.$or = [];
46         attributes.forEach(function(attribute) {
47           var tmp = {};
48           tmp[attribute] = {
49             $like: '%' + value + '%'
50           };
51
52           query.where.$or.push(tmp);
53         });
54         break;
55       default:
56         query.where[key] = {
57           $like: {}
58         };
59         query.where[key].$like = '%' + value + '%';
60     }
61   });
62
63   User
64     .findAndCountAll(query)
65     .then(function(result) {
66
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       return 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 res.status(500).send({
82         error: 'Something blew up!'
83       });
84     });
85
86 };
87
88 /**
89  * Get list of admin/user/agent
90  */
91 exports.getUsers = function(req, res, next) {
92   User
93     .findAll({
94       where: {
95         role: {
96           $in: ['admin', 'user', 'agent']
97         }
98       }
99     })
100     .then(function(users) {
101       return res.status(200).send(users);
102     })
103     .catch(function(err) {
104       return handleError(res, err);
105     });
106 };
107
108 /**
109  * Creates a new user
110  */
111 exports.create = function(req, res, next) {
112
113   var body = req.body;
114   _(body).keys().sort().each(function(key) {
115     var value = body[key];
116   });
117
118   var newUser = User.build(req.body);
119   newUser.provider = 'local';
120   newUser
121     .save()
122     .then(function(user) {
123       var token = jwt.sign({
124         id: user.id
125       }, config.session.secret, {
126         expiresIn: "5h"
127       });
128       return res.status(201).send({
129         token: token
130       });
131     })
132     .catch(function(err) {
133       return handleError(res, err);
134     });
135 };
136
137 /**
138  * Get a single user
139  */
140 exports.show = function(req, res, next) {
141
142   User
143     .findById(req.params.id)
144     .then(function(user) {
145       if (user) {
146         return res.status(200).send(user);
147       } else {
148         return res.sendStatus(404);
149       }
150     })
151     .catch(function(err) {
152       return handleError(res, err);
153     });
154 };
155
156 /**
157  * Deletes a user
158  */
159 exports.destroy = function(req, res, next) {
160   var userId = req.params.id;
161   // console.log(req.params);
162   // console.log(req.body);
163
164   User
165     .findById(userId)
166     .then(function(user) {
167       if (user) {
168         user
169           .destroy()
170           .then(function(user) {
171             console.log(user);
172             return res.status(200).send(user);
173           })
174           .catch(function(err) {
175             return handleError(res, err);
176           });
177       } else {
178         return res.sendStatus(404);
179       }
180     })
181     .catch(function(err) {
182       return handleError(res, err);
183     });
184 };
185
186 /**
187  * Change a user password
188  */
189 exports.changePassword = function(req, res, next) {
190   var userId = req.user.id;
191   var oldPass = String(req.body.oldPassword);
192   var newPass = String(req.body.newPassword);
193   User
194     .findById(userId)
195     .then(function(user) {
196       if (user.authenticate(oldPass)) {
197         user.password = newPass;
198         user.save()
199           .then(function() {
200             return res.status(200).send(user);
201           })
202           .catch(function(err) {
203             return handleError(res, err);
204           });
205       } else {
206         return res.sendStatus(403);
207       }
208     });
209 };
210
211 /**
212  * Change a user password by admin
213  */
214 exports.resetPassword = function(req, res, next) {
215   var newPass = String(req.body.newPassword);
216   User
217     .findById(req.params.id)
218     .then(function(user) {
219       user.password = newPass;
220       user.save()
221         .then(function() {
222           return res.status(200).send(user);
223         })
224         .catch(function(err) {
225           return handleError(res, err);
226         });
227     });
228 };
229
230 /**
231  * Change the avatar of the user
232  */
233 exports.changeAvatar = function(req, res, next) {
234
235   var upload = new uploadFile({
236     dest: path.join(config.root, 'server', 'files', 'images'),
237     maxNumberOfFiles: 1,
238     minNumberOfFiles: 0,
239     acceptFileTypes: /(\.|\/)(jpeg|png)$/i,
240     rename: function(name, file) {
241       return sr() + path.extname(file.filename);
242       // return 'avatar' + req.params.id + path.extname(file.filename);
243     },
244     messages: {
245       maxNumberOfFiles: "Max number of files upload exceeded",
246       acceptFileTypes: "Only jpeg and png format accepted",
247       // maxFileSize: "The maximum file size is 5 Mb",
248       invalidRequest: "Invalid request"
249     }
250   });
251
252   upload.on('end', function(fields, files) {
253     if (!files.file.filename) {
254       return res.status(500).send(upload);
255     } else {
256       User
257         .findById(req.params.id)
258         .then(function(user) {
259           if (user) {
260             user.updateAttributes({
261                 userpic: files.file.filename
262               })
263               .then(function() {
264                 return res.status(200).send(user);
265               })
266               .catch(function(err) {
267                 return handleError(res, err);
268               });
269           } else {
270             return res.sendStatus(404);
271           }
272         })
273         .catch(function(err) {
274           return handleError(res, err);
275         });
276     }
277   });
278
279   upload.on('error', function(err) {
280     console.log('********** Upload error :', err)
281     return handleError(res, err);
282   });
283
284   upload.parse(req);
285 };
286
287
288 /**
289  * Get my info
290  */
291 exports.me = function(req, res, next) {
292   var userId = req.user.id;
293
294   User
295     .findOne({
296       where: {
297         id: userId
298       },
299       attributes: ['id', 'fullname', 'name', 'email', 'role', 'userpic'],
300       include: [Module]
301     })
302     .then(function(user) {
303       if (!user) {
304         return res.sendStatus(401);
305       }
306       return res.status(200).send(user);
307     })
308     .catch(function(err) {
309       return handleError(res, err);
310     });
311 };
312
313 /**
314  * Update my user
315  */
316 exports.update = function(req, res, next) {
317   var userId = req.user.id;
318
319   User
320     .findById(req.params.id)
321     .then(function(user) {
322       if (user) {
323         user
324           .updateAttributes(req.body)
325           .then(function(user) {
326             return res.status(200).send(user);
327           })
328           .catch(function(err) {
329             return handleError(res, err);
330           });
331       } else {
332         return res.sendStatus(500);
333       }
334     })
335     .catch(function(err) {
336       return handleError(res, err);
337     });
338 };
339
340 /**
341  * Get my avatar
342  */
343 exports.getAvatar = function(req, res, next) {
344   // var userId = req.params.id;
345
346   var imgPath = path.join(config.root, 'server', 'files', 'images', req.params.filename);
347
348   fs.exists(imgPath, function(exists) {
349     if (!exists) {
350       imgPath = path.join(config.root, 'server', 'files', 'images', 'userpic.png');
351     }
352
353     return res.sendFile(imgPath);
354   });
355 };
356
357 /**
358  * Get my avatar by id
359  */
360 exports.getAvatarById = function(req, res, next) {
361
362   // console.log('getAvatarById');
363   // console.log(req.params);
364
365   if (req.params.id === 'visitor') {
366     var imgPath = path.join(config.root, 'server', 'files', 'images', 'customer.png');
367
368     fs.exists(imgPath, function(exists) {
369       return res.sendFile(imgPath);
370     });
371
372   } else {
373     User
374       .findById(req.params.id)
375       .then(function(user) {
376         if (user) {
377           var imgPath = path.join(config.root, 'server', 'files', 'images', user.userpic ? user.userpic : 'userpic.png');
378
379           fs.exists(imgPath, function(exists) {
380             if (!exists) {
381               imgPath = path.join(config.root, 'server', 'files', 'images', 'userpic.png');
382             }
383
384             return res.sendFile(imgPath);
385           });
386         } else {
387           return res.sendStatus(500);
388         }
389       })
390       .catch(function(err) {
391         return handleError(res, err);
392       });
393   }
394 };
395
396 // Deletes a agent from the DB.
397 exports.bulkDestroy = function(req, res) {
398   User
399     .destroy({
400       where: {
401         id: req.query.id
402       },
403       individualHooks: true
404     })
405     .then(function() {
406       return res.sendStatus(204);
407     })
408     .catch(function(err) {
409       return handleError(res, err);
410     });
411 };
412
413 exports.userValidation = function(req, res) {
414   var where = {};
415   where[req.params.field] = req.body.value;
416   User
417     .findAndCountAll({
418       where: where
419     })
420     .then(function(result) {
421       if (result.count) {
422         return res.status(200).send({
423           isValid: false,
424           value: req.body.value
425         });
426       }
427       return res.status(200).send({
428         isValid: true,
429         value: req.body.value
430       });
431     })
432     .catch(function(err) {
433       return handleError(res, err);
434     });
435
436 };
437
438 /**
439  * Authentication callback
440  */
441 exports.authCallback = function(req, res, next) {
442   res.redirect('/');
443 };
444
445 function handleError(res, err) {
446   return res.status(500).send(err);
447 }