import { Question } from '@/modules/questions/entities/question.entity'; import { AnswerSubmissionDTO } from '../dtos/answer-submission.dto'; import { QuestionTransitionType } from '@/modules/questions/enums/question-transition-type.enum'; import { QuestionType } from '@/modules/questions/enums/question-type.enum'; import { SingleChoiceCondition } from '@/modules/questions/interfaces/single-choice-condition.interface'; import { NumericCondition } from '@/modules/questions/interfaces/numeric-condition.interface'; import { AppException } from '@/common/exceptions/app.exception'; import { HttpStatus } from '@nestjs/common'; export const getNextTransition = ( question: Question, answerSubmissionDto: AnswerSubmissionDTO, ) => { const transitions = question.outgoingTransitions ?? []; const endTransition = transitions.find( (t) => t.type === QuestionTransitionType.END, ); if ( question.type === QuestionType.SINGLE_CHOICE && answerSubmissionDto.choiceId !== undefined ) { const transition = transitions.find( (t) => t.type === QuestionTransitionType.CHOICE && (t.condition as SingleChoiceCondition).choiceId === answerSubmissionDto.choiceId, ); if (transition) return transition; } if ( question.type === QuestionType.NUMERIC && answerSubmissionDto.numericValue !== undefined ) { const value = answerSubmissionDto.numericValue; const transition = transitions.find((t) => { if (t.type !== QuestionTransitionType.NUMBER_RANGE) return false; const condition = t.condition as NumericCondition; return value >= condition.min && value <= condition.max; }); if (transition) return transition; } const defaultTransition = transitions.find( (t) => t.type === QuestionTransitionType.DEFAULT, ); if (defaultTransition) return defaultTransition; if (endTransition) return endTransition; throw new AppException( 'submissions.errors.nextQuestionNotFound', HttpStatus.BAD_REQUEST, ); };