ЦИТК-560 - ключ разработчика в отдельном файле, расширенная обработка ошибок сервера ДИАДОК

This commit is contained in:
Mikhail Chechnev 2022-11-21 23:59:39 +03:00
parent a1cad96d81
commit 2812ce60af
2 changed files with 90 additions and 67 deletions

View File

@ -10,7 +10,7 @@
const xml2js = require("xml2js"); //Конвертация XML в JSON и JSON в XML const xml2js = require("xml2js"); //Конвертация XML в JSON и JSON в XML
const _ = require("lodash"); //Работа с коллекциями и объектами const _ = require("lodash"); //Работа с коллекциями и объектами
const rqp = require("request-promise"); //Работа с HTTP/HTTPS запросами const rqp = require("request-promise"); //Работа с HTTP/HTTPS запросами
const Ddauth_Api_Client_Id = "citk-5d8e1345-3f33-496b-a878-9309011dd6c9"; //Ключ разработчика const { SDDAUTH_API_CLIENT_ID } = require("./diadoc_config"); //Ключ разработчика
//--------------------- //---------------------
// Глобальные константы // Глобальные константы
@ -76,21 +76,34 @@ const addHours = (dDate, nHours) => {
return new Date(dDate); return new Date(dDate);
}; };
//Проверка ключа разработчика
const checkAPIClientId = sAPIClientId => {
if (!sAPIClientId) {
throw new Error('Не задан ключ разработчика. Запросите его у поставщика услуг ЭДО "ДИАДОК" и укажите в "./modules/diadoc_config.js".');
}
};
//Формиорвание заголовка сообщения
const buildHeaders = (sAPIClientId, sToken = null) => ({
"Content-type": "application/json; charset=utf-8",
Authorization: `DiadocAuth ddauth_api_client_id=${sAPIClientId}${sToken ? `,ddauth_token=${sToken}` : ""}`,
Accept: "application/json; charset=utf-8"
});
//Обработчик "До" подключения к сервису //Обработчик "До" подключения к сервису
const beforeConnect = async prms => { const beforeConnect = async prms => {
//Подготовим параметры аутентификации //Подготовим параметры аутентификации
const loginAtribute = "login"; const loginAtribute = "login";
const passAtribute = "password"; const passAtribute = "password";
let surl = prms.options.url;
surl = surl + "?" + "type=password";
//Проверим ключ разработчика
checkAPIClientId(SDDAUTH_API_CLIENT_ID);
//Сформируем запрос на аутентификацию //Сформируем запрос на аутентификацию
return { return {
options: { options: {
qs: { headers: buildHeaders(SDDAUTH_API_CLIENT_ID),
type: "password" url: surl,
},
headers: {
"content-type": "application/json;charset=utf-8",
Authorization: "DiadocAuth ddauth_api_client_id=" + Ddauth_Api_Client_Id
},
body: JSON.stringify({ body: JSON.stringify({
[loginAtribute]: prms.service.sSrvUser, [loginAtribute]: prms.service.sSrvUser,
[passAtribute]: prms.service.sSrvPass [passAtribute]: prms.service.sSrvPass
@ -104,7 +117,7 @@ const beforeConnect = async prms => {
const afterConnect = async prms => { const afterConnect = async prms => {
//Если пришла ошибка //Если пришла ошибка
if (prms.optionsResp.statusCode != 200) { if (prms.optionsResp.statusCode != 200) {
throw new Error(prms.queue.blRes.toString()); throw new Error(prms.queue.blResp.toString());
} else { } else {
//Сохраним полученный токен доступа в контекст сервиса //Сохраним полученный токен доступа в контекст сервиса
return { return {
@ -117,6 +130,9 @@ const afterConnect = async prms => {
//Обработчик "До" отправки запроса на экспорт документа к сервису "ДИАДОК" //Обработчик "До" отправки запроса на экспорт документа к сервису "ДИАДОК"
const beforeMessagePost = async prms => { const beforeMessagePost = async prms => {
//Проверим ключ разработчика
checkAPIClientId(SDDAUTH_API_CLIENT_ID);
//Формируем запрос
try { try {
//Считаем токен доступа из контекста сервиса //Считаем токен доступа из контекста сервиса
let sToken = null; let sToken = null;
@ -130,21 +146,25 @@ const beforeMessagePost = async prms => {
//Формируем запрос для получения FromBoxId //Формируем запрос для получения FromBoxId
let rqpoptions = { let rqpoptions = {
uri: "https://diadoc-api.kontur.ru/GetMyOrganizations", uri: "https://diadoc-api.kontur.ru/GetMyOrganizations",
headers: { headers: buildHeaders(SDDAUTH_API_CLIENT_ID, sToken),
"Content-type": "application/json; charset=utf-8",
Authorization: "DiadocAuth ddauth_api_client_id=" + Ddauth_Api_Client_Id + ",ddauth_token=" + sToken,
Accept: "application/json; charset=utf-8"
},
json: true json: true
}; };
let serverResp;
try {
//Выполним запрос //Выполним запрос
let serverResp = await rqp(rqpoptions); serverResp = await rqp(rqpoptions);
//Не удалось получить ящик отправителя //Не удалось получить ящик отправителя
if (!serverResp.Organizations[0].Boxes[0].BoxId) { if (!serverResp.Organizations[0].Boxes[0].BoxId) {
throw new Error("Не удалось получить ящик отправителя"); throw new Error("Не удалось получить ящик отправителя");
} }
//Сохраняем полученный ответ //Сохраняем полученный ответ
obj.FromBoxId = serverResp.Organizations[0].Boxes[0].BoxId; obj.FromBoxId = serverResp.Organizations[0].Boxes[0].BoxId;
} catch (e) {
throw Error(`Не удалось получить ящик отправителя: ${e.message}`);
}
//Очистим предыдущий запрос
rqpoptions = null;
serverResp = null;
//Формируем запрос для получения ToBoxId //Формируем запрос для получения ToBoxId
rqpoptions = { rqpoptions = {
uri: "https://diadoc-api.kontur.ru/GetOrganizationsByInnKpp", uri: "https://diadoc-api.kontur.ru/GetOrganizationsByInnKpp",
@ -152,21 +172,21 @@ const beforeMessagePost = async prms => {
inn: prms.options.inn, inn: prms.options.inn,
kpp: prms.options.kpp kpp: prms.options.kpp
}, },
headers: { headers: buildHeaders(SDDAUTH_API_CLIENT_ID, sToken),
"Content-type": "application/json; charset=utf-8",
Authorization: "DiadocAuth ddauth_api_client_id=" + Ddauth_Api_Client_Id + ",ddauth_token=" + sToken,
Accept: "application/json; charset=utf-8"
},
json: true json: true
}; };
try {
//Выполним запрос //Выполним запрос
serverResp = await rqp(rqpoptions); serverResp = await rqp(rqpoptions);
//Не удалось получить ящик получателя //Не удалось получить ящик получателя
if (!serverResp.Organizations[0].Boxes[0].BoxId) { if (!serverResp.Organizations[0].Boxes[0].BoxId) {
throw new Error("Не удалось получить ящик получателя"); throw new Error(`Не удалось получить ящик получателя для контрагента с ИНН: ${prms.options.inn} и КПП: ${prms.options.kpp}`);
} }
//Сохраняем полученный ответ //Сохраняем полученный ответ
obj.ToBoxId = serverResp.Organizations[0].Boxes[0].BoxId; obj.ToBoxId = serverResp.Organizations[0].Boxes[0].BoxId;
} catch (e) {
throw Error(`Не удалось получить ящик получателя для контрагента с ИНН: ${prms.options.inn} и КПП: ${prms.options.kpp}: ${e.message}`);
}
//Если пришел ответ //Если пришел ответ
if (prms.queue.blResp && serverResp.statusCode == 200) { if (prms.queue.blResp && serverResp.statusCode == 200) {
//Вернем загруженный документ //Вернем загруженный документ
@ -177,11 +197,7 @@ const beforeMessagePost = async prms => {
//Собираем и отдаём общий результат работы //Собираем и отдаём общий результат работы
return { return {
options: { options: {
headers: { headers: buildHeaders(SDDAUTH_API_CLIENT_ID, sToken),
"Content-type": "application/json; charset=utf-8",
Authorization: "DiadocAuth ddauth_api_client_id=" + Ddauth_Api_Client_Id + ",ddauth_token=" + sToken,
Accept: "application/json; charset=utf-8"
},
simple: false simple: false
}, },
blMsg: Buffer.from(JSON.stringify(obj)) blMsg: Buffer.from(JSON.stringify(obj))
@ -218,6 +234,9 @@ const afterMessagePost = async prms => {
//Обработчик "До" отправки запроса на экспорт патча документа к сервису "ДИАДОК" //Обработчик "До" отправки запроса на экспорт патча документа к сервису "ДИАДОК"
const beforeMessagePatchPost = async prms => { const beforeMessagePatchPost = async prms => {
//Проверим ключ разработчика
checkAPIClientId(SDDAUTH_API_CLIENT_ID);
//Формируем запрос
try { try {
//Считаем токен доступа из контекста сервиса //Считаем токен доступа из контекста сервиса
let sToken = null; let sToken = null;
@ -231,11 +250,7 @@ const beforeMessagePatchPost = async prms => {
//Собираем и отдаём общий результат работы //Собираем и отдаём общий результат работы
return { return {
options: { options: {
headers: { headers: buildHeaders(SDDAUTH_API_CLIENT_ID, sToken),
"Content-type": "application/json; charset=utf-8",
Authorization: "DiadocAuth ddauth_api_client_id=" + Ddauth_Api_Client_Id + ",ddauth_token=" + sToken,
Accept: "application/json; charset=utf-8"
},
simple: false simple: false
}, },
blMsg: Buffer.from(JSON.stringify(obj)) blMsg: Buffer.from(JSON.stringify(obj))
@ -247,11 +262,11 @@ const beforeMessagePatchPost = async prms => {
//Обработчик "После" запроса на экспорт патча документа к сервису "ДИАДОК" //Обработчик "После" запроса на экспорт патча документа к сервису "ДИАДОК"
const afterMessagePatchPost = async prms => { const afterMessagePatchPost = async prms => {
//Преобразуем JSON ответ сервиса "ДИАДОК" в XML, понятный "Парус 8"
let resu = null; let resu = null;
//Действие выполнено успешно //Действие выполнено успешно
if (prms.optionsResp.statusCode == 200) { if (prms.optionsResp.statusCode == 200) {
try { try {
//Преобразуем JSON ответ сервиса "ДИАДОК" в XML, понятный "Парус 8"
resu = toXML(JSON.parse(prms.queue.blResp.toString())); resu = toXML(JSON.parse(prms.queue.blResp.toString()));
} catch (e) { } catch (e) {
throw new Error(`Неожиданный ответ сервера ЭДО "ДИАДОК". Ошибка интерпретации: ${e.message}`); throw new Error(`Неожиданный ответ сервера ЭДО "ДИАДОК". Ошибка интерпретации: ${e.message}`);
@ -272,6 +287,9 @@ const afterMessagePatchPost = async prms => {
//Обработчик "До" отправки запроса на получение новых событий к сервису "ДИАДОК" //Обработчик "До" отправки запроса на получение новых событий к сервису "ДИАДОК"
const beforeEvent = async prms => { const beforeEvent = async prms => {
//Проверим ключ разработчика
checkAPIClientId(SDDAUTH_API_CLIENT_ID);
//Формируем запрос
try { try {
//Считаем токен доступа из контекста сервиса //Считаем токен доступа из контекста сервиса
let sToken = null; let sToken = null;
@ -283,11 +301,7 @@ const beforeEvent = async prms => {
//Формируем запрос для получения BoxId //Формируем запрос для получения BoxId
let rqpoptions = { let rqpoptions = {
uri: "https://diadoc-api.kontur.ru/GetMyOrganizations", uri: "https://diadoc-api.kontur.ru/GetMyOrganizations",
headers: { headers: buildHeaders(SDDAUTH_API_CLIENT_ID, sToken),
"Content-type": "application/json; charset=utf-8",
Authorization: "DiadocAuth ddauth_api_client_id=" + Ddauth_Api_Client_Id + ",ddauth_token=" + sToken,
Accept: "application/json; charset=utf-8"
},
json: true json: true
}; };
//Выполним запрос //Выполним запрос
@ -317,11 +331,7 @@ const beforeEvent = async prms => {
//Собираем и отдаём общий результат работы //Собираем и отдаём общий результат работы
return { return {
options: { options: {
headers: { headers: buildHeaders(SDDAUTH_API_CLIENT_ID, sToken),
"Content-type": "application/json; charset=utf-8",
Authorization: "DiadocAuth ddauth_api_client_id=" + Ddauth_Api_Client_Id + ",ddauth_token=" + sToken,
Accept: "application/json; charset=utf-8"
},
simple: false, simple: false,
url: surl, url: surl,
boxId: serverResp.Organizations[0].Boxes[0].BoxId boxId: serverResp.Organizations[0].Boxes[0].BoxId
@ -335,17 +345,23 @@ const beforeEvent = async prms => {
//Обработчик "После" запроса на получение новых событий к сервису "ДИАДОК" //Обработчик "После" запроса на получение новых событий к сервису "ДИАДОК"
const afterEvent = async prms => { const afterEvent = async prms => {
//Преобразуем JSON ответ сервиса "ДИАДОК" в XML, понятный "Парус 8"
let resu = null; let resu = null;
if (prms.queue.blResp) { //Действие выполнено успешно
if (prms.optionsResp.statusCode == 200) {
try { try {
//Преобразуем JSON ответ сервиса "ДИАДОК" в XML, понятный "Парус 8"
resu = toXML({ root: JSON.parse(prms.queue.blResp.toString()) }); resu = toXML({ root: JSON.parse(prms.queue.blResp.toString()) });
} catch (e) { } catch (e) {
throw new Error(`Неожиданный ответ сервера ЭДО "ДИАДОК". Ошибка интерпретации: ${e.message}`); throw new Error(`Неожиданный ответ сервера ЭДО "ДИАДОК". Ошибка интерпретации: ${e.message}`);
} }
} else {
//Если пришел текст ошибки
if (prms.queue.blResp) {
throw new Error(`Неожиданный ответ сервера ЭДО "ДИАДОК": ${prms.queue.blResp.toString()}`);
} else { } else {
throw new Error('Сервер ЭДО "ДИАДОК" не вернул ответ'); throw new Error('Сервер ЭДО "ДИАДОК" не вернул ответ');
} }
}
//Возврат результата //Возврат результата
return { return {
blResp: Buffer.from(resu) blResp: Buffer.from(resu)
@ -354,6 +370,9 @@ const afterEvent = async prms => {
//Обработчик "До" отправки запроса на загрузку вложения //Обработчик "До" отправки запроса на загрузку вложения
const beforeDocLoad = async prms => { const beforeDocLoad = async prms => {
//Проверим ключ разработчика
checkAPIClientId(SDDAUTH_API_CLIENT_ID);
//Формируем запрос
try { try {
//Считаем токен доступа из контекста сервиса //Считаем токен доступа из контекста сервиса
let sToken = null; let sToken = null;
@ -417,11 +436,7 @@ const beforeDocLoad = async prms => {
documentVersion: prms.options.documentVersion, documentVersion: prms.options.documentVersion,
titleIndex: prms.options.titleIndex titleIndex: prms.options.titleIndex
}, },
headers: { headers: buildHeaders(SDDAUTH_API_CLIENT_ID, sToken),
"Content-type": "application/json; charset=utf-8",
Authorization: "DiadocAuth ddauth_api_client_id=" + Ddauth_Api_Client_Id + ",ddauth_token=" + sToken,
Accept: "application/json; charset=utf-8"
},
url: surl, url: surl,
simple: false simple: false
}, },
@ -481,6 +496,9 @@ const afterDocLoad = async prms => {
//Обработчик "До" отправки запроса на удаление документа к сервису "ДИАДОК" //Обработчик "До" отправки запроса на удаление документа к сервису "ДИАДОК"
const beforeDocDelete = async prms => { const beforeDocDelete = async prms => {
//Проверим ключ разработчика
checkAPIClientId(SDDAUTH_API_CLIENT_ID);
//Формируем запрос
try { try {
//Считаем токен доступа из контекста сервиса //Считаем токен доступа из контекста сервиса
let sToken = null; let sToken = null;
@ -492,11 +510,7 @@ const beforeDocDelete = async prms => {
//Собираем и отдаём общий результат работы //Собираем и отдаём общий результат работы
return { return {
options: { options: {
headers: { headers: buildHeaders(SDDAUTH_API_CLIENT_ID, sToken),
"Content-type": "application/json; charset=utf-8",
Authorization: "DiadocAuth ddauth_api_client_id=" + Ddauth_Api_Client_Id + ",ddauth_token=" + sToken,
Accept: "application/json; charset=utf-8"
},
simple: false simple: false
} }
}; };

9
modules/diadoc_config.js Normal file
View File

@ -0,0 +1,9 @@
/*
Сервис интеграции ПП Парус 8 с WEB API
Дополнительный модуль: Интеграция с ЭДО "ДИАДОК" (DIADOC) - настройки
*/
//-----------------
// Интерфейс модуля
//-----------------
exports.SDDAUTH_API_CLIENT_ID = ""; //Ключ разработчика (необходимо запросить у поставщика услуг ЭДО "ДИАДОК": "https://www.diadoc.ru/integrations/api")