53 lines
1.6 KiB
TypeScript
53 lines
1.6 KiB
TypeScript
import { randomUUID } from 'crypto';
|
||
|
||
export interface Answer {
|
||
id?: string;
|
||
text: string;
|
||
points: number;
|
||
}
|
||
|
||
export interface Question {
|
||
id?: string;
|
||
text?: string;
|
||
answers: Answer[];
|
||
}
|
||
|
||
/**
|
||
* Проверяет, является ли строка валидным 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 к вопросам и ответам, если их нет или они невалидны
|
||
* @param questions - Массив вопросов
|
||
* @returns Массив вопросов с добавленными UUID
|
||
*/
|
||
export function ensureQuestionIds(questions: Question[]): Question[] {
|
||
return questions.map((question) => {
|
||
// Если ID нет или не является валидным UUID, создаем новый
|
||
const questionId = (question.id && isValidUUID(question.id)) ? question.id : randomUUID();
|
||
const questionText = question.text || '';
|
||
|
||
const answersWithIds = question.answers.map((answer) => {
|
||
// Если ID нет или не является валидным UUID, создаем новый
|
||
const answerId = (answer.id && isValidUUID(answer.id)) ? answer.id : randomUUID();
|
||
return {
|
||
...answer,
|
||
id: answerId,
|
||
};
|
||
});
|
||
|
||
return {
|
||
id: questionId,
|
||
text: questionText,
|
||
answers: answersWithIds,
|
||
};
|
||
});
|
||
}
|