-
Notifications
You must be signed in to change notification settings - Fork 531
/
Copy pathVersion.js
186 lines (164 loc) · 4.44 KB
/
Version.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
'use strict';
var _ = require('lodash');
var RestException = require('./RestException');
/**
* @constructor
*
* @description Base version object
*
* @param {Domain} domain twilio domain
* @param {Version} version api version
*/
function Version(domain, version) {
this._domain = domain;
this._version = version;
}
/**
* Generate absolute url from a uri
*
* @param {string} uri uri to transform
* @return {string} transformed url
*/
Version.prototype.absoluteUrl = function(uri) {
return this._domain.absoluteUrl(this.relativeUrl(uri));
};
/**
* Generate relative url from a uri
*
* @param {string} uri uri to transform
* @return {string} transformed url
*/
Version.prototype.relativeUrl = function(uri) {
return _.trim(this._version, '/') + '/' + _.trim(uri, '/');
};
/**
* Make a request against the domain
*
* @param {object} opts request options
* @return {Promise} promise that resolves to request response
*/
Version.prototype.request = function(opts) {
return this._domain.request(_.assign({}, opts, {
uri: this.relativeUrl(opts.uri),
}));
};
/**
* Fetch a instance of a record
* @throws {Error} If response returns non 2xx or 3xx status code
*
* @param {object} opts request options
* @return {Promise} promise that resolves to fetched result
*/
Version.prototype.fetch = function(opts) {
var qResponse = this.request(opts);
qResponse = qResponse.then(
function success(response) {
if (response.statusCode < 200 || response.statusCode >= 400) {
throw new RestException(response);
}
if (typeof response.body === 'string') {
return JSON.parse(response.body);
}
return response.body;
}
);
return qResponse;
};
/**
* Update a record
* @throws {Error} If response returns non 2xx status code
*
* @param {object} opts request options
* @return {Promise} promise that resolves to updated result
*/
Version.prototype.update = function(opts) {
var qResponse = this.request(opts);
qResponse = qResponse.then(
function success(response) {
if (response.statusCode < 200 || response.statusCode >= 300) {
throw new RestException(response);
}
if (typeof response.body === 'string') {
return JSON.parse(response.body);
}
return response.body;
}
);
return qResponse;
};
/**
* Delete a record
* @throws {Error} If response returns a 5xx status
*
* @param {object} opts request options
* @return {Promise} promise that resolves to true if record was deleted
*/
Version.prototype.remove = function(opts) {
var qResponse = this.request(opts);
qResponse = qResponse.then(
function success(response) {
if (response.statusCode < 200 || response.statusCode >= 300) {
throw new RestException(response);
}
return response.statusCode === 204;
}
);
return qResponse;
};
/**
* Create a new record
* @throws {Error} If response returns non 2xx or 201 status code
*
* @param {object} opts request options
* @return {Promise} promise that resolves to created record
*/
Version.prototype.create = function(opts) {
var qResponse = this.request(opts);
qResponse = qResponse.then(
function success(response) {
if (response.statusCode < 200 || response.statusCode >= 300) {
throw new RestException(response);
}
if (typeof response.body === 'string') {
return JSON.parse(response.body);
}
return response.body;
}
);
return qResponse;
};
/**
* Fetch a page of records
*
* @param {object} opts request options
* @return {Promise} promise that resolves to page of records
*/
Version.prototype.page = function(opts) {
return this.request(opts);
};
/**
* Process limits for list requests
*
* @param {object} [opts] ...
* @param {number} [opts.limit] The maximum number of items to fetch
* @param {number} [opts.pageSize] The maximum number of items to return
* with every request
*/
Version.prototype.readLimits = function(opts) {
var limit = opts.limit;
var pageSize = opts.pageSize;
if (!_.isNil(limit) && (!_.isFinite(limit) || limit <= 0)) {
throw new TypeError('Parameter limit must be a positive integer');
}
if (!_.isNil(pageSize) && (!_.isFinite(pageSize) || pageSize <= 0)) {
throw new TypeError('Parameter pageSize must be a positive integer');
}
if (limit && !pageSize) {
pageSize = limit;
}
return {
limit: limit,
pageSize: pageSize
};
};
module.exports = Version;