Merge branch 'hotfix/21.56.9' into master
[gitter.git] / server / serializers / rest / troupes / troupe-permissions-strategy.js
blob8a31287100e26b2689278078b2f5d1cc54b8f5d7
1 'use strict';
3 var logger = require('gitter-web-env').logger;
4 var userService = require('gitter-web-users');
5 var Promise = require('bluebird');
6 var policyFactory = require('gitter-web-permissions/lib/policy-factory');
8 /**
9  * Returns the permissions the user has in the orgs.
10  * This is not intended to be used for large sets, rather individual items
11  */
12 function TroupePermissionsStrategy(options) {
13   this.currentUser = options.currentUser;
14   this.currentUserId = options.currentUserId;
15   this.isAdmin = null;
18 TroupePermissionsStrategy.prototype = {
19   preload: function(troupes) {
20     if (troupes.isEmpty()) return;
22     var currentUser = this.currentUser;
23     var currentUserId = this.currentUserId;
25     return Promise.try(function() {
26       if (currentUser) {
27         return currentUser;
28       }
30       if (currentUserId) {
31         return userService.findById(currentUserId);
32       }
33     })
34       .bind(this)
35       .then(function(user) {
36         // setup this.isAdmin _before_ possibly returning, otherwise map will npe
37         var isAdmin = (this.isAdmin = {});
39         if (!user) return;
41         return Promise.map(troupes.toArray(), function(troupe) {
42           return policyFactory
43             .createPolicyForRoom(user, troupe)
44             .then(function(policy) {
45               return policy.canAdmin();
46             })
47             .then(function(admin) {
48               isAdmin[troupe.id] = admin;
49             })
50             .catch(function(err) {
51               // Fallback in case of GitHub API downtime
52               logger.error('Unable to obtain admin permissions', { exception: err });
53               isAdmin[troupe.id] = false;
54             });
55         });
56       });
57   },
59   map: function(troupe) {
60     return {
61       admin: this.isAdmin[troupe.id] || false
62     };
63   },
65   name: 'TroupePermissionsStrategy'
68 module.exports = TroupePermissionsStrategy;