Skip to content

Commit f8791b3

Browse files
committed
Refactoring the git path switching for Gitlab vs. Github
1 parent df573e5 commit f8791b3

File tree

2 files changed

+165
-104
lines changed

2 files changed

+165
-104
lines changed

services/IssueService.js

Lines changed: 21 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ const models = require('../models');
1818
const logger = require('../utils/logger');
1919
const errors = require('../utils/errors');
2020
const topcoderApiHelper = require('../utils/topcoder-api-helper');
21-
const gitHubService = require('./GithubService');
21+
const gitHelper = require('../utils/git-helper');
2222
const emailService = require('./EmailService');
2323
const userService = require('./UserService');
2424
const gitlabService = require('./GitlabService');
@@ -83,22 +83,14 @@ async function handleEventGracefully(event, issue, err) {
8383
comment = `Payment failed: ${comment}`;
8484
}
8585
// notify error in git host
86-
if (event.provider === 'github') {
87-
await gitHubService.createComment(event.copilot, event.data.repository.full_name, issue.number, comment);
88-
} else {
89-
await gitlabService.createComment(event.copilot, event.data.repository.id, issue.number, comment);
90-
}
86+
await gitHelper.createComment(event, issue.number, comment);
9187

9288
if (event.event === 'issue.closed') {
9389
// reopen
94-
await reOpenIssue(event, issue);
90+
await gitHelper.reOpenIssue(event, issue);
9591
// ensure label is ready for review
9692
const readyForReviewLabels = [config.READY_FOR_REVIEW_ISSUE_LABEL];
97-
if (event.provider === 'github') {
98-
await gitHubService.addLabels(event.copilot, event.data.repository.full_name, issue.number, readyForReviewLabels);
99-
} else {
100-
await gitlabService.addLabels(event.copilot, event.data.repository.id, issue.number, readyForReviewLabels);
101-
}
93+
await gitHelper.addLabels(event, issue.number, readyForReviewLabels);
10294
}
10395
}
10496
}
@@ -140,31 +132,13 @@ async function ensureChallengeExists(event, issue) {
140132
* @private
141133
*/
142134
async function getProjectDetail(issue, event) {
143-
let fullRepoUrl;
144-
if (issue.provider === 'github') {
145-
fullRepoUrl = `https://github.com/${event.data.repository.full_name}`;
146-
} else if (issue.provider === 'gitlab') {
147-
fullRepoUrl = `${config.GITLAB_API_BASE_URL}/${event.data.repository.full_name}`;
148-
}
135+
const fullRepoUrl = gitHelper.getFullRepoUrl(event);
149136
const project = await models.Project.findOne({
150137
repoUrl: fullRepoUrl
151138
});
152139
return project;
153140
}
154141

155-
/**
156-
* re opens the issue
157-
* @param {Object} event the event
158-
* @param {Object} issue the issue
159-
*/
160-
async function reOpenIssue(event, issue) {
161-
if (event.provider === 'github') {
162-
await gitHubService.changeState(event.copilot, event.data.repository.full_name, issue.number, 'open');
163-
} else {
164-
await gitlabService.changeState(event.copilot, event.data.repository.id, issue.number, 'reopen');
165-
}
166-
}
167-
168142
/**
169143
* removes the current assignee if user is not found in topcoder X mapping.
170144
* user first need to sign up in Topcoder X
@@ -175,25 +149,14 @@ async function reOpenIssue(event, issue) {
175149
* @private
176150
*/
177151
async function rollbackAssignee(event, assigneeUserId, issue, reOpen = false) {
178-
let assigneeUsername;
179-
if (event.provider === 'github') {
180-
assigneeUsername = await gitHubService.getUsernameById(event.copilot, assigneeUserId);
181-
} else {
182-
assigneeUsername = await gitlabService.getUsernameById(event.copilot, assigneeUserId);
183-
}
152+
const assigneeUsername = await gitHelper.getUsernameById(event, assigneeUserId);
184153
// comment on the git ticket for the user to self-sign up with the Topcoder x Self-Service tool
185154
const comment = `@${assigneeUsername}, please sign-up with Topcoder X tool`;
186-
if (event.provider === 'github') {
187-
await gitHubService.createComment(event.copilot, event.data.repository.full_name, issue.number, comment);
188-
// un-assign the user from the ticket
189-
await gitHubService.removeAssign(event.copilot, event.data.repository.full_name, issue.number, assigneeUsername);
190-
} else {
191-
await gitlabService.createComment(event.copilot, event.data.repository.id, issue.number, comment);
192-
// un-assign the user from the ticket
193-
await gitlabService.removeAssign(event.copilot, event.data.repository.id, issue.number, assigneeUserId);
194-
}
155+
await gitHelper.createComment(event, issue.number, comment);
156+
// un-assign the user from the ticket
157+
await gitHelper.removeAssign(event, issue.number, assigneeUserId, assigneeUsername);
195158
if (reOpen) {
196-
await reOpenIssue(event, issue);
159+
await gitHelper.reOpenIssue(event, issue);
197160
}
198161
}
199162

@@ -267,22 +230,14 @@ async function handleIssueAssignment(event, issue) {
267230
.push(config.ASSIGNED_ISSUE_LABEL)
268231
.value();
269232

270-
if (event.provider === 'github') {
271-
await gitHubService.addLabels(event.copilot, event.data.repository.full_name, issue.number, updateLabels);
272-
} else {
273-
await gitlabService.addLabels(event.copilot, event.data.repository.id, issue.number, updateLabels);
274-
}
233+
await gitHelper.addLabels(event, issue.number, updateLabels);
275234
} catch (err) {
276235
handleEventGracefully(event, issue, err);
277236
return;
278237
}
279238
const contestUrl = getUrlForChallengeId(dbIssue.challengeId);
280239
const comment = `Contest ${contestUrl} has been updated - it has been assigned to ${userMapping.topcoderUsername}.`;
281-
if (event.provider === 'github') {
282-
await gitHubService.createComment(event.copilot, event.data.repository.full_name, issue.number, comment);
283-
} else {
284-
await gitlabService.createComment(event.copilot, event.data.repository.id, issue.number, comment);
285-
}
240+
await gitHelper.createComment(event, issue.number, comment);
286241

287242
logger.debug(`Member ${userMapping.topcoderUsername} is assigned to challenge with id ${dbIssue.challengeId}`);
288243
} else {
@@ -307,20 +262,11 @@ async function handleIssueComment(event, issue) {
307262
const newTitle = `[$${parsedComment.acceptedBidAmount}] ${issue.title}`;
308263
logger.debug(`updating issue: ${event.data.repository.name}/${issue.number}`);
309264

310-
if (event.provider === 'github') {
311-
await gitHubService.updateIssue(event.copilot, event.data.repository.full_name, issue.number, newTitle);
312-
} else {
313-
await gitlabService.updateIssue(event.copilot, event.data.repository.id, issue.number, newTitle);
314-
}
265+
await gitHelper.updateIssue(event, issue.number, newTitle);
315266

316267
// assign user
317268
logger.debug(`assigning user, ${parsedComment.assignedUser} to issue: ${event.data.repository.name}/${issue.number}`);
318-
if (event.provider === 'github') {
319-
await gitHubService.assignUser(event.copilot, event.data.repository.full_name, issue.number, parsedComment.assignedUser);
320-
} else {
321-
const userId = await gitlabService.getUserIdByLogin(event.copilot, parsedComment.assignedUser);
322-
await gitlabService.assignUser(event.copilot, event.data.repository.id, issue.number, userId);
323-
}
269+
await gitHelper.assignUser(event, issue.number, parsedComment.assignedUser);
324270
}
325271
}
326272

@@ -363,11 +309,7 @@ async function handleIssueUpdate(event, issue) {
363309
// comment on the git ticket for the user to self-sign up with the Topcoder x Self-Service tool
364310
const contestUrl = getUrlForChallengeId(dbIssue.challengeId);
365311
const comment = `Contest ${contestUrl} has been updated - the new changes has been updated for this ticket.`;
366-
if (event.provider === 'github') {
367-
await gitHubService.createComment(event.copilot, event.data.repository.full_name, issue.number, comment);
368-
} else {
369-
await gitlabService.createComment(event.copilot, event.data.repository.id, issue.number, comment);
370-
}
312+
await gitHelper.createComment(event, issue.number, comment);
371313

372314
logger.debug(`updated challenge ${dbIssue.challengeId} for for issue ${issue.number}`);
373315
}
@@ -390,11 +332,7 @@ async function handleIssueClose(event, issue) {
390332
logger.debug(`This issue ${issue.number} is closed without fix accepted label.`);
391333
let comment = 'This ticket was not processed for payment. If you would like to process it for payment,';
392334
comment += ' please reopen it, add the ```' + config.FIX_ACCEPTED_ISSUE_LABEL + '``` label, and then close it again';// eslint-disable-line
393-
if (event.provider === 'github') {
394-
await gitHubService.createComment(event.copilot, event.data.repository.full_name, issue.number, comment);
395-
} else {
396-
await gitlabService.createComment(event.copilot, event.data.repository.id, issue.number, comment);
397-
}
335+
await gitHelper.createComment(event, issue.number, comment);
398336
closeChallenge = true;
399337
}
400338
if (issue.prizes[0] === 0) {
@@ -485,11 +423,7 @@ async function handleIssueClose(event, issue) {
485423
.push(config.ASSIGNED_ISSUE_LABEL).value()
486424
});
487425
await dbIssue.save();
488-
if (event.provider === 'github') {
489-
await gitHubService.markIssueAsPaid(event.copilot, event.data.repository.full_name, issue.number, dbIssue.challengeId);
490-
} else {
491-
await gitlabService.markIssueAsPaid(event.copilot, event.data.repository.id, issue.number, dbIssue.challengeId);
492-
}
426+
await gitHelper.markIssueAsPaid(event, issue.number, dbIssue.challengeId);
493427
} catch (e) {
494428
await handleEventGracefully(event, issue, e, event.paymentSuccessful);
495429
return;
@@ -559,11 +493,7 @@ async function handleIssueCreate(event, issue) {
559493

560494
const contestUrl = getUrlForChallengeId(issue.challengeId);
561495
const comment = `Contest ${contestUrl} has been created for this ticket.`;
562-
if (event.provider === 'github') {
563-
await gitHubService.createComment(event.copilot, event.data.repository.full_name, issue.number, comment);
564-
} else {
565-
await gitlabService.createComment(event.copilot, event.data.repository.id, issue.number, comment);
566-
}
496+
await gitHelper.createComment(event, issue.number, comment);
567497
if (event.provider === 'gitlab') {
568498
// if assignee is added during issue create then assign as well
569499
if (event.data.issue.assignees && event.data.issue.assignees.length > 0 && event.data.issue.assignees[0].id) {
@@ -622,11 +552,7 @@ async function handleIssueUnAssignment(event, issue) {
622552
});
623553
const contestUrl = getUrlForChallengeId(dbIssue.challengeId);
624554
const comment = `Contest ${contestUrl} has been updated - ${userMapping.topcoderUsername} has been unassigned.`;
625-
if (event.provider === 'github') {
626-
await gitHubService.createComment(event.copilot, event.data.repository.full_name, issue.number, comment);
627-
} else {
628-
await gitlabService.createComment(event.copilot, event.data.repository.id, issue.number, comment);
629-
}
555+
await gitHelper.createComment(event, issue.number, comment);
630556
logger.debug(`Member ${userMapping.topcoderUsername} is unassigned from challenge with id ${dbIssue.challengeId}`);
631557
}
632558
}
@@ -656,12 +582,7 @@ async function process(event) {
656582
repositoryId: event.data.repository.id,
657583
labels: event.data.issue.labels
658584
};
659-
let fullRepoUrl;
660-
if (event.provider === 'github') {
661-
fullRepoUrl = `https://github.com/${event.data.repository.full_name}`;
662-
} else if (event.provider === 'gitlab') {
663-
fullRepoUrl = `${config.GITLAB_API_BASE_URL}/${event.data.repository.full_name}`;
664-
}
585+
const fullRepoUrl = gitHelper.getFullRepoUrl(event);
665586

666587
const project = await models.Project.findOne({
667588
repoUrl: fullRepoUrl
@@ -682,11 +603,7 @@ async function process(event) {
682603
issue.body = md.render(_.get(issue, 'body', ''));
683604

684605
if (event.data.issue.assignees && event.data.issue.assignees.length > 0 && event.data.issue.assignees[0].id) {
685-
if (event.provider === 'github') {
686-
issue.assignee = await gitHubService.getUsernameById(copilot, event.data.issue.assignees[0].id);
687-
} else if (event.provider === 'gitlab') {
688-
issue.assignee = await gitlabService.getUsernameById(copilot, event.data.issue.assignees[0].id);
689-
}
606+
issue.assign = await gitHelper.getUsernameById(event, event.data.issue.assignees[0].id);
690607
}
691608
if (event.event === 'issue.created') {
692609
await handleIssueCreate(event, issue);

utils/git-helper.js

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
/*
2+
* Copyright (c) 2017 TopCoder, Inc. All rights reserved.
3+
*/
4+
/**
5+
* This module is the wrapper for git services.
6+
*
7+
* Changes in 1.1:
8+
* - changes related to https://www.topcoder.com/challenges/30060466
9+
* @author TCSCODER
10+
* @version 1.1
11+
*/
12+
'use strict';
13+
14+
const config = require('config');
15+
const gitHubService = require('../services/GithubService');
16+
const gitlabService = require('../services/GitlabService');
17+
18+
class GitHelper {
19+
/**
20+
* Creates the comments on github/gitlab issue
21+
* @param {Object} event the event
22+
* @param {Number} issueNumber the issue Number
23+
* @param {String} comment the comment body text
24+
*/
25+
async createComment(event, issueNumber, comment) {
26+
if (event.provider === 'github') {
27+
await gitHubService.createComment(event.copilot, event.data.repository.full_name, issueNumber, comment);
28+
} else {
29+
await gitlabService.createComment(event.copilot, event.data.repository.id, issueNumber, comment);
30+
}
31+
}
32+
33+
/**
34+
* Updates the github/gitlab issue with new labels
35+
* @param {Object} event the event
36+
* @param {Number} issueNumber the issue Number
37+
* @param {Array} labels the labels
38+
*/
39+
async addLabels(event, issueNumber, labels) {
40+
if (event.provider === 'github') {
41+
await gitHubService.addLabels(event.copilot, event.data.repository.full_name, issueNumber, labels);
42+
} else {
43+
await gitlabService.addLabels(event.copilot, event.data.repository.id, issueNumber, labels);
44+
}
45+
}
46+
47+
/**
48+
* Change the state of github/gitlab issue to open
49+
* @param {Object} event the event
50+
* @param {Object} issue the issue
51+
*/
52+
async reOpenIssue(event, issue) {
53+
if (event.provider === 'github') {
54+
await gitHubService.changeState(event.copilot, event.data.repository.full_name, issue.number, 'open');
55+
} else {
56+
await gitlabService.changeState(event.copilot, event.data.repository.id, issue.number, 'reopen');
57+
}
58+
}
59+
60+
/**
61+
* Gets the user name by user id
62+
* @param {Object} event the event
63+
* @param {Number} assigneeUserId the user id
64+
* @returns {String} the username
65+
*/
66+
async getUsernameById(event, assigneeUserId) {
67+
if (event.provider === 'github') {
68+
return await gitHubService.getUsernameById(event.copilot, assigneeUserId);
69+
}
70+
return await gitlabService.getUsernameById(event.copilot, assigneeUserId);
71+
}
72+
73+
/**
74+
* Removes an assignee from the issue
75+
* @param {Object} event the event
76+
* @param {Number} issueNumber the issue Number
77+
* @param {Number} assigneeUserId the user id
78+
* @param {String} assigneeUsername the username
79+
*/
80+
async removeAssign(event, issueNumber, assigneeUserId, assigneeUsername) {
81+
if (event.provider === 'github') {
82+
await gitHubService.removeAssign(event.copilot, event.data.repository.full_name, issueNumber, assigneeUsername);
83+
} else {
84+
await gitlabService.removeAssign(event.copilot, event.data.repository.id, issueNumber, assigneeUserId);
85+
}
86+
}
87+
88+
/**
89+
* updates the title of github/gitlab issue
90+
* @param {Object} event the event
91+
* @param {Number} issueNumber the issue Number
92+
* @param {String} newTitle the issue's new title
93+
*/
94+
async updateIssue(event, issueNumber, newTitle) {
95+
if (event.provider === 'github') {
96+
await gitHubService.updateIssue(event.copilot, event.data.repository.full_name, issueNumber, newTitle);
97+
} else {
98+
await gitlabService.updateIssue(event.copilot, event.data.repository.id, issueNumber, newTitle);
99+
}
100+
}
101+
102+
/**
103+
* Assigns the issue to user
104+
* @param {Object} event the event
105+
* @param {Number} issueNumber the issue Number
106+
* @param {String} assignedUser the username
107+
*/
108+
async assignUser(event, issueNumber, assignedUser) {
109+
if (event.provider === 'github') {
110+
await gitHubService.assignUser(event.copilot, event.data.repository.full_name, issueNumber, assignedUser);
111+
} else {
112+
const userId = await gitlabService.getUserIdByLogin(event.copilot, assignedUser);
113+
await gitlabService.assignUser(event.copilot, event.data.repository.id, issueNumber, userId);
114+
}
115+
}
116+
117+
/**
118+
* updates the github/gitlab issue as paid and fix accepted
119+
* @param {Object} event the event
120+
* @param {Number} issueNumber the issue Number
121+
* @param {Number} challengeId the challenge id
122+
*/
123+
async markIssueAsPaid(event, issueNumber, challengeId) {
124+
if (event.provider === 'github') {
125+
await gitHubService.markIssueAsPaid(event.copilot, event.data.repository.full_name, issueNumber, challengeId);
126+
} else {
127+
await gitlabService.markIssueAsPaid(event.copilot, event.data.repository.id, issueNumber, challengeId);
128+
}
129+
}
130+
131+
/**
132+
* Retruns repository full url
133+
* @param {Object} event the event
134+
* @returns {String} the repository full url
135+
*/
136+
getFullRepoUrl(event) {
137+
if (event.provider === 'github') {
138+
return `https://github.com/${event.data.repository.full_name}`;
139+
}
140+
return `${config.GITLAB_API_BASE_URL}/${event.data.repository.full_name}`;
141+
}
142+
}
143+
144+
module.exports = new GitHelper();

0 commit comments

Comments
 (0)