Skip to content

Commit fa7b46b

Browse files
author
David
committed
oAuth2 support
1 parent e04591a commit fa7b46b

File tree

3 files changed

+43
-21
lines changed

3 files changed

+43
-21
lines changed

lib/apiUrl.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,15 @@
55
qs = require('qs'),
66
protocol = 'https',
77
host = process.env.PIPEDRIVE_API_HOST || 'api.pipedrive.com',
8+
proxyHost = process.env.PIPEDRIVE_API_HOST || 'api-proxy.pipedrive.com',
89
version = process.env.PIPEDRIVE_API_VERSION || 'v1',
910
baseUri = protocol + '://' + host + '/' + version;
1011

1112
module.exports = function apiUrl(path, options, tokenNeeded) {
1213
var queryObj = {};
14+
if(options.useAccessToken)
15+
return protocol + '://' + proxyHost + '/' + path;
16+
1317
if (tokenNeeded) {
1418
queryObj.api_token = options.apiToken;
1519
}
@@ -19,4 +23,4 @@
1923

2024
return baseUri + '/' + path + (_.keys(queryObj).length > 0 ? '?' + qs.stringify(queryObj) : '');
2125
};
22-
})();
26+
})();

lib/rest.js

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,10 @@
3939
requestOptions;
4040

4141
this.options = options || {};
42-
this.options.method = this.options.method || method || 'GET';
42+
this.options.method = this.options.method || method || 'GET';
4343

4444
if(this.options.query) {
45-
query = typeof this.options.query == 'string' ? this.options.query : qs.stringify(this.options.query);
45+
query = typeof this.options.query == 'string' ? this.options.query : qs.stringify(this.options.query);
4646
url += (url.match(/\?/) ? '&' : '?') + query;
4747
}
4848

@@ -55,7 +55,7 @@
5555

5656
_.each(this.options.data, function(value, inputName) {
5757
payload += '--'+boundary+'\r\n'+
58-
'Content-Disposition: form-data;';
58+
'Content-Disposition: form-data;';
5959
if(inputName == 'file_path' && fs.existsSync(value)) {
6060
var parts = value.split(/\/|\\/);
6161
var fileName = parts[parts.length - 1];
@@ -86,6 +86,9 @@
8686
headers['content-type'] = this.options.json ? 'application/json' : 'application/x-www-form-urlencoded';
8787
}
8888

89+
if(options.accessToken)
90+
headers['Authorization'] = 'Bearer ' + options.accessToken;
91+
8992
requestOptions = {
9093
method: method,
9194
maxResponseLength: 10 * 1024 * 1024,
@@ -134,4 +137,4 @@
134137

135138
util.inherits(Request, EventEmitter);
136139

137-
})();
140+
})();

lib/restHandlers.js

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,14 @@
1414

1515
this.options = _.extend({}, defaults, options || {});
1616

17+
this.resolveOptions = function (options) {
18+
options = options || {};
19+
if(this.options.useAccessToken) {
20+
options.accessToken = this.options.apiToken;
21+
}
22+
return options;
23+
};
24+
1725
return this;
1826
}
1927

@@ -82,9 +90,9 @@
8290
// GET /items
8391
RestHandlers.prototype.listItems = function(object, params, callback) {
8492
var self = this,
85-
paramsToSupply = _.extend({}, _.isObject(params) ? params : {}, this.options.apiToken ? { api_token: this.options.apiToken } : {}),
93+
paramsToSupply = _.extend({}, _.isObject(params) ? params : {}, this.options.apiToken && !this.options.useAccessToken ? { api_token: this.options.apiToken } : {}),
8694
dataObject = object == 'authorizations' ? { multipart: false, data: paramsToSupply } : { query: qs.stringify(paramsToSupply) },
87-
req = rest[object == 'authorizations' ? 'post' : 'get'](apiUrl(object, this.options, false), dataObject);
95+
req = rest[object == 'authorizations' ? 'post' : 'get'](apiUrl(object, this.options, false), this.resolveOptions(dataObject));
8896

8997
req.on('complete', function(data, res) {
9098
self.genericResponse('GET', object, data, callback, req, res);
@@ -96,9 +104,9 @@
96104
// GET /items/find
97105
RestHandlers.prototype.findItems = function(object, params, callback) {
98106
var self = this,
99-
paramsToSupply = _.extend({}, _.isObject(params) ? params : {}, this.options.apiToken ? { api_token: this.options.apiToken } : {}),
107+
paramsToSupply = _.extend({}, _.isObject(params) ? params : {}, this.options.apiToken && !this.options.useAccessToken ? { api_token: this.options.apiToken } : {}),
100108
dataObject = { query: qs.stringify(paramsToSupply) },
101-
req = rest.get(apiUrl(object + '/find', this.options, false), dataObject);
109+
req = rest.get(apiUrl(object + '/find', this.options, false), this.resolveOptions(dataObject));
102110

103111
req.on('complete', function(data, res) {
104112
self.genericResponse('GET', object, data, callback, req, res);
@@ -110,9 +118,9 @@
110118
// GET /items/timeline
111119
RestHandlers.prototype.timelineItems = function(object, params, callback) {
112120
var self = this,
113-
paramsToSupply = _.extend({}, _.isObject(params) ? params : {}, this.options.apiToken ? { api_token: this.options.apiToken } : {}),
121+
paramsToSupply = _.extend({}, _.isObject(params) ? params : {}, this.options.apiToken && !this.options.useAccessToken ? { api_token: this.options.apiToken } : {}),
114122
dataObject = { query: qs.stringify(paramsToSupply) },
115-
req = rest.get(apiUrl(object + '/timeline', this.options, false), dataObject);
123+
req = rest.get(apiUrl(object + '/timeline', this.options, false), this.resolveOptions(dataObject));
116124

117125
req.on('complete', function(data, res) {
118126
self.genericResponse('GET', object, data, callback, req, res);
@@ -124,9 +132,9 @@
124132
// GET /searchResults/field
125133
RestHandlers.prototype.searchFields = function(object, params, callback) {
126134
var self = this,
127-
paramsToSupply = _.extend({}, _.isObject(params) ? params : {}, this.options.apiToken ? { api_token: this.options.apiToken } : {}),
135+
paramsToSupply = _.extend({}, _.isObject(params) ? params : {}, this.options.apiToken && !this.options.useAccessToken ? { api_token: this.options.apiToken } : {}),
128136
dataObject = { query: qs.stringify(paramsToSupply) },
129-
req = rest.get(apiUrl(object + '/field', this.options, false), dataObject);
137+
req = rest.get(apiUrl(object + '/field', this.options, false), this.resolveOptions(dataObject));
130138

131139
req.on('complete', function(data, res) {
132140
self.genericResponse('GET', object, data, callback, req, res);
@@ -138,8 +146,9 @@
138146
// GET /items/5
139147
RestHandlers.prototype.getItem = function(object, id, callback, params) {
140148
var self = this,
141-
paramsToSupply = _.extend({}, _.isObject(params) ? params : {}, this.options.apiToken ? { api_token: this.options.apiToken } : {}),
142-
req = rest.get(apiUrl(object + '/' + id, this.options, false), { json: true, query: qs.stringify(paramsToSupply) });
149+
paramsToSupply = _.extend({}, _.isObject(params) ? params : {}, this.options.apiToken && !this.options.useAccessToken ? { api_token: this.options.apiToken } : {}),
150+
dataObject = { json: true, query: qs.stringify(paramsToSupply) },
151+
req = rest.get(apiUrl(object + '/' + id, this.options, false), this.resolveOptions(dataObject));
143152

144153
req.on('complete', function(data, res) {
145154
self.genericResponse('GET', object, data, callback, req, res);
@@ -153,7 +162,8 @@
153162
var self = this,
154163
multipart_objects = ['files'],
155164
multipart = (_.indexOf(multipart_objects, object) != -1),
156-
req = rest.post(apiUrl(object, this.options, true), { json: true, multipart: multipart, data: params });
165+
dataObject = { json: true, multipart: multipart, data: params },
166+
req = rest.post(apiUrl(object, this.options, true), this.resolveOptions(dataObject));
157167

158168
req.on('complete', function(data, res) {
159169
self.genericResponse('POST', object, data, callback, req, res);
@@ -165,7 +175,8 @@
165175
// PUT /items/5
166176
RestHandlers.prototype.editItem = function(itemId, object, params, callback) {
167177
var self = this,
168-
req = rest.put(apiUrl(object + '/' + itemId, this.options, true), { json: true, multipart: false, data: params });
178+
dataObject = { json: true, multipart: false, data: params },
179+
req = rest.put(apiUrl(object + '/' + itemId, this.options, true), this.resolveOptions(dataObject));
169180

170181
req.on('complete', function(data, res) {
171182
self.genericResponse('PUT', object, data, callback, req, res);
@@ -177,7 +188,8 @@
177188
// DELETE /items/5
178189
RestHandlers.prototype.removeItem = function(itemId, object, params, callback) {
179190
var self = this,
180-
req = rest.del(apiUrl(itemId ? object + '/' + itemId : object, this.options, true), { json: true, multipart: false, data: (_.isObject(params) && !_.isFunction(params) ? params : { id: itemId }) });
191+
dataObject = { json: true, multipart: false, data: (_.isObject(params) && !_.isFunction(params) ? params : { id: itemId }) },
192+
req = rest.del(apiUrl(itemId ? object + '/' + itemId : object, this.options, true), this.resolveOptions(dataObject));
181193

182194
req.on('complete', function(data, res) {
183195
self.genericResponse('DELETE', object, data, (_.isFunction(params) ? params : callback), req, res);
@@ -189,7 +201,8 @@
189201
// DELETE /items
190202
RestHandlers.prototype.removeManyItems = function(itemIds, object, params, callback) {
191203
var self = this,
192-
req = rest.del(apiUrl(object, this.options, true), { json: true, multipart: false, data: (_.isObject(params) && !_.isFunction(params) ? params : { ids: itemIds }) });
204+
dataObject = { json: true, multipart: false, data: (_.isObject(params) && !_.isFunction(params) ? params : { ids: itemIds }) },
205+
req = rest.del(apiUrl(object, this.options, true), this.resolveOptions(dataObject));
193206

194207
req.on('complete', function(data, res) {
195208
self.genericResponse('DELETE', object, data, (_.isFunction(params) ? params : callback), req, res);
@@ -205,7 +218,8 @@
205218
return false;
206219
}
207220
var self = this,
208-
req = rest.post(apiUrl(object + '/' + whichId + '/merge', this.options, true), { json: true, multipart: false, data: { merge_with_id: withId } });
221+
dataObject = { json: true, multipart: false, data: { merge_with_id: withId } },
222+
req = rest.post(apiUrl(object + '/' + whichId + '/merge', this.options, true), this.resolveOptions(dataObject));
209223

210224
req.on('complete', function(data, res) {
211225
self.genericResponse('POST', object, data, callback, req, res);
@@ -220,7 +234,8 @@
220234
}
221235

222236
var self = this,
223-
req = rest.post(apiUrl(object + '/' + whichId + '/duplicate', this.options, true), { json: true, multipart: false, data: {} });
237+
dataObject = { json: true, multipart: false, data: {} },
238+
req = rest.post(apiUrl(object + '/' + whichId + '/duplicate', this.options, true), this.resolveOptions(dataObject));
224239

225240
req.on('complete', function(data, res) {
226241
self.genericResponse('POST', object, data, callback, req, res);

0 commit comments

Comments
 (0)