fix: fix bugs and structure

This commit is contained in:
2026-08-13 09:40:21 +03:30
parent c368948c4b
commit f6a57454f4
18 changed files with 630 additions and 590 deletions
@@ -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,
);
};