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

fix: additional bug fixes for Gitlab service refactor #114

Merged
merged 1 commit into from
Sep 15, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion services/GitlabService.js
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,10 @@ class GitlabService {
} finally {
if (lockedUser) {
logger.debug(`[Lock ID: ${lockId}] Releasing lock on user ${this.#user.username}.`);
this.#user = await dbHelper.releaseLockOnUser(this.#user.id, lockId);
const newUser = await dbHelper.releaseLockOnUser(this.#user.id, lockId);
// Not assigning directly because the old object sometimes has properties
// that are not in the new one
_.assign(this.#user, newUser);
}
}
}
Expand Down
15 changes: 7 additions & 8 deletions services/IssueService.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,9 @@ const models = require('../models');
const dbHelper = require('../utils/db-helper');
const helper = require('../utils/helper');
const gitHelper = require('../utils/git-helper');
const constants = require('../constants');
const userService = require('./UserService');
const eventService = require('./EventService');
const constants = require('../constants');


// A variable to store issue creation lock to prevent duplicate creation process.
Expand Down Expand Up @@ -80,7 +80,7 @@ async function ensureChallengeExists(event, issue, create = true) {
logger.debugWithContext('dbIssue is PENDING', event, issue);
throw errors.internalDependencyError(`Challenge for the updated issue ${issue.number} is creating, rescheduling this event`);
}
const hasOpenForPickupLabel = _(issue.labels).includes(config.OPEN_FOR_PICKUP_ISSUE_LABEL);
const hasOpenForPickupLabel = _.includes(issue.labels, config.OPEN_FOR_PICKUP_ISSUE_LABEL);
if (dbIssue && dbIssue.status === constants.ISSUE_STATUS.CHALLENGE_CREATION_FAILED && hasOpenForPickupLabel) {
// remove issue from db
await dbHelper.removeIssue(models.Issue, issue.repositoryId, issue.number, issue.provider);
Expand Down Expand Up @@ -437,7 +437,7 @@ async function handleIssueClose(event, issue) { // eslint-disable-line

if (closeChallenge) {
logger.debugWithContext(`The associated challenge ${dbIssue.challengeUUID} is being scheduled for cancellation since no payment will be given`,
event, issue);
event, issue);
await dbHelper.update(models.Issue, dbIssue.id, {
status: constants.ISSUE_STATUS.CHALLENGE_CANCELLED,
updatedAt: new Date()
Expand Down Expand Up @@ -500,7 +500,7 @@ async function handleIssueClose(event, issue) { // eslint-disable-line
if (createCopilotPayments) {
logger.debugWithContext('Setting copilot payment');

const updateBody = {
const _updateBody = {
prizeSets: [{
type: 'placement',
prizes: _.map(issue.prizes, (prize) => ({type: 'USD', value: prize}))
Expand All @@ -511,7 +511,7 @@ async function handleIssueClose(event, issue) { // eslint-disable-line
}
]
};
await topcoderApiHelper.updateChallenge(dbIssue.challengeUUID, updateBody);
await topcoderApiHelper.updateChallenge(dbIssue.challengeUUID, _updateBody);
} else {
logger.debugWithContext('Create copilot payments is unchecked on the Topcoder-X project setup, so skipping', event, issue);
}
Expand Down Expand Up @@ -575,7 +575,6 @@ async function handleIssueClose(event, issue) { // eslint-disable-line
}
}


/**
* handles the issue create event
* @param {Object} event the event
Expand Down Expand Up @@ -636,7 +635,7 @@ async function handleIssueCreate(event, issue, forceAssign = false) {
issue.challengeUUID = await topcoderApiHelper.createChallenge({
name: issue.title,
projectId,
tags: !!project.tags ? project.tags.split(',') : [],
tags: project.tags ? project.tags.split(',') : [],
detailedRequirements: issue.body,
prizes: issue.prizes
});
Expand Down Expand Up @@ -676,7 +675,7 @@ async function handleIssueCreate(event, issue, forceAssign = false) {
}
delete issueCreationLock[creationLockKey];
} catch (err) {
logger.error(`Comment creation failure: ${err}`);
logger.error(`Comment creation failure: ${err}`, err);
delete issueCreationLock[creationLockKey];
logger.debugWithContext(`new challenge created with id ${issue.challengeUUID} for issue ${issue.number}`, event, issue);
}
Expand Down
15 changes: 5 additions & 10 deletions services/UserService.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,23 +25,21 @@ const models = require('../models');
*/
async function getTCUserName(provider, gitUser) {
Joi.attempt({provider, gitUser}, getTCUserName.schema);
const criteria = {};
if (_.isNumber(gitUser) || v.isUUID(gitUser)) {
if (provider === 'github') {
return await dbHelper.queryOneUserMappingByGithubUserId(models.GithubUserMapping, gitUser);
} else if (provider === 'gitlab') {
return await dbHelper.queryOneUserMappingByGitlabUserId(models.GitlabUserMapping, gitUser);
}
} else if (_.isString(gitUser) || v.isEmail(gitUser)) {
}
if (_.isString(gitUser) || v.isEmail(gitUser)) {
if (provider === 'github') {
return await dbHelper.queryOneUserMappingByGithubUsername(models.GithubUserMapping, gitUser);
} else if (provider === 'gitlab') {
return await dbHelper.queryOneUserMappingByGitlabUsername(models.GitlabUserMapping, gitUser);
}
}
if (_.isEmpty(criteria)) {
throw new Error('Can\'t find the TCUserName. Invalid gitUser.');
}
throw new Error('Can\'t find the TCUserName. Invalid gitUser.');
}

getTCUserName.schema = {
Expand All @@ -54,7 +52,7 @@ getTCUserName.schema = {
* gets the access token of repository's copilot/owner captured by Topcoder x tool
* @param {String} provider the repo provider
* @param {String} repoFullName the full name of repository
* @returns {String} the copilot/owner if exists
* @returns {Promise<String>} the copilot/owner if exists
*/
async function getRepositoryCopilotOrOwner(provider, repoFullName) {
Joi.attempt({provider, repoFullName}, getRepositoryCopilotOrOwner.schema);
Expand Down Expand Up @@ -96,10 +94,7 @@ async function getRepositoryCopilotOrOwner(provider, repoFullName) {
}

return {
accessToken: user.accessToken,
accessTokenExpiration: user.accessTokenExpiration,
refreshToken: user.refreshToken,
userProviderId: user.userProviderId,
...user,
topcoderUsername: userMapping.topcoderUsername
};
}
Expand Down
20 changes: 10 additions & 10 deletions utils/git-helper.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ class GitHelper {
await gitHubService.createComment(event.copilot, event.data.repository.full_name, issueNumber, comment);
} else if (event.provider === 'gitlab') {
const gitlabService = await GitlabService.create(event.copilot);
await gitlabService.createComment(event.copilot, event.data.repository, issueNumber, comment);
await gitlabService.createComment(event.data.repository, issueNumber, comment);
}
}

Expand All @@ -43,7 +43,7 @@ class GitHelper {
await gitHubService.addLabels(event.copilot, event.data.repository.full_name, issueNumber, labels);
} else if (event.provider === 'gitlab') {
const gitlabService = await GitlabService.create(event.copilot);
await gitlabService.addLabels(event.copilot, event.data.repository, issueNumber, labels);
await gitlabService.addLabels(event.data.repository, issueNumber, labels);
}
}

Expand All @@ -57,22 +57,22 @@ class GitHelper {
await gitHubService.changeState(event.copilot, event.data.repository.full_name, issue.number, 'open');
} else if (event.provider === 'gitlab') {
const gitlabService = await GitlabService.create(event.copilot);
await gitlabService.changeState(event.copilot, event.data.repository, issue.number, 'reopen');
await gitlabService.changeState(event.data.repository, issue.number, 'reopen');
}
}

/**
* Gets the user name by user id
* @param {Object} event the event
* @param {Number} assigneeUserId the user id
* @returns {String} the username
* @returns {Promise<String>} the username
*/
async getUsernameById(event, assigneeUserId) {
if (event.provider === 'github') {
return await gitHubService.getUsernameById(event.copilot, assigneeUserId);
} else if (event.provider === 'gitlab') {
const gitlabService = await GitlabService.create(event.copilot);
return await gitlabService.getUsernameById(event.copilot, assigneeUserId);
return await gitlabService.getUsernameById(assigneeUserId);
}
return null;
}
Expand All @@ -89,7 +89,7 @@ class GitHelper {
await gitHubService.removeAssign(event.copilot, event.data.repository.full_name, issueNumber, assigneeUsername);
} else if (event.provider === 'gitlab') {
const gitlabService = await GitlabService.create(event.copilot);
await gitlabService.removeAssign(event.copilot, event.data.repository, issueNumber, assigneeUserId);
await gitlabService.removeAssign(event.data.repository, issueNumber, assigneeUserId);
}
}

Expand All @@ -104,7 +104,7 @@ class GitHelper {
await gitHubService.updateIssue(event.copilot, event.data.repository.full_name, issueNumber, newTitle);
} else if (event.provider === 'gitlab') {
const gitlabService = await GitlabService.create(event.copilot);
await gitlabService.updateIssue(event.copilot, event.data.repository, issueNumber, newTitle);
await gitlabService.updateIssue(event.data.repository, issueNumber, newTitle);
}
}

Expand All @@ -120,7 +120,7 @@ class GitHelper {
} else if (event.provider === 'gitlab') {
const gitlabService = await GitlabService.create(event.copilot);
const userId = await gitlabService.getUserIdByLogin(event.copilot, assignedUser);
await gitlabService.assignUser(event.copilot, event.data.repository, issueNumber, userId);
await gitlabService.assignUser(event.data.repository, issueNumber, userId);
}
}

Expand All @@ -139,7 +139,7 @@ class GitHelper {
createCopilotPayments);
} else if (event.provider === 'gitlab') {
const gitlabService = await GitlabService.create(event.copilot);
await gitlabService.markIssueAsPaid(event.copilot, event.data.repository, issueNumber, challengeUUID, existLabels, winner,
await gitlabService.markIssueAsPaid(event.data.repository, issueNumber, challengeUUID, existLabels, winner,
createCopilotPayments);
} else if (event.provider === 'azure') {
await azureService.markIssueAsPaid(event.copilot, event.data.repository.full_name, issueNumber, challengeUUID, existLabels);
Expand Down Expand Up @@ -171,7 +171,7 @@ class GitHelper {
return await gitHubService.getUserIdByLogin(event.copilot, assignee);
} else if (event.provider === 'gitlab') {
const gitlabService = await GitlabService.create(event.copilot);
return gitlabService.getUserIdByLogin(event.copilot, assignee);
return gitlabService.getUserIdByLogin(assignee);
}
return null;
}
Expand Down
1 change: 0 additions & 1 deletion utils/kafka-consumer.js
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,6 @@ function tcxMessageHandler(messageSet, topic) {
// The event should be a JSON object
event = parsePayload(event);
try {
console.log(event);
event.message.value.payload.value = JSON.parse(event.message.value.payload.value);
} catch (e) {
logger.error('Invalid message payload', e);
Expand Down
2 changes: 1 addition & 1 deletion utils/notification.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
const config = require('config');

const kafkaSender = require('./kafka-sender');
const topcoderApiHelper = require('./topcoder-api-helper');
const logger = require('./logger');

const notification = {};
Expand All @@ -31,6 +30,7 @@ function getContent(repoPath) {
}

notification.sendTokenExpiredAlert = async function sendTokenExpiredAlert(copilotHandle, repoPath, provider) {
const topcoderApiHelper = await import('./topcoder-api-helper');
const copilotId = await topcoderApiHelper.getTopcoderMemberId(copilotHandle);
const notificationConfigs = config.MAIL_NOTICIATION;
const content = getContent(repoPath);
Expand Down
4 changes: 2 additions & 2 deletions utils/topcoder-api-helper.js
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ async function createProject(projectName) {
/**
* Create a new challenge.
* @param {Object} challenge the challenge to create
* @returns {Number} the created challenge id
* @returns {Promise<Number>} the created challenge id
*/
async function createChallenge(challenge) {
const apiKey = await getM2Mtoken();
Expand Down Expand Up @@ -268,7 +268,7 @@ async function getProjectBillingAccountId(id) {
/**
* gets the topcoder user id from handle
* @param {String} handle the topcoder handle
* @returns {Number} the user id
* @returns {Promise<Number>} the user id
*/
async function getTopcoderMemberId(handle) {
try {
Expand Down