diff --git a/services/GitlabService.js b/services/GitlabService.js index 9932da7..dccb512 100644 --- a/services/GitlabService.js +++ b/services/GitlabService.js @@ -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); } } } diff --git a/services/IssueService.js b/services/IssueService.js index 0d24826..a845f6c 100755 --- a/services/IssueService.js +++ b/services/IssueService.js @@ -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. @@ -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); @@ -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() @@ -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})) @@ -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); } @@ -575,7 +575,6 @@ async function handleIssueClose(event, issue) { // eslint-disable-line } } - /** * handles the issue create event * @param {Object} event the event @@ -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 }); @@ -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); } diff --git a/services/UserService.js b/services/UserService.js index 71379e7..e2f0260 100755 --- a/services/UserService.js +++ b/services/UserService.js @@ -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 = { @@ -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); @@ -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 }; } diff --git a/utils/git-helper.js b/utils/git-helper.js index 2c90631..36e1e79 100644 --- a/utils/git-helper.js +++ b/utils/git-helper.js @@ -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); } } @@ -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); } } @@ -57,7 +57,7 @@ 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'); } } @@ -65,14 +65,14 @@ class GitHelper { * 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; } @@ -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); } } @@ -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); } } @@ -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); } } @@ -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); @@ -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; } diff --git a/utils/kafka-consumer.js b/utils/kafka-consumer.js index fe061bc..4b76f05 100644 --- a/utils/kafka-consumer.js +++ b/utils/kafka-consumer.js @@ -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); diff --git a/utils/notification.js b/utils/notification.js index f294275..de788a1 100644 --- a/utils/notification.js +++ b/utils/notification.js @@ -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 = {}; @@ -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); diff --git a/utils/topcoder-api-helper.js b/utils/topcoder-api-helper.js index 1ba3092..58b05ca 100644 --- a/utils/topcoder-api-helper.js +++ b/utils/topcoder-api-helper.js @@ -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(); @@ -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 {