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