Gitter migration: Setup redirects (rollout pt. 3)
[gitter.git] / modules / gitlab / lib / group-service.js
blob9d038d43ab985a24f2a4823c2f681468e0478a80
1 'use strict';
3 const debug = require('debug')('gitter:app:gitlab:group-service');
4 const { Groups, GroupMembers } = require('gitlab');
5 const { secureWrapFunction } = require('gitter-web-cache-wrapper');
6 const getGitlabAccessTokenFromUser = require('./get-gitlab-access-token-from-user');
7 const getPublicTokenFromPool = require('./get-public-token-from-pool');
9 function cacheFunction(name, obj) {
10   return secureWrapFunction(`GitLabGroupService:${name}`, obj, async gitLabGroupService => {
11     const accessToken = await gitLabGroupService.getAccessTokenPromise;
12     return accessToken;
13   });
16 // API reference: https://docs.gitlab.com/ee/api/groups.html
17 function standardizeGroupResponse(group) {
18   debug('standardizeGroupResponse', group);
19   return {
20     backend: 'gitlab',
21     id: group.id,
22     name: group.full_name,
23     avatar_url: group.avatar_url,
24     uri: group.full_path,
25     absoluteUri: group.web_url
26   };
29 function GitLabGroupService(user) {
30   this.user = user;
31   this.getAccessTokenPromise = getGitlabAccessTokenFromUser(user);
34 GitLabGroupService.prototype._getGitlabOpts = async function() {
35   const accessToken = await this.getAccessTokenPromise;
36   return {
37     oauthToken: accessToken,
38     token: getPublicTokenFromPool()
39   };
42 GitLabGroupService.prototype.getGroups = cacheFunction('getGroups', async function(params) {
43   const resource = new Groups(await this._getGitlabOpts());
44   const res = await resource.all(params);
46   return (res || []).map(standardizeGroupResponse);
47 });
49 GitLabGroupService.prototype.getGroup = cacheFunction('getGroup', async function(id) {
50   const resource = new Groups(await this._getGitlabOpts());
51   const group = await resource.show(id);
53   return standardizeGroupResponse(group);
54 });
56 GitLabGroupService.prototype._getGroupMember = async function(groupId, gitlabUserId) {
57   const gitlabLibOpts = await this._getGitlabOpts();
58   const groupMembers = new GroupMembers(gitlabLibOpts);
60   try {
61     const groupMember = await groupMembers.show(groupId, gitlabUserId, {
62       includeInherited: true
63     });
64     debug('isMember groupMember response =>', groupMember);
65     return groupMember;
66   } catch (err) {
67     debug('isMember error =>', err);
68     if (err && err.response && err.response.status === 404) {
69       return false;
70     }
72     throw err;
73   }
76 GitLabGroupService.prototype.getMembership = cacheFunction('getMembership', async function(
77   groupId,
78   gitlabUserId
79 ) {
80   const groupMember = await this._getGroupMember(groupId, gitlabUserId);
81   let accessLevel = 0;
82   if (groupMember) {
83     accessLevel = groupMember.access_level;
84   }
86   // https://docs.gitlab.com/ee/api/access_requests.html
87   return {
88     accessLevel,
89     isMember: [10, 20, 30, 40, 50].some(level => level === accessLevel),
90     isMaintainer: [40, 50].some(level => level === accessLevel),
91     isOwner: accessLevel === 50
92   };
93 });
95 module.exports = GitLabGroupService;