ЦИТК-1081. Доработка обработки запросов расширения "Оперативный учет" - кодирование пользовательской строки поиска
This commit is contained in:
parent
113871e82f
commit
5410aa4fb4
@ -9,6 +9,7 @@
|
|||||||
|
|
||||||
const xml2js = require("xml2js"); //Конвертация XML в JSON и JSON в XML
|
const xml2js = require("xml2js"); //Конвертация XML в JSON и JSON в XML
|
||||||
const { deepClone } = require("../core/utils"); //Вспомогательные функции
|
const { deepClone } = require("../core/utils"); //Вспомогательные функции
|
||||||
|
const { isRCMNRequest, prepareRCMNRequestForXml } = require("./rcmn"); //Оперативный учёт (RCMN)
|
||||||
|
|
||||||
//---------------------
|
//---------------------
|
||||||
// Глобальные константы
|
// Глобальные константы
|
||||||
@ -27,15 +28,6 @@ const SQUERY_RESP_CT = "SRESP_CT"; //Параметр URL-запроса для
|
|||||||
//Коды функций-обработчиков (согласно настройкам "Сервисов обмена")
|
//Коды функций-обработчиков (согласно настройкам "Сервисов обмена")
|
||||||
const SFNC_UPLOAD = "Upload"; //Функция загрузки
|
const SFNC_UPLOAD = "Upload"; //Функция загрузки
|
||||||
|
|
||||||
//Имена узлов/аргументов PWS-запроса
|
|
||||||
const SNODE_XREQUEST = "XREQUEST"; //Корневой узел запроса
|
|
||||||
const SNODE_XPAYLOAD = "XPAYLOAD"; //Полезная нагрузка запроса
|
|
||||||
const SNODE_XARGUMENTS = "XARGUMENTS"; //Коллекция аргументов
|
|
||||||
const SNODE_XARGUMENT = "XARGUMENT"; //Элемент аргумента
|
|
||||||
const SNODE_SNAME = "SNAME"; //Имя аргумента
|
|
||||||
const SNODE_VALUE = "VALUE"; //Значение аргумента
|
|
||||||
const SARG_SSEARCH = "SSEARCH"; //Аргумент строки поиска
|
|
||||||
|
|
||||||
//------------
|
//------------
|
||||||
// Тело модуля
|
// Тело модуля
|
||||||
//------------
|
//------------
|
||||||
@ -78,38 +70,6 @@ const converXMLArraysToJSON = (obj, arrayKey) => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
//Кодирование строки в Base64 (UTF-8)
|
|
||||||
const encodeBase64Utf8 = sValue => Buffer.from(sValue, "utf8").toString("base64");
|
|
||||||
|
|
||||||
//Получение полезной нагрузки запроса
|
|
||||||
const getRequestPayload = request => {
|
|
||||||
if (!request || typeof request !== "object") return null;
|
|
||||||
const xRequest = request[SNODE_XREQUEST];
|
|
||||||
if (!xRequest || typeof xRequest !== "object") return null;
|
|
||||||
const xPayload = xRequest[SNODE_XPAYLOAD];
|
|
||||||
if (!xPayload || typeof xPayload !== "object") return null;
|
|
||||||
return xPayload;
|
|
||||||
};
|
|
||||||
|
|
||||||
//Подготовка JSON-запроса перед конвертацией в XML
|
|
||||||
const prepareRequestForXml = request => {
|
|
||||||
//Получим полезную нагрузку запроса
|
|
||||||
const xPayload = getRequestPayload(request);
|
|
||||||
if (!xPayload) return request;
|
|
||||||
//Получим коллекцию аргументов
|
|
||||||
const xArguments = xPayload[SNODE_XARGUMENTS];
|
|
||||||
if (!Array.isArray(xArguments)) return request;
|
|
||||||
//Обработаем аргументы
|
|
||||||
for (let i = 0; i < xArguments.length; i++) {
|
|
||||||
const item = xArguments[i];
|
|
||||||
const arg = item && (item[SNODE_XARGUMENT] || item);
|
|
||||||
if (!arg || typeof arg !== "object" || arg[SNODE_SNAME] !== SARG_SSEARCH) continue;
|
|
||||||
if (arg[SNODE_VALUE] === undefined || arg[SNODE_VALUE] === null) continue;
|
|
||||||
arg[SNODE_VALUE] = encodeBase64Utf8(arg[SNODE_VALUE]);
|
|
||||||
}
|
|
||||||
return request;
|
|
||||||
};
|
|
||||||
|
|
||||||
//Обработчик "До" для полученного сообщения
|
//Обработчик "До" для полученного сообщения
|
||||||
const before = async prms => {
|
const before = async prms => {
|
||||||
//Если пришел запрос в JSON
|
//Если пришел запрос в JSON
|
||||||
@ -118,7 +78,8 @@ const before = async prms => {
|
|||||||
let requestXML = "";
|
let requestXML = "";
|
||||||
try {
|
try {
|
||||||
let request = JSON.parse(prms.queue.blMsg.toString());
|
let request = JSON.parse(prms.queue.blMsg.toString());
|
||||||
request = prepareRequestForXml(request);
|
//Если запрос относится к расширению "Оперативный учёт" - подготовим его
|
||||||
|
if (isRCMNRequest(request)) request = prepareRCMNRequestForXml(request);
|
||||||
let builder = new xml2js.Builder();
|
let builder = new xml2js.Builder();
|
||||||
requestXML = builder.buildObject(request);
|
requestXML = builder.buildObject(request);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
|||||||
85
modules/rcmn.js
Normal file
85
modules/rcmn.js
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
/*
|
||||||
|
Сервис интеграции ПП Парус 8 с WEB API
|
||||||
|
Дополнительный модуль: Оперативный учёт (RCMN)
|
||||||
|
*/
|
||||||
|
|
||||||
|
//---------------------
|
||||||
|
// Глобальные константы
|
||||||
|
//---------------------
|
||||||
|
|
||||||
|
//Имена узлов/аргументов PWS-запроса
|
||||||
|
const SNODE_XREQUEST = "XREQUEST"; //Корневой узел запроса
|
||||||
|
const SNODE_XPAYLOAD = "XPAYLOAD"; //Полезная нагрузка запроса
|
||||||
|
const SNODE_XARGUMENTS = "XARGUMENTS"; //Коллекция аргументов
|
||||||
|
const SNODE_XARGUMENT = "XARGUMENT"; //Элемент аргумента
|
||||||
|
const SNODE_SNAME = "SNAME"; //Имя аргумента
|
||||||
|
const SNODE_VALUE = "VALUE"; //Значение аргумента
|
||||||
|
const SNODE_SSTORED = "SSTORED"; //Имя вызываемой хранимой процедуры
|
||||||
|
const SARG_SSEARCH = "SSEARCH"; //Аргумент строки поиска
|
||||||
|
|
||||||
|
//Пакет и хранимые процедуры расширения "Оперативный учёт"
|
||||||
|
const SPACKAGE_RCMN = "PKG_EXS_EXT_RCMN"; //Пакет расширения
|
||||||
|
const SSTORED_CLASSES_GET = "PKG_EXS_EXT_RCMN.CLASSES_GET"; //Получение списка классов
|
||||||
|
const SSTORED_OBJECTS_GET = "PKG_EXS_EXT_RCMN.OBJECTS_GET"; //Получение списка объектов
|
||||||
|
const SSTORED_DICT_RECS_GET = "PKG_EXS_EXT_RCMN.DICT_RECS_GET"; //Получение данных словаря
|
||||||
|
const RSTORED_SSEARCH_BASE64 = [SSTORED_CLASSES_GET, SSTORED_OBJECTS_GET, SSTORED_DICT_RECS_GET]; //Процедуры, для которых SSEARCH кодируется в Base64
|
||||||
|
|
||||||
|
//------------
|
||||||
|
// Тело модуля
|
||||||
|
//------------
|
||||||
|
|
||||||
|
//Кодирование строки в Base64 (UTF-8)
|
||||||
|
const encodeBase64Utf8 = sValue => Buffer.from(sValue, "utf8").toString("base64");
|
||||||
|
|
||||||
|
//Получение полезной нагрузки запроса
|
||||||
|
const getRequestPayload = request => {
|
||||||
|
if (!request || typeof request !== "object") return null;
|
||||||
|
const xRequest = request[SNODE_XREQUEST];
|
||||||
|
if (!xRequest || typeof xRequest !== "object") return null;
|
||||||
|
const xPayload = xRequest[SNODE_XPAYLOAD];
|
||||||
|
if (!xPayload || typeof xPayload !== "object") return null;
|
||||||
|
return xPayload;
|
||||||
|
};
|
||||||
|
|
||||||
|
//Получение имени хранимой процедуры из запроса
|
||||||
|
const getRequestStored = request => {
|
||||||
|
const xPayload = getRequestPayload(request);
|
||||||
|
if (!xPayload) return null;
|
||||||
|
const sStored = xPayload[SNODE_SSTORED];
|
||||||
|
return typeof sStored === "string" ? sStored : null;
|
||||||
|
};
|
||||||
|
|
||||||
|
//Проверка, что запрос относится к пакету расширения "Оперативный учёт"
|
||||||
|
const isRCMNRequest = request => {
|
||||||
|
const sStored = getRequestStored(request);
|
||||||
|
if (!sStored) return false;
|
||||||
|
return sStored === SPACKAGE_RCMN || sStored.startsWith(SPACKAGE_RCMN + ".");
|
||||||
|
};
|
||||||
|
|
||||||
|
//Подготовка JSON-запроса расширения "Оперативный учёт" перед конвертацией в XML
|
||||||
|
const prepareRCMNRequestForXml = request => {
|
||||||
|
//Получим полезную нагрузку запроса
|
||||||
|
const xPayload = getRequestPayload(request);
|
||||||
|
if (!xPayload) return request;
|
||||||
|
//Проверим, что указана поддерживаемая хранимая процедура
|
||||||
|
if (RSTORED_SSEARCH_BASE64.indexOf(xPayload[SNODE_SSTORED]) < 0) return request;
|
||||||
|
//Получим коллекцию аргументов
|
||||||
|
const xArguments = xPayload[SNODE_XARGUMENTS];
|
||||||
|
if (!Array.isArray(xArguments)) return request;
|
||||||
|
//Закодируем в Base64 значение аргумента SSEARCH (если есть)
|
||||||
|
for (let i = 0; i < xArguments.length; i++) {
|
||||||
|
const item = xArguments[i];
|
||||||
|
const arg = item && (item[SNODE_XARGUMENT] || item);
|
||||||
|
if (!arg || typeof arg !== "object" || arg[SNODE_SNAME] !== SARG_SSEARCH) continue;
|
||||||
|
if (arg[SNODE_VALUE] === undefined || arg[SNODE_VALUE] === null) continue;
|
||||||
|
arg[SNODE_VALUE] = encodeBase64Utf8(arg[SNODE_VALUE]);
|
||||||
|
}
|
||||||
|
return request;
|
||||||
|
};
|
||||||
|
|
||||||
|
//-----------------
|
||||||
|
// Интерфейс модуля
|
||||||
|
//-----------------
|
||||||
|
|
||||||
|
exports.isRCMNRequest = isRCMNRequest;
|
||||||
|
exports.prepareRCMNRequestForXml = prepareRCMNRequestForXml;
|
||||||
Loading…
x
Reference in New Issue
Block a user