Gitter migration: Setup redirects (rollout pt. 3)
[gitter.git] / server / services / live-collection-handlers / live-collection-rooms.js
blobaf0988169c6896029741ae29db2acb5bb8f4ea40
1 'use strict';
3 var Promise = require('bluebird');
4 var appEvents = require('gitter-web-appevents');
5 var restSerializer = require('../../serializers/rest-serializer');
6 var roomMembershipService = require('gitter-web-rooms/lib/room-membership-service');
7 var presenceService = require('gitter-web-presence');
8 var _ = require('lodash');
10 function getUserDistribution(troupeId) {
11   return roomMembershipService.findMembersForRoom(troupeId).then(function(userIds) {
12     if (!userIds.length) return [];
14     return presenceService.categorizeUsersByOnlineStatus(userIds).then(function(online) {
15       return userIds.filter(function(userId) {
16         return !!online[userId];
17       });
18     });
19   });
22 function serializeRoomToUsers(userIds, operation, troupe) {
23   if (!userIds.length) return Promise.resolve();
25   if (troupe.oneToOne) {
26     // Because the troupe needs customized per-user....
27     return serializeOneToOneRoomToUsers(userIds, operation, troupe);
28   }
30   var strategy = new restSerializer.TroupeStrategy();
31   return restSerializer.serializeObject(troupe, strategy).then(function(serializedTroupe) {
32     appEvents.dataChange2('/rooms/' + troupe._id, operation, serializedTroupe, 'room');
34     userIds.forEach(function(userId) {
35       appEvents.dataChange2('/user/' + userId + '/rooms', operation, serializedTroupe, 'room');
36     });
37   });
40 /* Note: oneToOnes do not serialize to /rooms/:roomId since each user gets a different representation */
41 function serializeOneToOneRoomToUsers(userIds, operation, troupe) {
42   /* Perform the serialization for each user */
44   return Promise.map(userIds, function(userId) {
45     var strategy = new restSerializer.TroupeStrategy({ currentUserId: userId });
47     return restSerializer.serializeObject(troupe, strategy).then(function(serializedTroupe) {
48       appEvents.dataChange2('/user/' + userId + '/rooms', operation, serializedTroupe, 'room');
49     });
50   });
53 module.exports = {
54   create: function(troupe, initialUserIds) {
55     /* initialUserIds is used when the room has just been created  */
56     /* and we know who the users in the room are                   */
57     if (initialUserIds) {
58       return serializeRoomToUsers(initialUserIds, 'create', troupe);
59     }
61     return getUserDistribution(troupe._id).then(function(userIds) {
62       return serializeRoomToUsers(userIds, 'create', troupe);
63     });
64   },
66   update: function(troupe) {
67     return getUserDistribution(troupe._id).then(function(userIds) {
68       return serializeRoomToUsers(userIds, 'update', troupe);
69     });
70   },
72   patch: function(troupeId, patch) {
73     var patchMessage = _.extend({}, patch, { id: troupeId });
74     appEvents.dataChange2('/rooms/' + troupeId, 'patch', patchMessage, 'room');
76     return getUserDistribution(troupeId).then(function(userIds) {
77       if (!userIds.length) return;
79       userIds.forEach(function(userId) {
80         var url = '/user/' + userId + '/rooms';
81         appEvents.dataChange2(url, 'patch', patchMessage, 'room');
82       });
83     });
84   },
86   remove: function(model) {
87     return this.removeId(model.id);
88   },
90   removeId: function(troupeId) {
91     appEvents.dataChange2('/rooms/' + troupeId, 'remove', { id: troupeId }, 'room');
93     return getUserDistribution(troupeId).then(function(userIds) {
94       if (!userIds.length) return;
96       userIds.forEach(function(userId) {
97         var url = '/user/' + userId + '/rooms';
98         appEvents.dataChange2(url, 'remove', { id: troupeId }, 'room');
99       });
100     });
101   }