Skip to content
This repository was archived by the owner on Mar 13, 2025. It is now read-only.

Commit 3fb3969

Browse files
committed
Gitlab add user expiration feature.
1 parent 697f72a commit 3fb3969

12 files changed

+70
-11
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
"angular-touch": "~1.7.4",
3737
"angular-ui-bootstrap": "~2.5.0",
3838
"angular-ui-router": "~1.0.23",
39+
"angularjs-datepicker": "^2.1.23",
3940
"auth0-angular": "~4.0.4",
4041
"auth0-js": "^9.11.3",
4142
"auth0-lock": "^11.17.2",

src/controllers/GitlabController.js

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,11 @@ async function getGroupRegistrationUrl(req) {
115115
if (!user || !user.accessToken) {
116116
throw new errors.UnauthorizedError('You have not setup for Gitlab.');
117117
}
118-
return await GitlabService.getGroupRegistrationUrl(user.username, req.params.id, req.params.accessLevel);
118+
return await GitlabService.getGroupRegistrationUrl(
119+
user.username,
120+
req.params.id,
121+
req.params.accessLevel,
122+
req.params.expiredAt);
119123
}
120124

121125
/**
@@ -193,7 +197,12 @@ async function addUserToGroupCallback(req, res) {
193197
});
194198

195199
// add user to group
196-
const gitlabUser = await GitlabService.addGroupMember(group.groupId, ownerUser.accessToken, token, group.accessLevel);
200+
const gitlabUser = await GitlabService.addGroupMember(
201+
group.groupId,
202+
ownerUser.accessToken,
203+
token,
204+
group.accessLevel,
205+
group.expiredAt);
197206
// associate gitlab username with TC username
198207
const mapping = await dbHelper.scanOne(UserMapping, {
199208
topcoderUsername: {eq: req.session.tcUsername},

src/front/src/app/app.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ angular.module('topcoderX', [
1212
'ui.router',
1313
'ui.bootstrap',
1414
'angular-clipboard',
15-
'angular-jwt'])
15+
'angular-jwt',
16+
'720kb.datepicker'])
1617
// In the run phase of your Angular application
1718
.run(['AuthService', function (AuthService) {
1819
// init AuthService, it has to be done once, when app starts

src/front/src/app/git-access-control/access-control.service.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,12 @@ angular.module('topcoderX')
2424
* get gitlab shareable link
2525
*
2626
*/
27-
service.getGitlabShareableLink = function (groupId, accessLevel) {
27+
service.getGitlabShareableLink = function (groupId, accessLevel, expiredAt) {
28+
if (expiredAt) {
29+
return $http.get(baseUrl + '/api/v1/gitlab/groups/' + groupId + '/registrationurl/' + accessLevel + '/' + expiredAt).then(function (response) {
30+
return response;
31+
});
32+
}
2833
return $http.get(baseUrl + '/api/v1/gitlab/groups/' + groupId + '/registrationurl/' + accessLevel).then(function (response) {
2934
return response;
3035
});

src/front/src/app/git-access-control/git-access-dialog.controller.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,12 @@ angular.module('topcoderX').controller('GitAccessDialogController', [
1212
) {
1313
$scope.provider = provider;
1414
$scope.accessLevel = '';
15+
$scope.expiredAt = '';
1516
if ($scope.provider === 'github') {
1617
$scope.accessLevel = 'member';
1718
} else {
1819
$scope.accessLevel = '30';
20+
$scope.dateLimit = new Date().toDateString();
1921
}
2022

2123
/**
@@ -25,12 +27,20 @@ angular.module('topcoderX').controller('GitAccessDialogController', [
2527
$scope.accessLevel = accessLevel;
2628
};
2729

30+
/**
31+
* Update the expired at params
32+
*/
33+
$scope.updateExpired = function (expiredAt) {
34+
$scope.expiredAt = expiredAt;
35+
};
36+
2837
/**
2938
* Set changes to father controller
3039
*/
3140
$scope.setChanges = function () {
3241
$uibModalInstance.close({
3342
accessLevel: $scope.accessLevel,
43+
expiredAt: $scope.expiredAt
3444
});
3545
};
3646

src/front/src/app/git-access-control/git-access-dialog.html

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,21 @@ <h4 class="modal-title" id="reg-dialog-label">Configure Access Level and Valid P
99
<div class="row">
1010
<label class="form-label">Access Level:</label>
1111
<select class="form-control" ng-if="provider === 'gitlab'" ng-model="accessLevel" ng-change="updateAccessLevel(accessLevel)" required>
12-
<option value ="30">Developer</option>
12+
<option value ="10">Guest</option>
1313
<option value ="20">Reporter</option>
14+
<option value ="30">Developer</option>
15+
<option value ="40">Maintainer</option>
16+
<option value ="50">Owner</option>
1417
</select>
1518
<select class="form-control" ng-if="provider === 'github'" ng-model="accessLevel" ng-change="updateAccessLevel(accessLevel)" required>
1619
<option value ="member">Member</option>
1720
<option value ="maintainer">Maintainer</option>
1821
</select>
1922
<br />
23+
<label ng-if="provider === 'gitlab'" class="form-label">Expired At:</label>
24+
<datepicker ng-if="provider === 'gitlab'" date-format="yyyy-MM-dd" date-min-limit="{{dateLimit}}">
25+
<input class="form-control" ng-model="expiredAt" type="text" ng-change="updateExpired(expiredAt)"/>
26+
</datepicker>
2027
</div>
2128
</div>
2229
<div class="modal-footer">
@@ -27,4 +34,4 @@ <h4 class="modal-title" id="reg-dialog-label">Configure Access Level and Valid P
2734
Cancel
2835
</button>
2936
</div>
30-
</div>
37+
</div>

src/front/src/app/git-access-control/gitAccessControl.controller.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,13 @@ angular.module('topcoderX').controller('GitAccessController', ['currentUser', '$
8888
function (data) {
8989
if (data) {
9090
const accessLevel = data.accessLevel;
91+
const expiredAt = data.expiredAt;
9192
var config = $scope.tableConfig[provider];
92-
config.accessLinkMethod.apply(vm, [team.id, accessLevel]).then(function (response) {
93+
var params = [team.id, accessLevel];
94+
if (expiredAt) {
95+
params.push(expiredAt);
96+
}
97+
config.accessLinkMethod.apply(vm, params).then(function (response) {
9398
team.accessLink = response.data.url;
9499
team.showLink = true;
95100
team.gettingLink = false;

src/front/src/index.css

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
/*add css dependencies in node_modules here*/
22

33
@import url("../../../node_modules/metismenu/dist/metisMenu.css");
4-
@import url("../../../node_modules/footable/css/footable.core.css");
4+
@import url("../../../node_modules/footable/css/footable.core.css");
5+
@import url("../../../node_modules/angularjs-datepicker/dist/angular-datepicker.min.css");

src/front/src/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,5 @@ require('metismenu');
2929
require('pace-js');
3030
require('footable');
3131
require('jquery-ui-dist/jquery-ui');
32+
require('angularjs-datepicker');
3233
window.shortid = require('shortid')

src/models/OwnerUserGroup.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,10 @@ const schema = new Schema({
6464
name: 'AccessLevelIndex',
6565
},
6666
},
67+
expiredAt: {
68+
type: String,
69+
required: false
70+
}
6771
});
6872

6973

src/routes.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,12 @@ module.exports = {
8686
method: 'getGroupRegistrationUrl',
8787
},
8888
},
89+
'/gitlab/groups/:id/registrationurl/:accessLevel/:expiredAt': {
90+
get: {
91+
controller: 'GitlabController',
92+
method: 'getGroupRegistrationUrl',
93+
},
94+
},
8995
'/gitlab/groups/:id/users': {
9096
delete: {
9197
controller: 'GitlabController',

src/services/GitlabService.js

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -145,9 +145,10 @@ listOwnerUserGroups.schema = Joi.object().keys({
145145
* @param {String} ownerUsername the owner user name
146146
* @param {String} groupId the group id
147147
* @param {String} accessLevel the group access level
148+
* @param {String} expiredAt the expired at params to define how long user joined teams. can be null
148149
* @returns {Promise} the promise result
149150
*/
150-
async function getGroupRegistrationUrl(ownerUsername, groupId, accessLevel) {
151+
async function getGroupRegistrationUrl(ownerUsername, groupId, accessLevel, expiredAt) {
151152
// generate identifier
152153
const identifier = helper.generateIdentifier();
153154

@@ -159,6 +160,7 @@ async function getGroupRegistrationUrl(ownerUsername, groupId, accessLevel) {
159160
groupId,
160161
identifier,
161162
accessLevel,
163+
expiredAt
162164
});
163165

164166
// construct URL
@@ -170,6 +172,7 @@ getGroupRegistrationUrl.schema = Joi.object().keys({
170172
ownerUsername: Joi.string().required(),
171173
groupId: Joi.string().required(),
172174
accessLevel: Joi.string().required(),
175+
expiredAt: Joi.string()
173176
});
174177

175178
/**
@@ -178,9 +181,10 @@ getGroupRegistrationUrl.schema = Joi.object().keys({
178181
* @param {String} ownerUserToken the owner user token
179182
* @param {String} normalUserToken the normal user token
180183
* @param {String} accessLevel the access level
184+
* @param {String} expiredAt the expired at params to define how long user joined teams. can be null
181185
* @returns {Promise} the promise result
182186
*/
183-
async function addGroupMember(groupId, ownerUserToken, normalUserToken, accessLevel) {
187+
async function addGroupMember(groupId, ownerUserToken, normalUserToken, accessLevel, expiredAt) {
184188
let username;
185189
let userId;
186190
try {
@@ -195,11 +199,15 @@ async function addGroupMember(groupId, ownerUserToken, normalUserToken, accessLe
195199
throw new errors.UnauthorizedError('Can not get user id from the normal user access token.');
196200
}
197201

202+
let body = `user_id=${userId}&access_level=${accessLevel}`;
203+
if (expiredAt) {
204+
body = body + `&expires_at=${expiredAt} `;
205+
}
198206
// add user to group
199207
await request
200208
.post(`${config.GITLAB_API_BASE_URL}/api/v4/groups/${groupId}/members`)
201209
.set('Authorization', `Bearer ${ownerUserToken}`)
202-
.send(`user_id=${userId}&access_level=${accessLevel}`)
210+
.send(body)
203211
.end();
204212
// return gitlab username
205213
return {
@@ -222,6 +230,7 @@ addGroupMember.schema = Joi.object().keys({
222230
ownerUserToken: Joi.string().required(),
223231
normalUserToken: Joi.string().required(),
224232
accessLevel: Joi.string().required(),
233+
expiredAt: Joi.string()
225234
});
226235

227236
/**

0 commit comments

Comments
 (0)