Built motion from commit 4143fce.|0.0.15
[motion.git] / server / api / desk_account / desk_account.controller.js
1 'use strict';
2
3 var _ = require('lodash');
4 var util = require('util');
5 var desk = require('desk.js');
6
7 var DeskAccount = require('../../models').DeskAccount;
8
9 // Get list of desk_accounts
10 exports.index = function(req, res) {
11   var attributes = ['description', 'name', 'username', 'remoteUri'];
12   var per_page = req.query.per_page ? parseInt(req.query.per_page, 10) : 100;
13   var page = req.query.page ? parseInt(req.query.page, 10) : 0;
14
15   var query = {
16     where: {},
17     limit: per_page,
18     offset: page * per_page
19   };
20
21   _.forIn(req.query, function(value, key) {
22     switch (key) {
23       case 'per_page':
24       case 'page':
25         break;
26       case 'sort_by':
27         query.order = util.format('%s %s', req.query.sort_by, req.query.sort_order || 'ASC') || null;
28         break;
29       case 'sort_order':
30         break;
31       case '$':
32         query.where.$or = [];
33         attributes.forEach(function(attribute) {
34           var tmp = {};
35           tmp[attribute] = {
36             $like: '%' + value + '%'
37           };
38
39           query.where.$or.push(tmp);
40         });
41         break;
42       default:
43         query.where[key] = {
44           $like: {}
45         };
46         query.where[key].$like = '%' + value + '%';
47     }
48   });
49
50   DeskAccount
51     .findAndCountAll(query)
52     .then(function(result) {
53
54       var total_pages = Math.ceil(result.count / per_page);
55       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;
56       var previous_page = page > 0 ? util.format('%s://%s%s?page=%d', req.protocol, req.headers.host, req.baseUrl, page - 1) : null;
57
58       return res.status(200).send({
59         count: result.count,
60         rows: result.rows,
61         next_page: next_page,
62         previous_page: previous_page,
63         total_pages: total_pages
64       });
65
66     })
67     .catch(function(err) {
68       return res.status(500).send({
69         error: 'Something blew up!'
70       });
71     });
72 };
73
74 // Get a single desk_account
75 exports.show = function(req, res) {
76   DeskAccount
77     .findById(req.params.id)
78     .then(function(desk_account) {
79       if (!desk_account) {
80         return res.sendStatus(404);
81       }
82       return res.send(desk_account);
83     })
84     .catch(function(err) {
85       return handleError(res, err);
86     });
87 };
88
89 // Creates a new desk_account in the DB.
90 exports.create = function(req, res, next) {
91   DeskAccount
92     .create(req.body)
93     .then(function(desk_account) {
94       return res.status(201).send(desk_account);
95     })
96     .catch(function(err) {
97       return handleError(res, err);
98     });
99 };
100
101 // Updates an existing desk_account in the DB.
102 exports.update = function(req, res) {
103   if (req.body.id) {
104     delete req.body.id;
105   }
106   DeskAccount
107     .findById(req.params.id)
108     .then(function(desk_account) {
109       if (!desk_account) {
110         return res.sendStatus(404);
111       }
112       var updated = _.merge(desk_account, req.body);
113       updated.save()
114         .then(function() {
115           return res.status(200).send(desk_account);
116         })
117         .catch(function(err) {
118           return handleError(res, err);
119         });
120     })
121     .catch(function(err) {
122       return handleError(res, err);
123     });
124 };
125
126 // Deletes a desk_account from the DB.
127 exports.destroy = function(req, res) {
128   DeskAccount
129     .findById(req.params.id)
130     .then(function(desk_account) {
131       if (!desk_account) {
132         return res.sendStatus(404);
133       }
134       desk_account.destroy()
135         .then(function() {
136           return res.sendStatus(204);
137         })
138         .catch(function(err) {
139           return handleError(res, err);
140         });
141     })
142     .catch(function(err) {
143       return handleError(res, err);
144     });
145 };
146
147 exports.checkAccount = function(req, res) {
148   DeskAccount
149     .findById(req.params.id)
150     .then(function(account) {
151       var desk_account = {
152         endpoint: stripTrailingSlash(account.remoteUri),
153         retry: false
154       };
155       if (account.authType === 'basic') {
156         desk_account.username = account.username;
157         desk_account.password = account.password;
158       } else if (account.authType === 'oauth') {
159         desk_account.consumerKey = account.consumerKey;
160         desk_account.consumerSecret = account.consumerSecret;
161         desk_account.token = account.token;
162         desk_account.tokenSecret = account.tokenSecret;
163       }
164       var client = desk.createClient(desk_account);
165       client.get('/api/v2/users/me', function(err, body, response) {
166         if (err) {
167           return handleError(res, err);
168         }
169         return res.sendStatus(200);
170       });
171     })
172     .catch(function(err) {
173       return handleError(res, err);
174     });
175 };
176
177 exports.deskValidation = function(req, res) {
178   var where = {};
179   where[req.params.field] = req.body.value;
180   DeskAccount
181     .findAndCountAll({
182       where: where
183     })
184     .then(function(result) {
185       if (result.count) {
186         return res.status(200).send({
187           isValid: false,
188           value: req.body.value
189         });
190       }
191       return res.status(200).send({
192         isValid: true,
193         value: req.body.value
194       });
195     })
196     .catch(function(err) {
197       return handleError(res, err);
198     });
199 };
200
201 exports.getFields = function(req, res) {
202   DeskAccount
203     .findById(req.params.id)
204     .then(function(account) {
205       var desk_account = {
206         endpoint: stripTrailingSlash(account.remoteUri),
207         retry: false
208       };
209       if (account.authType === 'basic') {
210         desk_account.username = account.username;
211         desk_account.password = account.password;
212       } else if (account.authType === 'oauth') {
213         desk_account.consumerKey = account.consumerKey;
214         desk_account.consumerSecret = account.consumerSecret;
215         desk_account.token = account.token;
216         desk_account.tokenSecret = account.tokenSecret;
217       }
218       var client = desk.createClient(desk_account);
219       client.get('/api/v2/custom_fields', function(err, body, response) {
220         if (err) {
221           return handleError(res, err);
222         }
223         return res.status(200).json(body._embedded.entries);
224       });
225     })
226     .catch(function(err) {
227       return handleError(res, err);
228     });
229 }
230
231 exports.bulkDestroy = function(req, res) {
232   DeskAccount
233     .destroy({
234       where: {
235         id: req.query.id
236       },
237       individualHooks: true
238     })
239     .then(function() {
240       return res.sendStatus(204);
241     })
242     .catch(function(err) {
243       return handleError(res, err);
244     });
245 };
246
247 function stripTrailingSlash(str) {
248   if (str.substr(-1) === '/') {
249     return str.substr(0, str.length - 1);
250   }
251   return str;
252 }
253
254 function handleError(res, err) {
255   return res.status(500).send(err);
256 }