152 lines
6.1 KiB
JavaScript
152 lines
6.1 KiB
JavaScript
/*
|
||
Сервис интеграции ПП Парус 8 с WEB API
|
||
Модуль ядра: вспомогательные функции
|
||
*/
|
||
|
||
//----------------------
|
||
// Подключение библиотек
|
||
//----------------------
|
||
|
||
const _ = require("lodash"); //Работа с массивами и объектами
|
||
const Schema = require("validate"); //Схемы валидации
|
||
const {
|
||
SERR_UNEXPECTED,
|
||
SMODULES_PATH_MODULES,
|
||
SERR_MODULES_NO_MODULE_SPECIFIED,
|
||
SERR_MODULES_BAD_INTERFACE
|
||
} = require("./constants"); //Глобавльные константы системы
|
||
const { ServerError } = require("./server_errors"); //Ошибка сервера
|
||
|
||
//------------
|
||
// Тело модуля
|
||
//------------
|
||
|
||
//Валидация объекта
|
||
const validateObject = (obj, schema, sObjName) => {
|
||
//Объявим результат
|
||
let sRes = "";
|
||
if (schema instanceof Schema) {
|
||
if (obj) {
|
||
const objTmp = _.cloneDeep(obj);
|
||
const errors = schema.validate(objTmp, { strip: false });
|
||
if (errors && Array.isArray(errors)) {
|
||
if (errors.length > 0) {
|
||
let a = errors.map(e => {
|
||
return e.message;
|
||
});
|
||
sRes =
|
||
"Объект" +
|
||
(sObjName ? " '" + sObjName + "' " : " ") +
|
||
"имеет некорректный формат: " +
|
||
_.uniq(a).join("; ");
|
||
}
|
||
} else {
|
||
sRes = "Неожиданный ответ валидатора";
|
||
}
|
||
} else {
|
||
sRes = "Объект" + (sObjName ? " '" + sObjName + "' " : " ") + "не указан";
|
||
}
|
||
} else {
|
||
sRes = "Ошибочный формат схемы валидации";
|
||
}
|
||
//Вернем результат
|
||
return sRes;
|
||
};
|
||
|
||
//Формирование полного пути к подключаемому модулю
|
||
const makeModuleFullPath = sModuleName => {
|
||
if (sModuleName) {
|
||
return SMODULES_PATH_MODULES + "/" + sModuleName;
|
||
} else {
|
||
return "";
|
||
}
|
||
};
|
||
|
||
//Формирование текста ошибки
|
||
const makeErrorText = e => {
|
||
let sErr = `${SERR_UNEXPECTED}: ${e.message}`;
|
||
if (e instanceof ServerError) sErr = `${e.sCode}: ${e.sMessage}`;
|
||
return sErr;
|
||
};
|
||
|
||
//Считывание наименования модуля-обработчика сервера приложений (ожидаемый формат - <МОДУЛЬ>/<ФУНКЦИЯ>)
|
||
const getAppSrvModuleName = sAppSrv => {
|
||
if (sAppSrv) {
|
||
if (sAppSrv instanceof String || typeof sAppSrv === "string") {
|
||
if (sAppSrv.indexOf("/") === -1) {
|
||
return null;
|
||
} else {
|
||
return sAppSrv.substring(0, sAppSrv.indexOf("/"));
|
||
}
|
||
} else {
|
||
return null;
|
||
}
|
||
} else {
|
||
return null;
|
||
}
|
||
};
|
||
|
||
//Считывание наименования функции модуля-обработчика сервера приложений (ожидаемый формат - <МОДУЛЬ>/<ФУНКЦИЯ>)
|
||
const getAppSrvFunctionName = sAppSrv => {
|
||
if (sAppSrv) {
|
||
if (sAppSrv instanceof String || typeof sAppSrv === "string") {
|
||
if (sAppSrv.indexOf("/") === -1) {
|
||
return null;
|
||
} else {
|
||
return sAppSrv.substring(sAppSrv.indexOf("/") + 1, sAppSrv.length);
|
||
}
|
||
} else {
|
||
return null;
|
||
}
|
||
} else {
|
||
return null;
|
||
}
|
||
};
|
||
|
||
//Получение функции обработчика
|
||
const getAppSrvFunction = sAppSrv => {
|
||
//Объявим формат (для сообщений об ошибках)
|
||
const sFormat = "(ожидаемый формат: <МОДУЛЬ>/<ФУНКЦИЯ>)";
|
||
//Проверим, что есть что разбирать
|
||
if (!sAppSrv)
|
||
throw new ServerError(SERR_MODULES_NO_MODULE_SPECIFIED, `Не указаны модуль и функция обработчика ${sFormat}`);
|
||
//Разбираем
|
||
try {
|
||
//Разбираем на модуль и функцию
|
||
let moduleName = getAppSrvModuleName(sAppSrv);
|
||
let funcName = getAppSrvFunctionName(sAppSrv);
|
||
//Проверим, что есть и то и другое
|
||
if (!moduleName) throw Error(`Обработчик ${sAppSrv} не указывает на модуль ${sFormat}`);
|
||
if (!funcName) throw Error(`Обработчик ${sAppSrv} не указывает на функцию ${sFormat}`);
|
||
//Подключаем модуль
|
||
let mdl = null;
|
||
try {
|
||
mdl = require(makeModuleFullPath(moduleName));
|
||
} catch (e) {
|
||
throw Error(
|
||
`Не удалось подключить модуль ${moduleName}, проверье что он существует и не имеет синтаксических ошибок. Ошибка подключения: ${
|
||
e.message
|
||
}`
|
||
);
|
||
}
|
||
//Проверяем, что в нём есть эта функция
|
||
if (!mdl[funcName]) throw Error(`Функция ${funcName} не определена в модуле ${moduleName}`);
|
||
//Проверяем, что функция асинхронна и если это так - возвращаем её
|
||
if ({}.toString.call(mdl[funcName]) === "[object AsyncFunction]") return mdl[funcName];
|
||
else throw Error(`Функция ${funcName} модуля ${moduleName} должна быть асинхронной`);
|
||
} catch (e) {
|
||
throw new ServerError(SERR_MODULES_BAD_INTERFACE, e.message);
|
||
}
|
||
};
|
||
|
||
//-----------------
|
||
// Интерфейс модуля
|
||
//-----------------
|
||
|
||
exports.validateObject = validateObject;
|
||
exports.makeModuleFullPath = makeModuleFullPath;
|
||
exports.makeErrorText = makeErrorText;
|
||
exports.getAppSrvModuleName = getAppSrvModuleName;
|
||
exports.getAppSrvFunctionName = getAppSrvFunctionName;
|
||
exports.getAppSrvFunction = getAppSrvFunction;
|