fix: fix bugs and structure
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
import { Question } from '@/modules/questions/entities/question.entity';
|
||||
import { AnswerSubmissionDTO } from '../dtos/answer-submission.dto';
|
||||
import { BadRequestException, HttpStatus } from '@nestjs/common';
|
||||
import { QuestionType } from '@/modules/questions/enums/question-type.enum';
|
||||
import { NumericMetadata } from '@/modules/questions/interfaces/numeric-metadata.interface';
|
||||
import { AppException } from '@/common/exceptions/app.exception';
|
||||
|
||||
export const checkAnswerCorrectness = (
|
||||
question: Question,
|
||||
answerSubmissionDto: AnswerSubmissionDTO,
|
||||
) => {
|
||||
if (!answerSubmissionDto) throw new BadRequestException();
|
||||
|
||||
const { choiceId, numericValue } = answerSubmissionDto;
|
||||
|
||||
if (question.type === QuestionType.NUMERIC) {
|
||||
if (numericValue === undefined) {
|
||||
throw new BadRequestException('submissions.errors.emptyNumericValue');
|
||||
}
|
||||
|
||||
const metadata = question.metadata as NumericMetadata;
|
||||
|
||||
if (
|
||||
metadata &&
|
||||
(numericValue < metadata.min || numericValue > metadata.max)
|
||||
) {
|
||||
throw new BadRequestException('submissions.errors.numericValueRange');
|
||||
}
|
||||
}
|
||||
|
||||
if (question.type === QuestionType.MULTI_CHOICE) {
|
||||
if (choiceId === undefined || choiceId === null) {
|
||||
throw new BadRequestException('submissions.errors.emptyChoiceId');
|
||||
}
|
||||
|
||||
if (!question.choices?.some((c) => c.id === choiceId)) {
|
||||
throw new AppException('validation.wrongField', HttpStatus.BAD_REQUEST, {
|
||||
field: '$t(submissions.fields.choiceId)',
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,63 @@
|
||||
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.MULTI_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,
|
||||
);
|
||||
};
|
||||
Reference in New Issue
Block a user