2026-01-08 20:14:58 +00:00
|
|
|
|
import { randomUUID } from 'crypto';
|
|
|
|
|
|
|
|
|
|
|
|
interface Answer {
|
|
|
|
|
|
id?: string;
|
|
|
|
|
|
text: string;
|
|
|
|
|
|
points: number;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
interface Question {
|
|
|
|
|
|
id?: string;
|
|
|
|
|
|
text?: string;
|
|
|
|
|
|
answers: Answer[];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
2026-01-10 16:44:06 +00:00
|
|
|
|
* Проверяет, является ли строка валидным UUID
|
|
|
|
|
|
*/
|
|
|
|
|
|
function isValidUUID(id: string | number | undefined): boolean {
|
|
|
|
|
|
if (!id || typeof id !== 'string') {
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
// UUID v4 формат: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
|
|
|
|
|
|
const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
|
|
|
|
return uuidRegex.test(id);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Добавляет UUID к вопросам и ответам, если их нет или они невалидны
|
2026-01-08 20:14:58 +00:00
|
|
|
|
* @param questions - Массив вопросов
|
|
|
|
|
|
* @returns Массив вопросов с добавленными UUID
|
|
|
|
|
|
*/
|
|
|
|
|
|
export function ensureQuestionIds(questions: Question[]): Question[] {
|
|
|
|
|
|
return questions.map((question) => {
|
2026-01-10 16:44:06 +00:00
|
|
|
|
// Если ID нет или не является валидным UUID, создаем новый
|
|
|
|
|
|
const questionId = (question.id && isValidUUID(question.id)) ? question.id : randomUUID();
|
2026-01-10 18:01:01 +00:00
|
|
|
|
const questionText = question.text || '';
|
2026-01-08 20:14:58 +00:00
|
|
|
|
|
2026-01-10 16:44:06 +00:00
|
|
|
|
const answersWithIds = question.answers.map((answer) => {
|
|
|
|
|
|
// Если ID нет или не является валидным UUID, создаем новый
|
|
|
|
|
|
const answerId = (answer.id && isValidUUID(answer.id)) ? answer.id : randomUUID();
|
|
|
|
|
|
return {
|
|
|
|
|
|
...answer,
|
|
|
|
|
|
id: answerId,
|
|
|
|
|
|
};
|
|
|
|
|
|
});
|
2026-01-08 20:14:58 +00:00
|
|
|
|
|
2026-01-10 18:01:01 +00:00
|
|
|
|
// Удаляем поле question если оно было в исходном объекте
|
|
|
|
|
|
const { question: _, ...questionWithoutQuestion } = question;
|
|
|
|
|
|
|
2026-01-08 20:14:58 +00:00
|
|
|
|
return {
|
2026-01-10 18:01:01 +00:00
|
|
|
|
...questionWithoutQuestion,
|
2026-01-08 20:14:58 +00:00
|
|
|
|
id: questionId,
|
|
|
|
|
|
text: questionText,
|
|
|
|
|
|
answers: answersWithIds,
|
|
|
|
|
|
};
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|