64 lines
2.0 KiB
TypeScript
64 lines
2.0 KiB
TypeScript
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,
|
|
);
|
|
};
|