UNPKG

17.4 kBJavaScriptView Raw
1var _ = require('lodash');
2var rsvp = require('rsvp');
3var Promise = rsvp.Promise;
4var check = require('check-types');
5var verify = check.verify;
6var param = encodeURIComponent;
7
8function 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
19TenantClient.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
27TenantClient.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
36TenantClient.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
43TenantClient.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
50TenantClient.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
73TenantClient.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// TODO: share file with room
84
85TenantClient.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
94TenantClient.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
102TenantClient.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
111TenantClient.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
121TenantClient.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
131TenantClient.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
140TenantClient.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
149TenantClient.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
159TenantClient.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
168TenantClient.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
177TenantClient.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
186TenantClient.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
195TenantClient.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
204TenantClient.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
213TenantClient.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
223TenantClient.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
233TenantClient.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
243TenantClient.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
253TenantClient.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
262TenantClient.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
272TenantClient.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
281TenantClient.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
290TenantClient.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
299TenantClient.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
308TenantClient.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
317TenantClient.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
326TenantClient.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
335TenantClient.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
343TenantClient.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
352TenantClient.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
361TenantClient.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
370TenantClient.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// TODO: share file with user
379
380TenantClient.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
415TenantClient.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
436TenantClient.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
445exports.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
451module.exports = function (client, tenant, cache, scopes) {
452 return new TenantClient(client, tenant, cache, scopes);
453};