134 lines
3.1 KiB
JavaScript
134 lines
3.1 KiB
JavaScript
/**
|
|
* Validation Utilities
|
|
*
|
|
* Функции для валидации данных.
|
|
*/
|
|
|
|
/**
|
|
* Валидация JSON строки
|
|
* @param {string} jsonString - JSON строка для валидации
|
|
* @returns {{valid: boolean, error: string|null, data: object|null}} Результат валидации
|
|
*/
|
|
export function validateJSON(jsonString) {
|
|
if (!jsonString || !jsonString.trim()) {
|
|
return {
|
|
valid: false,
|
|
error: 'JSON не может быть пустым',
|
|
data: null
|
|
}
|
|
}
|
|
|
|
try {
|
|
const data = JSON.parse(jsonString)
|
|
return {
|
|
valid: true,
|
|
error: null,
|
|
data
|
|
}
|
|
} catch (e) {
|
|
return {
|
|
valid: false,
|
|
error: `Ошибка парсинга JSON: ${e.message}`,
|
|
data: null
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Валидация формата логина (8 цифр)
|
|
* @param {string} login - Логин для проверки
|
|
* @returns {{valid: boolean, error: string|null}} Результат валидации
|
|
*/
|
|
export function validateLoginFormat(login) {
|
|
if (!login || !login.trim()) {
|
|
return {
|
|
valid: false,
|
|
error: 'Логин не может быть пустым'
|
|
}
|
|
}
|
|
|
|
if (!/^[0-9]{8}$/.test(login)) {
|
|
return {
|
|
valid: false,
|
|
error: 'Логин должен состоять из 8 цифр'
|
|
}
|
|
}
|
|
|
|
return {
|
|
valid: true,
|
|
error: null
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Валидация массива вопросов для запроса
|
|
* @param {Array} questions - Массив вопросов
|
|
* @returns {{valid: boolean, error: string|null}} Результат валидации
|
|
*/
|
|
export function validateQuestions(questions) {
|
|
if (!Array.isArray(questions)) {
|
|
return {
|
|
valid: false,
|
|
error: 'Вопросы должны быть массивом'
|
|
}
|
|
}
|
|
|
|
if (questions.length === 0) {
|
|
return {
|
|
valid: false,
|
|
error: 'Необходимо добавить хотя бы один вопрос'
|
|
}
|
|
}
|
|
|
|
for (let i = 0; i < questions.length; i++) {
|
|
const q = questions[i]
|
|
|
|
if (!q.body || typeof q.body !== 'string' || !q.body.trim()) {
|
|
return {
|
|
valid: false,
|
|
error: `Вопрос ${i + 1}: текст вопроса не может быть пустым`
|
|
}
|
|
}
|
|
|
|
if (typeof q.with_docs !== 'boolean') {
|
|
return {
|
|
valid: false,
|
|
error: `Вопрос ${i + 1}: поле with_docs должно быть boolean`
|
|
}
|
|
}
|
|
}
|
|
|
|
return {
|
|
valid: true,
|
|
error: null
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Валидация окружения
|
|
* @param {string} environment - Окружение для проверки
|
|
* @returns {{valid: boolean, error: string|null}} Результат валидации
|
|
*/
|
|
export function validateEnvironment(environment) {
|
|
const validEnvs = ['ift', 'psi', 'prod']
|
|
|
|
if (!environment) {
|
|
return {
|
|
valid: false,
|
|
error: 'Окружение не может быть пустым'
|
|
}
|
|
}
|
|
|
|
if (!validEnvs.includes(environment)) {
|
|
return {
|
|
valid: false,
|
|
error: `Недопустимое окружение. Разрешены: ${validEnvs.join(', ')}`
|
|
}
|
|
}
|
|
|
|
return {
|
|
valid: true,
|
|
error: null
|
|
}
|
|
}
|