Merge branch 'hotfix/21.56.9' into master
[gitter.git] / modules / rooms / lib / room-favourites-core.js
blob9f0ecb290f1093265efddf45a6d1c6f3af36ca94
1 'use strict';
3 const lazy = require('lazy.js');
4 const _ = require('lodash');
5 const persistence = require('gitter-web-persistence');
6 const calculateFavouriteUpdates = require('./calculate-favourite-updates');
7 const mongoReadPrefs = require('gitter-web-persistence-utils/lib/mongo-read-prefs');
9 const LEGACY_FAV_POSITION = 1000;
11 /**
12  * For exporting things
13  */
14 function getCursorByUserId(userId) {
15   const cursor = persistence.UserTroupeFavourites.find({
16     userId
17   })
18     .lean()
19     .read(mongoReadPrefs.secondaryPreferred)
20     .batchSize(100)
21     .cursor();
23   return cursor;
26 function findFavouriteTroupesForUser(userId) {
27   return persistence.UserTroupeFavourites.findOne({ userId: userId }, { favs: 1 }, { lean: true })
28     .exec()
29     .then(function(userTroupeFavourites) {
30       if (!userTroupeFavourites || !userTroupeFavourites.favs) return {};
32       return lazy(userTroupeFavourites.favs)
33         .pairs()
34         .map(function(a) {
35           // Replace any legacy values with 1000
36           if (a[1] === '1') a[1] = LEGACY_FAV_POSITION;
37           return a;
38         })
39         .toObject();
40     });
43 /**
44  * Internal call
45  */
46 function addTroupeAsFavouriteInLastPosition(userId, troupeId) {
47   return findFavouriteTroupesForUser(userId).then(function(userTroupeFavourites) {
48     var lastPosition =
49       lazy(userTroupeFavourites)
50         .values()
51         .concat(0)
52         .max() + 1;
54     var setOp = {};
55     setOp['favs.' + troupeId] = lastPosition;
57     return persistence.UserTroupeFavourites.update(
58       { userId: userId },
59       { $set: setOp },
60       { upsert: true, new: true }
61     )
62       .exec()
63       .thenReturn(lastPosition);
64   });
67 function addTroupeAsFavouriteInPosition(userId, troupeId, position) {
68   return findFavouriteTroupesForUser(userId).then(function(userTroupeFavourites) {
69     var values = lazy(userTroupeFavourites)
70       .pairs()
71       .value();
73     const newValues = calculateFavouriteUpdates(troupeId, position, values);
75     var inc = lazy(newValues)
76       .map(function(a) {
77         return ['favs.' + a[0], 1];
78       })
79       .toObject();
81     var set = {};
82     set['favs.' + troupeId] = position;
84     var update = { $set: set };
85     if (!_.isEmpty(inc)) update.$inc = inc; // Empty $inc is invalid
87     return persistence.UserTroupeFavourites.update({ userId: userId }, update, {
88       upsert: true,
89       new: true
90     })
91       .exec()
92       .thenReturn(position);
93   });
96 function clearFavourite(userId, troupeId) {
97   var setOp = {};
98   setOp['favs.' + troupeId] = 1;
100   return persistence.UserTroupeFavourites.update({ userId: userId }, { $unset: setOp }, {})
101     .exec()
102     .thenReturn(null);
105 function updateFavourite(userId, troupeId, favouritePosition) {
106   if (favouritePosition) {
107     /* Deal with legacy, or when the star button is toggled */
108     if (favouritePosition === true) {
109       return addTroupeAsFavouriteInLastPosition(userId, troupeId);
110     } else {
111       return addTroupeAsFavouriteInPosition(userId, troupeId, favouritePosition);
112     }
113   } else {
114     // Unset the favourite
115     return clearFavourite(userId, troupeId);
116   }
119 module.exports = {
120   getCursorByUserId,
121   updateFavourite,
122   clearFavourite,
123   findFavouriteTroupesForUser