1 | var _ = require('lodash');
|
2 | var rsvp = require('rsvp');
|
3 | var Promise = rsvp.Promise;
|
4 | var check = require('check-types');
|
5 | var verify = check.verify;
|
6 | var param = encodeURIComponent;
|
7 |
|
8 | function TenantClient(restClient, tenant, cache, scopes) {
|
9 | verify.object(restClient);
|
10 | verify.object(tenant);
|
11 | verify.object(cache);
|
12 | verify.maybe.array(scopes);
|
13 | this._client = restClient;
|
14 | this._tenant = tenant;
|
15 | this._cache = cache;
|
16 | this._scopes = scopes || [];
|
17 | }
|
18 |
|
19 | TenantClient.prototype.getEmoticons = function (options) {
|
20 | var self = this;
|
21 | var resourceUrl = this._tenant.links.api + '/emoticon';
|
22 | return self.getToken('view_group').then(function (token) {
|
23 | return self._client.getEmoticons(resourceUrl, token, options);
|
24 | });
|
25 | };
|
26 |
|
27 | TenantClient.prototype.getEmoticon = function (emoticonIdOrShortcut, options) {
|
28 | var self = this;
|
29 | exports.verifyNumberOrString('emoticonIdOrShortcut', emoticonIdOrShortcut);
|
30 | var resourceUrl = this._tenant.links.api + '/emoticon/' + param(emoticonIdOrShortcut);
|
31 | return self.getToken('view_group').then(function (token) {
|
32 | return self._client.getEmoticon(resourceUrl, token, options);
|
33 | });
|
34 | };
|
35 |
|
36 | TenantClient.prototype.deleteSession = function (sessionId) {
|
37 | var self = this;
|
38 | verify.string(sessionId);
|
39 | var resourceUrl = this._tenant.links.api + '/oauth/token/' + param(sessionId);
|
40 | return self._client.deleteSession(resourceUrl, sessionId);
|
41 | };
|
42 |
|
43 | TenantClient.prototype.getSession = function (sessionId) {
|
44 | var self = this;
|
45 | verify.string(sessionId);
|
46 | var resourceUrl = this._tenant.links.api + '/oauth/token/' + param(sessionId);
|
47 | return self._client.getSession(resourceUrl, sessionId);
|
48 | };
|
49 |
|
50 | TenantClient.prototype.getToken = function () {
|
51 | var self = this;
|
52 | var scopes = [].slice.call(arguments);
|
53 | if (scopes.length === 0) {
|
54 | throw new Error('At least one scope is required when generating a token');
|
55 | }
|
56 | self._ensureScopes(scopes);
|
57 | var cacheKey = (scopes || []).join('|');
|
58 | return self._cache.get(cacheKey).then(function (tokenData) {
|
59 | if (tokenData) return tokenData;
|
60 | var tokenUrl = self._tenant.links.token;
|
61 | var username = self._tenant.id;
|
62 | var password = self._tenant.secret;
|
63 | return self._client.generateToken(tokenUrl, username, password, scopes).then(function (freshTokenData) {
|
64 | return self._cache.set(cacheKey, freshTokenData, freshTokenData.expires_in - 60).then(function () {
|
65 | return freshTokenData;
|
66 | });
|
67 | });
|
68 | }).then(function (tokenData) {
|
69 | return tokenData.access_token;
|
70 | });
|
71 | };
|
72 |
|
73 | TenantClient.prototype.getRoomMessage = function (roomIdOrName, messageId, options) {
|
74 | var self = this;
|
75 | exports.verifyNumberOrString('roomIdOrName', roomIdOrName);
|
76 | verify.string(messageId);
|
77 | var resourceUrl = this._tenant.links.api + '/room/' + param(roomIdOrName) + '/history/' + param(messageId);
|
78 | return self.getToken('view_messages').then(function (token) {
|
79 | return self._client.getRoomMessage(resourceUrl, token, options);
|
80 | });
|
81 | };
|
82 |
|
83 |
|
84 |
|
85 | TenantClient.prototype.createRoom = function (room, options) {
|
86 | var self = this;
|
87 | verify.object(room);
|
88 | var resourceUrl = this._tenant.links.api + '/room';
|
89 | return self.getToken('manage_rooms').then(function (token) {
|
90 | return self._client.createRoom(resourceUrl, token, room);
|
91 | });
|
92 | };
|
93 |
|
94 | TenantClient.prototype.getRooms = function (options) {
|
95 | var self = this;
|
96 | var resourceUrl = this._tenant.links.api + '/room';
|
97 | return self.getToken('view_group').then(function (token) {
|
98 | return self._client.getRooms(resourceUrl, token, options);
|
99 | });
|
100 | };
|
101 |
|
102 | TenantClient.prototype.getRecentRoomHistory = function (roomIdOrName, options) {
|
103 | var self = this;
|
104 | exports.verifyNumberOrString('roomIdOrName', roomIdOrName);
|
105 | var resourceUrl = this._tenant.links.api + '/room/' + param(roomIdOrName) + '/history/latest';
|
106 | return self.getToken('view_messages').then(function (token) {
|
107 | return self._client.getRecentRoomHistory(resourceUrl, token, options);
|
108 | });
|
109 | };
|
110 |
|
111 | TenantClient.prototype.sendNotification = function (roomIdOrName, message, options) {
|
112 | var self = this;
|
113 | exports.verifyNumberOrString('roomIdOrName', roomIdOrName);
|
114 | verify.string(message);
|
115 | var resourceUrl = this._tenant.links.api + '/room/' + param(roomIdOrName) + '/notification';
|
116 | return self.getToken('send_notification').then(function (token) {
|
117 | return self._client.sendNotification(resourceUrl, token, message, options);
|
118 | });
|
119 | };
|
120 |
|
121 | TenantClient.prototype.updateRoom = function (roomIdOrName, room) {
|
122 | var self = this;
|
123 | exports.verifyNumberOrString('roomIdOrName', roomIdOrName);
|
124 | verify.object(room);
|
125 | var resourceUrl = this._tenant.links.api + '/room/' + param(roomIdOrName);
|
126 | return self.getToken('admin_room').then(function (token) {
|
127 | return self._client.updateRoom(resourceUrl, token, room);
|
128 | });
|
129 | };
|
130 |
|
131 | TenantClient.prototype.getRoom = function (roomIdOrName, options) {
|
132 | var self = this;
|
133 | exports.verifyNumberOrString('roomIdOrName', roomIdOrName);
|
134 | var resourceUrl = this._tenant.links.api + '/room/' + param(roomIdOrName);
|
135 | return self.getToken('view_group').then(function (token) {
|
136 | return self._client.getRoom(resourceUrl, token, options);
|
137 | });
|
138 | };
|
139 |
|
140 | TenantClient.prototype.deleteRoom = function (roomIdOrName) {
|
141 | var self = this;
|
142 | exports.verifyNumberOrString('roomIdOrName', roomIdOrName);
|
143 | var resourceUrl = this._tenant.links.api + '/room/' + param(roomIdOrName);
|
144 | return self.getToken('manage_rooms').then(function (token) {
|
145 | return self._client.deleteRoom(resourceUrl, token);
|
146 | });
|
147 | };
|
148 |
|
149 | TenantClient.prototype.createRoomWebhook = TenantClient.prototype.createWebhook = function (roomIdOrName, webhook) {
|
150 | var self = this;
|
151 | exports.verifyNumberOrString('roomIdOrName', roomIdOrName);
|
152 | verify.object(webhook);
|
153 | var resourceUrl = this._tenant.links.api + '/room/' + param(roomIdOrName) + '/webhook';
|
154 | return self.getToken('admin_room').then(function (token) {
|
155 | return self._client.createRoomWebhook(resourceUrl, token, webhook);
|
156 | });
|
157 | };
|
158 |
|
159 | TenantClient.prototype.getRoomWebhooks = TenantClient.prototype.getWebhooks = function (roomIdOrName, options) {
|
160 | var self = this;
|
161 | exports.verifyNumberOrString('roomIdOrName', roomIdOrName);
|
162 | var resourceUrl = this._tenant.links.api + '/room/' + param(roomIdOrName) + '/webhook';
|
163 | return self.getToken('admin_room').then(function (token) {
|
164 | return self._client.getRoomWebhooks(resourceUrl, token, options);
|
165 | });
|
166 | };
|
167 |
|
168 | TenantClient.prototype.getRoomStatistics = function (roomIdOrName, options) {
|
169 | var self = this;
|
170 | exports.verifyNumberOrString('roomIdOrName', roomIdOrName);
|
171 | var resourceUrl = this._tenant.links.api + '/room/' + param(roomIdOrName) + '/statistics';
|
172 | return self.getToken('view_group').then(function (token) {
|
173 | return self._client.getRoomStatistics(resourceUrl, token, options);
|
174 | });
|
175 | };
|
176 |
|
177 | TenantClient.prototype.replyToMessage = function (roomIdOrName, parentMessageId, message) {
|
178 | var self = this;
|
179 | exports.verifyNumberOrString('roomIdOrName', roomIdOrName);
|
180 | var resourceUrl = this._tenant.links.api + '/room/' + param(roomIdOrName) + '/reply';
|
181 | return self.getToken('send_message').then(function (token) {
|
182 | return self._client.replyToMessage(resourceUrl, token, parentMessageId, message);
|
183 | });
|
184 | };
|
185 |
|
186 | TenantClient.prototype.getRoomMembers = function (roomIdOrName, options) {
|
187 | var self = this;
|
188 | exports.verifyNumberOrString('roomIdOrName', roomIdOrName);
|
189 | var resourceUrl = this._tenant.links.api + '/room/' + param(roomIdOrName) + '/member';
|
190 | return self.getToken('view_room').then(function (token) {
|
191 | return self._client.getRoomMembers(resourceUrl, token, options);
|
192 | });
|
193 | };
|
194 |
|
195 | TenantClient.prototype.setRoomTopic = function (roomIdOrName, topic) {
|
196 | var self = this;
|
197 | exports.verifyNumberOrString('roomIdOrName', roomIdOrName);
|
198 | var resourceUrl = this._tenant.links.api + '/room/' + param(roomIdOrName) + '/topic';
|
199 | return self.getToken('admin_room').then(function (token) {
|
200 | return self._client.setRoomTopic(resourceUrl, token, topic);
|
201 | });
|
202 | };
|
203 |
|
204 | TenantClient.prototype.shareLinkWithRoom = function (roomIdOrName, link, message) {
|
205 | var self = this;
|
206 | exports.verifyNumberOrString('roomIdOrName', roomIdOrName);
|
207 | var resourceUrl = this._tenant.links.api + '/room/' + param(roomIdOrName) + '/share/link';
|
208 | return self.getToken('send_message').then(function (token) {
|
209 | return self._client.shareLinkWithRoom(resourceUrl, token, link, message);
|
210 | });
|
211 | };
|
212 |
|
213 | TenantClient.prototype.addRoomMember = function (roomIdOrName, userIdOrEmail) {
|
214 | var self = this;
|
215 | exports.verifyNumberOrString('roomIdOrName', roomIdOrName);
|
216 | exports.verifyNumberOrString('userIdOrEmail', userIdOrEmail);
|
217 | var resourceUrl = this._tenant.links.api + '/room/' + param(roomIdOrName) + '/member/' + param(userIdOrEmail);
|
218 | return self.getToken('admin_room').then(function (token) {
|
219 | return self._client.addRoomMember(resourceUrl, token);
|
220 | });
|
221 | };
|
222 |
|
223 | TenantClient.prototype.removeRoomMember = function (roomIdOrName, userIdOrEmail) {
|
224 | var self = this;
|
225 | exports.verifyNumberOrString('roomIdOrName', roomIdOrName);
|
226 | exports.verifyNumberOrString('userIdOrEmail', userIdOrEmail);
|
227 | var resourceUrl = this._tenant.links.api + '/room/' + param(roomIdOrName) + '/member/' + param(userIdOrEmail);
|
228 | return self.getToken('admin_room').then(function (token) {
|
229 | return self._client.removeRoomMember(resourceUrl, token);
|
230 | });
|
231 | };
|
232 |
|
233 | TenantClient.prototype.deleteRoomWebhook = TenantClient.prototype.deleteWebhook = function (roomIdOrName, webhookId) {
|
234 | var self = this;
|
235 | exports.verifyNumberOrString('roomIdOrName', roomIdOrName);
|
236 | verify.number(webhookId);
|
237 | var resourceUrl = this._tenant.links.api + '/room/' + param(roomIdOrName) + '/webhook/' + param(webhookId);
|
238 | return self.getToken('admin_room').then(function (token) {
|
239 | return self._client.deleteRoomWebhook(resourceUrl, token);
|
240 | });
|
241 | };
|
242 |
|
243 | TenantClient.prototype.getRoomWebhook = TenantClient.prototype.getWebhook = function (roomIdOrName, webhookId, options) {
|
244 | var self = this;
|
245 | exports.verifyNumberOrString('roomIdOrName', roomIdOrName);
|
246 | verify.number(webhookId);
|
247 | var resourceUrl = this._tenant.links.api + '/room/' + param(roomIdOrName) + '/webhook/' + param(webhookId);
|
248 | return self.getToken('admin_room').then(function (token) {
|
249 | return self._client.getRoomWebhook(resourceUrl, token);
|
250 | });
|
251 | };
|
252 |
|
253 | TenantClient.prototype.getRoomHistory = function (roomIdOrName, options) {
|
254 | var self = this;
|
255 | exports.verifyNumberOrString('roomIdOrName', roomIdOrName);
|
256 | var resourceUrl = this._tenant.links.api + '/room/' + param(roomIdOrName) + '/history';
|
257 | return self.getToken('view_messages').then(function (token) {
|
258 | return self._client.getRoomHistory(resourceUrl, token, options);
|
259 | });
|
260 | };
|
261 |
|
262 | TenantClient.prototype.getPrivateChatMessage = function (userIdOrEmail, messageId, options) {
|
263 | var self = this;
|
264 | exports.verifyNumberOrString('userIdOrEmail', userIdOrEmail);
|
265 | verify.string(messageId);
|
266 | var resourceUrl = this._tenant.links.api + '/user/' + param(userIdOrEmail) + '/history/' + param(messageId);
|
267 | return self.getToken('view_messages').then(function (token) {
|
268 | return self._client.getPrivateChatMessage(resourceUrl, token, options);
|
269 | });
|
270 | };
|
271 |
|
272 | TenantClient.prototype.getRecentPrivateChatHistory = function (userIdOrEmail, options) {
|
273 | var self = this;
|
274 | exports.verifyNumberOrString('userIdOrEmail', userIdOrEmail);
|
275 | var resourceUrl = this._tenant.links.api + '/user/' + param(userIdOrEmail) + '/history/latest';
|
276 | return self.getToken('view_messages').then(function (token) {
|
277 | return self._client.getRecentPrivateChatHistory(resourceUrl, token, options);
|
278 | });
|
279 | };
|
280 |
|
281 | TenantClient.prototype.updateUserPhoto = function (userIdOrEmail, photo) {
|
282 | var self = this;
|
283 | exports.verifyNumberOrString('userIdOrEmail', userIdOrEmail);
|
284 | var resourceUrl = this._tenant.links.api + '/user/' + param(userIdOrEmail) + '/photo';
|
285 | return self.getToken('admin_group').then(function (token) {
|
286 | return self._client.updateUserPhoto(resourceUrl, token, photo);
|
287 | });
|
288 | };
|
289 |
|
290 | TenantClient.prototype.deleteUserPhoto = function (userIdOrEmail) {
|
291 | var self = this;
|
292 | exports.verifyNumberOrString('userIdOrEmail', userIdOrEmail);
|
293 | var resourceUrl = this._tenant.links.api + '/user/' + param(userIdOrEmail) + '/photo';
|
294 | return self.getToken('admin_group').then(function (token) {
|
295 | return self._client.deleteUserPhoto(resourceUrl, token);
|
296 | });
|
297 | };
|
298 |
|
299 | TenantClient.prototype.updateUser = function (userIdOrEmail, user) {
|
300 | var self = this;
|
301 | exports.verifyNumberOrString('userIdOrEmail', userIdOrEmail);
|
302 | var resourceUrl = this._tenant.links.api + '/user/' + param(userIdOrEmail);
|
303 | return self.getToken('admin_group').then(function (token) {
|
304 | return self._client.updateUser(resourceUrl, token, user);
|
305 | });
|
306 | };
|
307 |
|
308 | TenantClient.prototype.deleteUser = function (userIdOrEmail) {
|
309 | var self = this;
|
310 | exports.verifyNumberOrString('userIdOrEmail', userIdOrEmail);
|
311 | var resourceUrl = this._tenant.links.api + '/user/' + param(userIdOrEmail);
|
312 | return self.getToken('admin_group').then(function (token) {
|
313 | return self._client.deleteUser(resourceUrl, token);
|
314 | });
|
315 | };
|
316 |
|
317 | TenantClient.prototype.getUser = function (userIdOrEmail, options) {
|
318 | var self = this;
|
319 | exports.verifyNumberOrString('userIdOrEmail', userIdOrEmail);
|
320 | var resourceUrl = this._tenant.links.api + '/user/' + param(userIdOrEmail);
|
321 | return self.getToken('view_group').then(function (token) {
|
322 | return self._client.getUser(resourceUrl, token, options);
|
323 | });
|
324 | };
|
325 |
|
326 | TenantClient.prototype.createUser = function (user) {
|
327 | var self = this;
|
328 | verify.object(user);
|
329 | var resourceUrl = this._tenant.links.api + '/user';
|
330 | return self.getToken('admin_group').then(function (token) {
|
331 | return self._client.createUser(resourceUrl, token, user);
|
332 | });
|
333 | };
|
334 |
|
335 | TenantClient.prototype.getUsers = function (options) {
|
336 | var self = this;
|
337 | var resourceUrl = this._tenant.links.api + '/user';
|
338 | return self.getToken('view_group').then(function (token) {
|
339 | return self._client.getUsers(resourceUrl, token, options);
|
340 | });
|
341 | };
|
342 |
|
343 | TenantClient.prototype.shareLinkWithUser = function (userIdOrEmail, link, message) {
|
344 | var self = this;
|
345 | exports.verifyNumberOrString('userIdOrEmail', userIdOrEmail);
|
346 | var resourceUrl = this._tenant.links.api + '/user/' + param(userIdOrEmail) + '/share/link';
|
347 | return self.getToken('send_message').then(function (token) {
|
348 | return self._client.shareLinkWithUser(resourceUrl, token, link, message);
|
349 | });
|
350 | };
|
351 |
|
352 | TenantClient.prototype.glancePushUser = function (userId, options) {
|
353 | var self = this;
|
354 | exports.verifyNumberOrString('userId', userId);
|
355 | var resourceUrl = this._tenant.links.api + '/addon/ui/user/' + param(userId);
|
356 | return self.getToken('view_group').then(function (token) {
|
357 | return self._client.glancePushUser(resourceUrl, token, options);
|
358 | });
|
359 | };
|
360 |
|
361 | TenantClient.prototype.glancePushRoom = function (roomId, options) {
|
362 | var self = this;
|
363 | exports.verifyNumberOrString('roomId', roomId);
|
364 | var resourceUrl = this._tenant.links.api + '/addon/ui/room/' + param(roomId);
|
365 | return self.getToken('view_room').then(function (token) {
|
366 | return self._client.glancePushRoom(resourceUrl, token, options);
|
367 | });
|
368 | };
|
369 |
|
370 | TenantClient.prototype.glancePushGroup = function (options) {
|
371 | var self = this;
|
372 | var resourceUrl = this._tenant.links.api + '/addon/ui';
|
373 | return self.getToken('view_group').then(function (token) {
|
374 | return self._client.glancePushGroup(resourceUrl, token, options);
|
375 | });
|
376 | };
|
377 |
|
378 |
|
379 |
|
380 | TenantClient.prototype.forRoom = function (roomIdOrName) {
|
381 | var self = this;
|
382 | roomIdOrName = roomIdOrName || self._tenant.room;
|
383 | exports.verifyNumberOrString('roomIdOrName', roomIdOrName);
|
384 | var roomMethods = [
|
385 | 'getRoomMessage',
|
386 | 'getRecentRoomHistory',
|
387 | 'sendNotification',
|
388 | 'updateRoom',
|
389 | 'getRoom',
|
390 | 'roomIdOrName',
|
391 | 'deleteRoom',
|
392 | 'createRoomWebhook',
|
393 | 'createWebhook',
|
394 | 'getRoomWebhooks',
|
395 | 'getWebhooks',
|
396 | 'getRoomStatistics',
|
397 | 'replyToMessage',
|
398 | 'getRoomMembers',
|
399 | 'setRoomTopic',
|
400 | 'shareLinkWithRoom',
|
401 | 'addRoomMember',
|
402 | 'removeRoomMember',
|
403 | 'deleteRoomWebhook',
|
404 | 'getRoomWebhook',
|
405 | 'getRoomHistory'
|
406 | ];
|
407 | return _.object(roomMethods.map(function (method) {
|
408 | return [method, function () {
|
409 | var args = [roomIdOrName].concat([].slice.call(arguments));
|
410 | return self[method].apply(self, args);
|
411 | }];
|
412 | }));
|
413 | };
|
414 |
|
415 | TenantClient.prototype.forUser = function (userIdOrEmail) {
|
416 | var self = this;
|
417 | exports.verifyNumberOrString('userIdOrEmail', userIdOrEmail);
|
418 | var userMethods = [
|
419 | 'getPrivateChatMessage',
|
420 | 'getRecentPrivateChatHistory',
|
421 | 'updateUserPhoto',
|
422 | 'deleteUserPhoto',
|
423 | 'updateUser',
|
424 | 'deleteUser',
|
425 | 'getUser',
|
426 | 'shareLinkWithUser'
|
427 | ];
|
428 | return _.object(userMethods.map(function (method) {
|
429 | return [method, function () {
|
430 | var args = [userIdOrEmail].concat([].slice.call(arguments));
|
431 | return self[method].apply(self, args);
|
432 | }];
|
433 | }));
|
434 | };
|
435 |
|
436 | TenantClient.prototype._ensureScopes = function () {
|
437 | var scopes = arguments.length > 0 ? [].slice.call(arguments) : defaultScopes;
|
438 | scopes.forEach(function (scope) {
|
439 | if (scopes.indexOf(scope) === -1) {
|
440 | throw new Error('Scope ' + scope + ' not in allowable tenant scopes: [' + scopes.join(', ') + ']');
|
441 | }
|
442 | });
|
443 | };
|
444 |
|
445 | exports.verifyNumberOrString = function (name, val) {
|
446 | if (!check.number(val) && !check.string(val)) {
|
447 | throw new Error('Argument ' + name + ' must be a number or string');
|
448 | }
|
449 | }
|
450 |
|
451 | module.exports = function (client, tenant, cache, scopes) {
|
452 | return new TenantClient(client, tenant, cache, scopes);
|
453 | };
|