feat: add multi choice publish test validator

This commit is contained in:
2026-08-19 22:39:13 +03:30
parent ca8d02c531
commit ca88e6994e
4 changed files with 10 additions and 4 deletions
+3 -1
View File
@@ -14,7 +14,9 @@
"hasOrphanQuestions": "Test has some orphan questions.", "hasOrphanQuestions": "Test has some orphan questions.",
"hasCycle": "Test has cycle.", "hasCycle": "Test has cycle.",
"notEndingFlow": "Test include some flows which never end.", "notEndingFlow": "Test include some flows which never end.",
"notActiveTest": "Test is not active." "notActiveTest": "Test is not active.",
"multiChoiceMustHaveFallback": "Multi choice must have fallback.",
"questionHasMultipleFallbacks": "Question has multiple fallbacks."
}, },
"messages": { "messages": {
"createSuccess": "Test Created Successfully." "createSuccess": "Test Created Successfully."
+3 -1
View File
@@ -14,7 +14,9 @@
"hasOrphanQuestions": "تست شامل تعدادی سوال یتیم است.", "hasOrphanQuestions": "تست شامل تعدادی سوال یتیم است.",
"hasCycle": "تست شامل حلقه است.", "hasCycle": "تست شامل حلقه است.",
"notEndingFlow": "تست شامل جریان بی پایان است.", "notEndingFlow": "تست شامل جریان بی پایان است.",
"notActiveTest": "تست مورد نظر فعال نیست." "notActiveTest": "تست مورد نظر فعال نیست.",
"multiChoiceMustHaveFallback": "سوال چند انتخابی باید یک مسیر جایگزین داشته باشد.",
"questionHasMultipleFallbacks": "سوال چند جایگزین دارد!"
}, },
"messages": { "messages": {
"createSuccess": "تست با موفقیت ایجاد شد." "createSuccess": "تست با موفقیت ایجاد شد."
@@ -7,6 +7,7 @@ import { QuestionTransitionType } from '@/modules/questions/enums/question-trans
import { AppTimeoutException } from '@/common/exceptions/app-timeout.exception'; import { AppTimeoutException } from '@/common/exceptions/app-timeout.exception';
import { QuestionTransition } from '@/modules/questions/entities/question-transition.entity'; import { QuestionTransition } from '@/modules/questions/entities/question-transition.entity';
import { Question } from '@/modules/questions/entities/question.entity'; import { Question } from '@/modules/questions/entities/question.entity';
import { MultiChoiceTransitionValidator } from '../validators/multi-choice-transition.validator';
@Injectable() @Injectable()
export class PublishTestValidatorProvider { export class PublishTestValidatorProvider {
@@ -61,6 +62,8 @@ export class PublishTestValidatorProvider {
const startQuestionId = startTransitions[0].toQuestion!.id; const startQuestionId = startTransitions[0].toQuestion!.id;
MultiChoiceTransitionValidator.validate(test.questions, transitions);
const transitionsGraph = new Map<number, QuestionTransition[]>(); const transitionsGraph = new Map<number, QuestionTransition[]>();
this.createTransitionsGraph(transitions, transitionsGraph); this.createTransitionsGraph(transitions, transitionsGraph);
@@ -8,7 +8,7 @@ import { MultiChoiceCondition } from '@/modules/questions/interfaces/multi-choic
import { HttpStatus } from '@nestjs/common'; import { HttpStatus } from '@nestjs/common';
export class MultiChoiceTransitionValidator { export class MultiChoiceTransitionValidator {
public static validateMultiChoiceTransitions( public static validate(
questions: Question[], questions: Question[],
transitions: QuestionTransition[], transitions: QuestionTransition[],
) { ) {
@@ -29,7 +29,6 @@ export class MultiChoiceTransitionValidator {
continue; continue;
} }
// اگر transition شرطی داریم، باید fallback داشته باشیم.
const hasDefault = outgoing.some( const hasDefault = outgoing.some(
(t) => t.type === QuestionTransitionType.DEFAULT, (t) => t.type === QuestionTransitionType.DEFAULT,
); );