sto-k-odnomu/backend/src/utils/question-utils.ts

54 lines
1.6 KiB
TypeScript
Raw Normal View History

2026-01-08 20:14:58 +00:00
import { randomUUID } from 'crypto';
2026-01-10 19:03:40 +00:00
export interface Answer {
2026-01-08 20:14:58 +00:00
id?: string;
text: string;
points: number;
}
2026-01-10 19:03:40 +00:00
export interface Question {
2026-01-08 20:14:58 +00:00
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
return {
id: questionId,
text: questionText,
answers: answersWithIds,
};
});
}