154 lines
5.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
Сервис интеграции ПП Парус 8 с WEB API
Модуль ядра: вспомогательные функции
*/
//----------------------
// Подключение библиотек
//----------------------
const Schema = require("validate"); //Схемы валидации
const { SMODULES_PATH_EX } = require("../core/constants.js"); //Глобавльные константы системы
//------------
// Тело модуля
//------------
//Проверка на функцию
const isFunction = fnToCheck => {
let sFn = {}.toString.call(fnToCheck);
return fnToCheck && (sFn === "[object Function]" || sFn === "[object AsyncFunction]");
};
//Проверка объекта на наличие списка функций
const haveFunctions = (obj, list) => {
//Объявим результат
let bRes = true;
//Если есть что проверять
if (obj && list) {
//И если пришел массив наименований функций
if (Array.isArray(list)) {
list.forEach(sFnName => {
if (!isFunction(obj[sFnName])) bRes = false;
});
} else {
bRes = false;
}
} else {
bRes = false;
}
//Вернем результат
return bRes;
};
//Проверка корректности интерфейса модуля
const checkModuleInterface = (module, interface) => {
//Объявим результат
let bRes = true;
//Если есть что проверять
if (module && interface) {
//Eсли есть список функций
if (interface.functions) {
//Проверим их наличие
bRes = haveFunctions(module, interface.functions);
} else {
bRes = false;
}
} else {
bRes = false;
}
//Вернем результат
return bRes;
};
//Валидация объекта
const validateObject = (obj, schema, sObjName) => {
//Объявим результат
let sRes = "";
if (schema instanceof Schema) {
const errors = schema.validate(obj);
if (errors && Array.isArray(errors)) {
if (errors.length > 0) {
let a = errors.map(e => {
return e.message;
});
sRes =
"Объект" + (sObjName ? " '" + sObjName + "' " : " ") + "имеет некорректный формат: " + a.join("; ");
}
} else {
sRes = "Неожиданный ответ валидатора";
}
} else {
sRes = "Ошибочный формат схемы валидации";
}
//Вернем результат
return sRes;
};
//Проверка корректности полей объекта
const checkObject = (obj, interface) => {
//Объявим результат
let sRes = "";
//Если есть что проверять
if (obj && interface) {
//Eсли есть список полей для проверки
if (interface.fields) {
if (Array.isArray(interface.fields)) {
let noFields = [];
let noValues = [];
//Обходим проверяемые поля
interface.fields.forEach(fld => {
//Проверим наличие поля в объекте (только для обязательных)
if (fld.bRequired && !(fld.sName in obj)) {
//Поля нет
noFields.push(fld.sName);
} else {
//Поле есть, проверим наличие значения
if (
fld.bRequired &&
(obj[fld.sName] === "undefined" || obj[fld.sName] === null || obj[fld.sName] === "")
)
//Обязательное поле не содержит значения
noValues.push(fld.sName);
}
});
//Сформируем итоговое сообщение
if (noFields.length > 0) sRes = "Объект не содержит полей: " + noFields.join(", ");
if (noValues.length > 0)
sRes +=
(sRes == "" ? "" : "; ") +
"Обязательные поля объекта не имеют значений: " +
noValues.join(", ");
} else {
sRes = "Список проверяемых полей объекта не является массивом";
}
} else {
sRes = "Не указан список проверяемых полей объекта";
}
} else {
sRes = "Не указан проверяемый объект и/или его интерфейс";
}
//Вернем результат
return sRes;
};
//Формирование полного пути к подключаемому модулю
const makeModuleFullPath = sModuleName => {
if (sModuleName) {
return SMODULES_PATH_EX + "/" + sModuleName;
} else {
return "";
}
};
//-----------------
// Интерфейс модуля
//-----------------
exports.isFunction = isFunction;
exports.haveFunctions = haveFunctions;
exports.checkModuleInterface = checkModuleInterface;
exports.validateObject = validateObject;
exports.checkObject = checkObject;
exports.makeModuleFullPath = makeModuleFullPath;