From af05683986c6e76a8e22ba7382e92ac009ae3fbd Mon Sep 17 00:00:00 2001 From: Thomas Kranitsas Date: Sat, 13 Feb 2021 00:12:43 +0200 Subject: [PATCH 1/3] migration script for effort hours --- .../migrations/010-fix-effort-hours.js | 96 +++++++++++++++++++ src/services/challengeInformixService.js | 17 +++- 2 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 src/scripts/migrations/010-fix-effort-hours.js diff --git a/src/scripts/migrations/010-fix-effort-hours.js b/src/scripts/migrations/010-fix-effort-hours.js new file mode 100644 index 0000000..dfaae1b --- /dev/null +++ b/src/scripts/migrations/010-fix-effort-hours.js @@ -0,0 +1,96 @@ +/** + * Populate the following properties on the challenges: + * - metadata.effortHoursEstimate + * - metadata.effortHoursOffshore + * - metadata.effortHoursOnshore + */ +global.Promise = require('bluebird') + +const config = require('config') +const _ = require('lodash') +const logger = require('../../util/logger') +const challengeService = require('../../services/challengeService') +const { getESClient } = require('../../util/helper') +const { getEffortHoursFromIfx } = require('../../services/challengeInformixService') + +const mapping = { + effortHoursEstimate: 88, + effortHoursOffshore: 89, + effortHoursOnshore: 90 +} + +const migrationFunction = { + run: async () => { + const perPage = config.get('MIGRATION_SCRIPT_BATCH_SIZE') + let finish = false + let page = 0 + let batch = 1 + + while (!finish) { + logger.info(`Batch-${batch} - Loading challenges`) + const challenges = await getChallengesMissingData(page, perPage) + logger.info(`Found ${challenges.length} challenges`) + if (challenges.length > 0) { + for (const challenge of challenges) { + challenge.legacy.migration = 10 + const legacyData = await getEffortHoursFromIfx(challenge.legacyId) + if (legacyData.length > 0) { + _.keys(mapping, (key) => { + const v5Index = _.findIndex(challenge.metadata, meta => meta.name === key) + const legacyIndex = _.findIndex(legacyData, entry => entry.project_info_type_id === mapping[key]) + if (v5Index === -1) { + challenge.metadata.push({ + name: key, + value: legacyData[legacyIndex].value + }) + } else { + challenge.metadata[v5Index].value = legacyData[legacyIndex].value + } + }) + await challengeService.save(challenge) + } + } + } else { + finish = true + } + page++ + batch++ + } + } +} + +async function getChallengesMissingData (page = 0, perPage = 10) { + const esQuery = { + index: config.get('ES.CHALLENGE_ES_INDEX'), + type: config.get('ES.CHALLENGE_ES_TYPE'), + size: perPage, + from: page * perPage, + body: { + query: { + range: { + 'legacy.migration': { + lt: 10 + } + } + } + } + } + // logger.debug(`ES Query ${JSON.stringify(esQuery)}`) + // Search with constructed query + let docs + try { + docs = await getESClient().search(esQuery) + } catch (e) { + // Catch error when the ES is fresh and has no data + docs = { + hits: { + total: 0, + hits: [] + } + } + } + // Extract data from hits + return _.map(docs.hits.hits, item => (item._source)) +} + +module.exports = migrationFunction diff --git a/src/services/challengeInformixService.js b/src/services/challengeInformixService.js index a422b5d..205ceb9 100644 --- a/src/services/challengeInformixService.js +++ b/src/services/challengeInformixService.js @@ -4,6 +4,20 @@ const helper = require('../util/helper') // const getErrorService = require('./errorService') const { executeQueryAsync } = require('../util/informixWrapper') +/** + * Get effort hours for a legacyId + * @param {Number} legacyId the legacy ID + */ +async function getEffortHoursFromIfx (legacyId) { + const sql = `SELECT LIMIT 1 + project_info_type_id, + value, + FROM project_info + WHERE project_id = ${legacyId} and project_info_type_id in (88, 89, 90) + ` + return execQuery(sql) +} + /** * Gets the copilot payment for a legacyId * @param {Number} legacyId the legacy ID @@ -683,5 +697,6 @@ module.exports = { getCopilotPaymentFromIfx, createCopilotPaymentInIfx, updateCopilotPaymentInIfx, - deleteCopilotPaymentFromIfx + deleteCopilotPaymentFromIfx, + getEffortHoursFromIfx } From 2b519220a3ceac4608f6982406ef82457157e728 Mon Sep 17 00:00:00 2001 From: Thomas Kranitsas Date: Sat, 13 Feb 2021 00:16:44 +0200 Subject: [PATCH 2/3] support v4=>v5 sync of effort hours --- src/services/challengeService.js | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/services/challengeService.js b/src/services/challengeService.js index 3826651..e9ab7f6 100644 --- a/src/services/challengeService.js +++ b/src/services/challengeService.js @@ -756,6 +756,23 @@ async function buildV5Challenge (legacyId, challengeListing, challengeDetails) { }) metadata.push(..._.compact(allMetadata)) + const effortHoursMapping = { + effortHoursEstimate: 88, + effortHoursOffshore: 89, + effortHoursOnshore: 90 + } + + const legacyEffortHoursData = await challengeInformixService.getEffortHoursFromIfx(legacyId) + if (legacyEffortHoursData.length > 0) { + _.keys(effortHoursMapping, (key) => { + const legacyIndex = _.findIndex(legacyEffortHoursData, entry => entry.project_info_type_id === effortHoursMapping[key]) + metadata.push({ + name: key, + value: legacyEffortHoursData[legacyIndex].value + }) + }) + } + const events = [] if (challengeListing.events && challengeListing.events.length > 0) { for (const event of challengeListing.events) { From d9696f8a0ed7e0e16403620f2d73cc45e77d5d3b Mon Sep 17 00:00:00 2001 From: Thomas Kranitsas Date: Tue, 16 Feb 2021 00:22:12 +0200 Subject: [PATCH 3/3] V5 QA Challenge maps to V4 Dev Bug Hunt --- src/util/conversionMappings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/util/conversionMappings.js b/src/util/conversionMappings.js index e6bd8db..7298c81 100644 --- a/src/util/conversionMappings.js +++ b/src/util/conversionMappings.js @@ -135,7 +135,7 @@ module.exports = { [V5_TYPE_IDS.TASK]: () => buildV4Data(V4_TRACKS.DEVELOP, V4_SUBTRACKS.FIRST_2_FINISH, true) }, [V5_TRACK_IDS.QA]: { - [V5_TYPE_IDS.CHALLENGE]: () => buildV4Data(V4_TRACKS.DEVELOP, V4_SUBTRACKS.TEST_SUITES, false), + [V5_TYPE_IDS.CHALLENGE]: () => buildV4Data(V4_TRACKS.DEVELOP, V4_SUBTRACKS.BUG_HUNT, false), [V5_TYPE_IDS.FIRST_2_FINISH]: () => buildV4Data(V4_TRACKS.DEVELOP, V4_SUBTRACKS.FIRST_2_FINISH, false), [V5_TYPE_IDS.TASK]: () => buildV4Data(V4_TRACKS.DEVELOP, V4_SUBTRACKS.FIRST_2_FINISH, true) }