Merge branch 'hotfix/21.56.9' into master
[gitter.git] / modules / rooms / lib / troupe-uri-mapper.js
blobf2591017400e34d3722ed368313d67b8ac77899f
1 'use strict';
3 var persistence = require('gitter-web-persistence');
4 var userService = require('gitter-web-users');
5 var collections = require('gitter-web-utils/lib/collections');
6 var mongoUtils = require('gitter-web-persistence-utils/lib/mongo-utils');
7 var Promise = require('bluebird');
8 var roomMembershipService = require('./room-membership-service');
10 /**
11  * Returns the URL a particular user would see if they wish to view a URL.
12  * NB: this call has to query the db to get a user's username. Don't call it
13  * inside a loop!
14  */
15 function getUrlForTroupeForUserId(troupe, userId) {
16   if (!troupe.oneToOne) {
17     return Promise.resolve('/' + troupe.uri);
18   }
20   var otherTroupeUser = troupe.oneToOneUsers.filter(function(troupeUser) {
21     return troupeUser.userId != userId;
22   })[0];
24   if (!otherTroupeUser)
25     return Promise.reject(new Error('Unable to determine other user for troupe#' + troupe.id));
27   return userService.findUsernameForUserId(otherTroupeUser.userId).then(function(username) {
28     return username ? '/' + username : '/one-one/' + otherTroupeUser.userId; // TODO: this must go
29   });
31 exports.getUrlForTroupeForUserId = getUrlForTroupeForUserId;
33 function getUrlOfFirstAccessibleRoom(troupeIds, userId) {
34   if (!troupeIds.length) return Promise.resolve(null);
36   return roomMembershipService
37     .findUserMembershipInRooms(userId, troupeIds)
38     .then(function(memberTroupeIds) {
39       return persistence.Troupe.find(
40         {
41           _id: { $in: mongoUtils.asObjectIDs(memberTroupeIds) },
42           status: { $ne: 'DELETED' }
43         },
44         {
45           uri: 1,
46           oneToOne: 1,
47           oneToOneUsers: 1
48         }
49       ).exec();
50     })
51     .then(function(results) {
52       var resultsHash = collections.indexById(results);
53       for (var i = 0; i < troupeIds.length; i++) {
54         var troupeId = troupeIds[i];
55         var troupe = resultsHash[troupeId];
57         if (troupe) {
58           return getUrlForTroupeForUserId(troupe, userId);
59         }
60       }
62       return null;
63     });
65 exports.getUrlOfFirstAccessibleRoom = getUrlOfFirstAccessibleRoom;