From 8faf9ceaed6f51272fd6f49b5665d1fdeca6b1fd Mon Sep 17 00:00:00 2001 From: Justin Gasper Date: Wed, 12 Nov 2025 10:25:48 +1100 Subject: [PATCH] Allow for Topgear Submission type phase when calculating start / end dates --- src/common/challenge-helper.js | 6 ++++- src/common/prisma-helper.js | 40 ++++++++++++++++++++-------------- 2 files changed, 29 insertions(+), 17 deletions(-) diff --git a/src/common/challenge-helper.js b/src/common/challenge-helper.js index 5afef84..212ff40 100644 --- a/src/common/challenge-helper.js +++ b/src/common/challenge-helper.js @@ -12,6 +12,8 @@ const { hasAdminRole } = require("./role-helper"); const { ensureAcessibilityToModifiedGroups } = require("./group-helper"); const { ChallengeStatusEnum } = require("@prisma/client"); +const SUBMISSION_PHASE_PRIORITY = ["Topcoder Submission", "Submission"]; + class ChallengeHelper { /** * @param {Object} challenge the challenge object @@ -356,7 +358,9 @@ class ChallengeHelper { enrichChallengeForResponse(challenge, track, type, options = {}) { if (challenge.phases && challenge.phases.length > 0) { const registrationPhase = _.find(challenge.phases, (p) => p.name === "Registration"); - const submissionPhase = _.find(challenge.phases, (p) => p.name === "Submission"); + const submissionPhase = + _.find(challenge.phases, (p) => p.name === SUBMISSION_PHASE_PRIORITY[0]) || + _.find(challenge.phases, (p) => p.name === SUBMISSION_PHASE_PRIORITY[1]); // select last started open phase as current phase _.forEach(challenge.phases, (p) => { diff --git a/src/common/prisma-helper.js b/src/common/prisma-helper.js index b6b7ae1..9a49d1a 100644 --- a/src/common/prisma-helper.js +++ b/src/common/prisma-helper.js @@ -3,6 +3,8 @@ const Decimal = require("decimal.js"); const constants = require("../../app-constants"); const { PrizeSetTypeEnum } = require("@prisma/client"); const { dedupeChallengeTerms } = require("./helper"); + +const SUBMISSION_PHASE_PRIORITY = ["Topcoder Submission", "Submission"]; /** * Convert phases data to prisma model. * @@ -11,6 +13,7 @@ const { dedupeChallengeTerms } = require("./helper"); * @param {Object} auditFields createdBy and updatedBy */ function convertChallengePhaseSchema(challenge, result, auditFields) { + const phases = _.isArray(challenge.phases) ? challenge.phases : []; // keep phase data const phaseFields = [ "name", @@ -25,24 +28,29 @@ function convertChallengePhaseSchema(challenge, result, auditFields) { "challengeSource", ]; // current phase names - result.currentPhaseNames = _.map( - _.filter(challenge.phases, (p) => p.isOpen === true), - "name" - ); - // get registration date and submission date - _.forEach(challenge.phases, (p) => { - if (p.name === "Registration") { - result.registrationStartDate = p.actualStartDate || p.scheduledStartDate; - result.registrationEndDate = p.actualEndDate || p.scheduledEndDate; - } else if (p.name === "Submission") { - result.submissionStartDate = p.actualStartDate || p.scheduledStartDate; - result.submissionEndDate = p.actualEndDate || p.scheduledEndDate; - } - }); + result.currentPhaseNames = _.map(_.filter(phases, (p) => p.isOpen === true), "name"); + + const registrationPhase = _.find(phases, (p) => p.name === "Registration"); + const submissionPhase = + _.find(phases, (p) => p.name === SUBMISSION_PHASE_PRIORITY[0]) || + _.find(phases, (p) => p.name === SUBMISSION_PHASE_PRIORITY[1]); + + if (registrationPhase) { + result.registrationStartDate = + registrationPhase.actualStartDate || registrationPhase.scheduledStartDate; + result.registrationEndDate = + registrationPhase.actualEndDate || registrationPhase.scheduledEndDate; + } + if (submissionPhase) { + result.submissionStartDate = + submissionPhase.actualStartDate || submissionPhase.scheduledStartDate; + result.submissionEndDate = + submissionPhase.actualEndDate || submissionPhase.scheduledEndDate; + } // set phases array data - if (!_.isEmpty(challenge.phases)) { + if (!_.isEmpty(phases)) { result.phases = { - create: _.map(challenge.phases, (p) => { + create: _.map(phases, (p) => { const phaseData = { phase: { connect: { id: p.phaseId } }, ..._.pick(p, phaseFields),