From 90e9d184c845df75c5805c585aeb4f6ad329943f Mon Sep 17 00:00:00 2001 From: Thomas Kranitsas Date: Fri, 17 Jun 2022 15:12:17 +0300 Subject: [PATCH] Support cancelling a challenge --- src/services/ProcessorService.js | 7 +++- src/services/legacyChallengeService.js | 50 ++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 src/services/legacyChallengeService.js diff --git a/src/services/ProcessorService.js b/src/services/ProcessorService.js index 19cbfdc..fec370f 100644 --- a/src/services/ProcessorService.js +++ b/src/services/ProcessorService.js @@ -18,6 +18,7 @@ const metadataService = require('./metadataService') const paymentService = require('./paymentService') const { createOrSetNumberOfReviewers } = require('./selfServiceReviewerService') const { disableTimelineNotifications } = require('./selfServiceNotificationService') +const legacyChallengeService = require('./legacyChallengeService') /** * Drop and recreate phases in ifx @@ -656,7 +657,6 @@ async function processMessage (message) { if (_.get(message, 'payload.legacy.selfService')) { await disableTimelineNotifications(legacyId, createdByUserId) // disable } - } logger.debug('Result from parsePayload:') @@ -734,6 +734,11 @@ async function processMessage (message) { } else { logger.info('Will skip syncing phases as the challenge is a task...') } + if (message.payload.status === constants.challengeStatuses.CancelledClientRequest && challenge.currentStatus !== constants.challengeStatuses.CancelledClientRequest) { + logger.info('Cancelling challenge...') + await legacyChallengeService.cancelChallenge(legacyId, updatedByUserId) + needSyncV4ES = true + } if (needSyncV4ES) { try { logger.info(`Resync V4 ES for the legacy challenge ${legacyId}`) diff --git a/src/services/legacyChallengeService.js b/src/services/legacyChallengeService.js new file mode 100644 index 0000000..97eb0a5 --- /dev/null +++ b/src/services/legacyChallengeService.js @@ -0,0 +1,50 @@ +/** + * Legacy Challenge Service + * Interacts with InformixDB + */ +const logger = require('../common/logger') +const util = require('util') +const helper = require('../common/helper') +const { createChallengeStatusesMap } = require('../constants') + +const QUERY_UPDATE_PROJECT = 'UPDATE project SET project_status_id = ?, modify_user = ? WHERE project_id = %d' + +/** + * Prepare Informix statement + * @param {Object} connection the Informix connection + * @param {String} sql the sql + * @return {Object} Informix statement + */ +async function prepare (connection, sql) { + // logger.debug(`Preparing SQL ${sql}`) + const stmt = await connection.prepareAsync(sql) + return Promise.promisifyAll(stmt) +} + +/** + * Update a challenge in IFX + * @param {Number} challengeLegacyId the legacy challenge ID + * @param {Number} createdBy the creator user ID + */ +async function cancelChallenge (challengeLegacyId, createdBy) { + const connection = await helper.getInformixConnection() + let result = null + try { + await connection.beginTransactionAsync() + const query = await prepare(connection, util.format(QUERY_UPDATE_PROJECT, challengeLegacyId)) + result = await query.executeAsync([createChallengeStatusesMap.CancelledClientRequest, createdBy]) + await connection.commitTransactionAsync() + } catch (e) { + logger.error(`Error in 'cancelChallenge' ${e}, rolling back transaction`) + await connection.rollbackTransactionAsync() + throw e + } finally { + logger.info(`Challenge ${challengeLegacyId} has been cancelled`) + await connection.closeAsync() + } + return result +} + +module.exports = { + cancelChallenge +}