diff --git a/src/services/ChallengeService.js b/src/services/ChallengeService.js index 12f42ebf..2bf79f2f 100644 --- a/src/services/ChallengeService.js +++ b/src/services/ChallengeService.js @@ -1417,37 +1417,44 @@ async function validateWinners(winners, challengeResources) { * @param {Object} data the new input challenge data * @param {Array} challengeResources the challenge resources */ -function validateTaskSelfAssign(currentUser, challenge, data, challengeResources) { - if (currentUser.isMachine) { +function validateTask(currentUser, challenge, data, challengeResources) { + if (!_.get(challenge, "legacy.pureV5Task")) { + // Not a Task return; } - const finalStatus = data.status || challenge.status; + // Status from Draft -> Active, indicating launch a Task + const isLaunchTask = + data.status === constants.challengeStatuses.Active && + challenge.status === constants.challengeStatuses.Draft; - // Only validate when launch/complete a task - const isLaunchCompleteTask = - _.get(challenge, "legacy.pureV5Task") && - (finalStatus === constants.challengeStatuses.Active || - finalStatus === constants.challengeStatuses.Completed); - if (!isLaunchCompleteTask) { - return; + // Status from Active -> Completed, indicating complete a Task + const isCompleteTask = + data.status === constants.challengeStatuses.Completed && + challenge.status === constants.challengeStatuses.Active; + + // When complete a Task, input data should have winners + if (isCompleteTask && (!data.winners || !data.winners.length)) { + throw new errors.BadRequestError("The winners is required to complete a Task"); } - // Whether task is assigned to current user - const assignedToCurrentUser = - _.filter( - challengeResources, - (r) => - r.roleId === config.SUBMITTER_ROLE_ID && - _.toString(r.memberId) === _.toString(currentUser.userId) - ).length > 0; - - if (assignedToCurrentUser) { - throw new errors.ForbiddenError( - `You are not allowed to ${ - finalStatus === constants.challengeStatuses.Active ? "lanuch" : "complete" - } task assigned to yourself. Please contact manager to operate.` - ); + if (!currentUser.isMachine && (isLaunchTask || isCompleteTask)) { + // Whether task is assigned to current user + const assignedToCurrentUser = + _.filter( + challengeResources, + (r) => + r.roleId === config.SUBMITTER_ROLE_ID && + _.toString(r.memberId) === _.toString(currentUser.userId) + ).length > 0; + + if (assignedToCurrentUser) { + throw new errors.ForbiddenError( + `You are not allowed to ${ + data.status === constants.challengeStatuses.Active ? "lanuch" : "complete" + } task assigned to yourself. Please contact manager to operate.` + ); + } } } @@ -1485,7 +1492,7 @@ async function updateChallenge(currentUser, challengeId, data) { const challengeResources = await helper.getChallengeResources(challengeId); await validateChallengeUpdateRequest(currentUser, challenge, data, challengeResources); - validateTaskSelfAssign(currentUser, challenge, data, challengeResources); + validateTask(currentUser, challenge, data, challengeResources); let sendActivationEmail = false; let sendSubmittedEmail = false;