forked from CITKParus/P8-ExchangeService
ЦИТК-560 - ключ разработчика в отдельном файле, расширенная обработка ошибок сервера ДИАДОК
This commit is contained in:
parent
a1cad96d81
commit
2812ce60af
@ -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;
|
||||||
let serverResp = await rqp(rqpoptions);
|
try {
|
||||||
//Не удалось получить ящик отправителя
|
//Выполним запрос
|
||||||
if (!serverResp.Organizations[0].Boxes[0].BoxId) {
|
serverResp = await rqp(rqpoptions);
|
||||||
throw new Error("Не удалось получить ящик отправителя");
|
//Не удалось получить ящик отправителя
|
||||||
|
if (!serverResp.Organizations[0].Boxes[0].BoxId) {
|
||||||
|
throw new Error("Не удалось получить ящик отправителя");
|
||||||
|
}
|
||||||
|
//Сохраняем полученный ответ
|
||||||
|
obj.FromBoxId = serverResp.Organizations[0].Boxes[0].BoxId;
|
||||||
|
} catch (e) {
|
||||||
|
throw Error(`Не удалось получить ящик отправителя: ${e.message}`);
|
||||||
}
|
}
|
||||||
//Сохраняем полученный ответ
|
//Очистим предыдущий запрос
|
||||||
obj.FromBoxId = serverResp.Organizations[0].Boxes[0].BoxId;
|
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) {
|
//Не удалось получить ящик получателя
|
||||||
throw new Error("Не удалось получить ящик получателя");
|
if (!serverResp.Organizations[0].Boxes[0].BoxId) {
|
||||||
|
throw new Error(`Не удалось получить ящик получателя для контрагента с ИНН: ${prms.options.inn} и КПП: ${prms.options.kpp}`);
|
||||||
|
}
|
||||||
|
//Сохраняем полученный ответ
|
||||||
|
obj.ToBoxId = serverResp.Organizations[0].Boxes[0].BoxId;
|
||||||
|
} catch (e) {
|
||||||
|
throw Error(`Не удалось получить ящик получателя для контрагента с ИНН: ${prms.options.inn} и КПП: ${prms.options.kpp}: ${e.message}`);
|
||||||
}
|
}
|
||||||
//Сохраняем полученный ответ
|
|
||||||
obj.ToBoxId = serverResp.Organizations[0].Boxes[0].BoxId;
|
|
||||||
//Если пришел ответ
|
//Если пришел ответ
|
||||||
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,16 +345,22 @@ 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 {
|
} else {
|
||||||
throw new Error('Сервер ЭДО "ДИАДОК" не вернул ответ');
|
//Если пришел текст ошибки
|
||||||
|
if (prms.queue.blResp) {
|
||||||
|
throw new Error(`Неожиданный ответ сервера ЭДО "ДИАДОК": ${prms.queue.blResp.toString()}`);
|
||||||
|
} else {
|
||||||
|
throw new Error('Сервер ЭДО "ДИАДОК" не вернул ответ');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
//Возврат результата
|
//Возврат результата
|
||||||
return {
|
return {
|
||||||
@ -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
9
modules/diadoc_config.js
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
/*
|
||||||
|
Сервис интеграции ПП Парус 8 с WEB API
|
||||||
|
Дополнительный модуль: Интеграция с ЭДО "ДИАДОК" (DIADOC) - настройки
|
||||||
|
*/
|
||||||
|
|
||||||
|
//-----------------
|
||||||
|
// Интерфейс модуля
|
||||||
|
//-----------------
|
||||||
|
exports.SDDAUTH_API_CLIENT_ID = ""; //Ключ разработчика (необходимо запросить у поставщика услуг ЭДО "ДИАДОК": "https://www.diadoc.ru/integrations/api")
|
Loading…
x
Reference in New Issue
Block a user