ЦИТК-616 - "Интеграция с ЭДО ДИАДОК": поддержка возможности указания нескольких ключей разработчика (diadic_config.js/SDDAUTH_API_CLIENT_ID) для разных организаций и юридических лиц

This commit is contained in:
Mikhail Chechnev 2023-02-20 13:48:38 +03:00
parent 474a2adf96
commit d5dd010f33
2 changed files with 62 additions and 16 deletions

View File

@ -76,6 +76,27 @@ const addHours = (dDate, nHours) => {
return new Date(dDate); return new Date(dDate);
}; };
//Получение ключа разработчика по организации/принадлежности
const getAPIClientId = (nCompany, nJurPers = null) => {
//Ключи в diadoc_conf.js заданы
if (SDDAUTH_API_CLIENT_ID) {
//И это массив
if (Array.isArray(SDDAUTH_API_CLIENT_ID)) {
//Найдем значение в массиве
let keyFound = SDDAUTH_API_CLIENT_ID.find(keyItem => keyItem.nCompany === nCompany && keyItem.nJurPers === nJurPers);
//Найдено совпадение в массиве
if (keyFound) return keyFound.sAPIClientId;
else {
//Ищем с принадлежностью по умолчанию
keyFound = SDDAUTH_API_CLIENT_ID.find(keyItem => keyItem.nCompany === nCompany && !keyItem.nJurPers);
//Найдено совпадение в массиве
if (keyFound) return keyFound.sAPIClientId;
else return null;
}
} else return SDDAUTH_API_CLIENT_ID;
} else return null;
};
//Проверка ключа разработчика //Проверка ключа разработчика
const checkAPIClientId = sAPIClientId => { const checkAPIClientId = sAPIClientId => {
if (!sAPIClientId) { if (!sAPIClientId) {
@ -97,12 +118,14 @@ const beforeConnect = async prms => {
const passAtribute = "password"; const passAtribute = "password";
let surl = prms.options.url; let surl = prms.options.url;
surl = surl + "?" + "type=password"; surl = surl + "?" + "type=password";
//Получим ключ разработчика
let sAPIClientId = getAPIClientId(prms.options.nCompany, prms.options.nJurPers);
//Проверим ключ разработчика //Проверим ключ разработчика
checkAPIClientId(SDDAUTH_API_CLIENT_ID); checkAPIClientId(sAPIClientId);
//Сформируем запрос на аутентификацию //Сформируем запрос на аутентификацию
return { return {
options: { options: {
headers: buildHeaders(SDDAUTH_API_CLIENT_ID), headers: buildHeaders(sAPIClientId),
url: surl, url: surl,
body: JSON.stringify({ body: JSON.stringify({
[loginAtribute]: prms.service.sSrvUser, [loginAtribute]: prms.service.sSrvUser,
@ -130,8 +153,10 @@ const afterConnect = async prms => {
//Обработчик "До" отправки запроса на экспорт документа к сервису "ДИАДОК" //Обработчик "До" отправки запроса на экспорт документа к сервису "ДИАДОК"
const beforeMessagePost = async prms => { const beforeMessagePost = async prms => {
//Получим ключ разработчика
let sAPIClientId = getAPIClientId(prms.options.nCompany, prms.options.nJurPers);
//Проверим ключ разработчика //Проверим ключ разработчика
checkAPIClientId(SDDAUTH_API_CLIENT_ID); checkAPIClientId(sAPIClientId);
//Формируем запрос //Формируем запрос
try { try {
//Считаем токен доступа из контекста сервиса //Считаем токен доступа из контекста сервиса
@ -146,7 +171,7 @@ 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: buildHeaders(SDDAUTH_API_CLIENT_ID, sToken), headers: buildHeaders(sAPIClientId, sToken),
json: true json: true
}; };
let serverResp; let serverResp;
@ -179,7 +204,7 @@ const beforeMessagePost = async prms => {
inn: prms.options.inn_cs, inn: prms.options.inn_cs,
kpp: prms.options.kpp_cs kpp: prms.options.kpp_cs
}, },
headers: buildHeaders(SDDAUTH_API_CLIENT_ID, sToken), headers: buildHeaders(sAPIClientId, sToken),
json: true json: true
}; };
try { try {
@ -204,7 +229,7 @@ const beforeMessagePost = async prms => {
//Собираем и отдаём общий результат работы //Собираем и отдаём общий результат работы
return { return {
options: { options: {
headers: buildHeaders(SDDAUTH_API_CLIENT_ID, sToken), headers: buildHeaders(sAPIClientId, sToken),
simple: false simple: false
}, },
blMsg: Buffer.from(JSON.stringify(obj)) blMsg: Buffer.from(JSON.stringify(obj))
@ -241,8 +266,10 @@ const afterMessagePost = async prms => {
//Обработчик "До" отправки запроса на экспорт патча документа к сервису "ДИАДОК" //Обработчик "До" отправки запроса на экспорт патча документа к сервису "ДИАДОК"
const beforeMessagePatchPost = async prms => { const beforeMessagePatchPost = async prms => {
//Получим ключ разработчика
let sAPIClientId = getAPIClientId(prms.options.nCompany, prms.options.nJurPers);
//Проверим ключ разработчика //Проверим ключ разработчика
checkAPIClientId(SDDAUTH_API_CLIENT_ID); checkAPIClientId(sAPIClientId);
//Формируем запрос //Формируем запрос
try { try {
//Считаем токен доступа из контекста сервиса //Считаем токен доступа из контекста сервиса
@ -257,7 +284,7 @@ const beforeMessagePatchPost = async prms => {
//Собираем и отдаём общий результат работы //Собираем и отдаём общий результат работы
return { return {
options: { options: {
headers: buildHeaders(SDDAUTH_API_CLIENT_ID, sToken), headers: buildHeaders(sAPIClientId, sToken),
simple: false simple: false
}, },
blMsg: Buffer.from(JSON.stringify(obj)) blMsg: Buffer.from(JSON.stringify(obj))
@ -294,8 +321,10 @@ const afterMessagePatchPost = async prms => {
//Обработчик "До" отправки запроса на получение новых событий к сервису "ДИАДОК" //Обработчик "До" отправки запроса на получение новых событий к сервису "ДИАДОК"
const beforeEvent = async prms => { const beforeEvent = async prms => {
//Получим ключ разработчика
let sAPIClientId = getAPIClientId(prms.options.nCompany, prms.options.nJurPers);
//Проверим ключ разработчика //Проверим ключ разработчика
checkAPIClientId(SDDAUTH_API_CLIENT_ID); checkAPIClientId(sAPIClientId);
//Формируем запрос //Формируем запрос
try { try {
let sToken = null; //Токен доступа let sToken = null; //Токен доступа
@ -314,7 +343,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: buildHeaders(SDDAUTH_API_CLIENT_ID, sToken), headers: buildHeaders(sAPIClientId, sToken),
json: true json: true
}; };
try { try {
@ -379,7 +408,7 @@ const beforeEvent = async prms => {
//Собираем и отдаём общий результат работы //Собираем и отдаём общий результат работы
return { return {
options: { options: {
headers: buildHeaders(SDDAUTH_API_CLIENT_ID, sToken), headers: buildHeaders(sAPIClientId, sToken),
simple: false, simple: false,
url: surl, url: surl,
boxId: sBoxId boxId: sBoxId
@ -418,8 +447,10 @@ const afterEvent = async prms => {
//Обработчик "До" отправки запроса на загрузку вложения //Обработчик "До" отправки запроса на загрузку вложения
const beforeDocLoad = async prms => { const beforeDocLoad = async prms => {
//Получим ключ разработчика
let sAPIClientId = getAPIClientId(prms.options.nCompany, prms.options.nJurPers);
//Проверим ключ разработчика //Проверим ключ разработчика
checkAPIClientId(SDDAUTH_API_CLIENT_ID); checkAPIClientId(sAPIClientId);
//Формируем запрос //Формируем запрос
try { try {
//Считаем токен доступа из контекста сервиса //Считаем токен доступа из контекста сервиса
@ -484,7 +515,7 @@ const beforeDocLoad = async prms => {
documentVersion: prms.options.documentVersion, documentVersion: prms.options.documentVersion,
titleIndex: prms.options.titleIndex titleIndex: prms.options.titleIndex
}, },
headers: buildHeaders(SDDAUTH_API_CLIENT_ID, sToken), headers: buildHeaders(sAPIClientId, sToken),
url: surl, url: surl,
simple: false simple: false
}, },
@ -544,8 +575,10 @@ const afterDocLoad = async prms => {
//Обработчик "До" отправки запроса на удаление документа к сервису "ДИАДОК" //Обработчик "До" отправки запроса на удаление документа к сервису "ДИАДОК"
const beforeDocDelete = async prms => { const beforeDocDelete = async prms => {
//Получим ключ разработчика
let sAPIClientId = getAPIClientId(prms.options.nCompany, prms.options.nJurPers);
//Проверим ключ разработчика //Проверим ключ разработчика
checkAPIClientId(SDDAUTH_API_CLIENT_ID); checkAPIClientId(sAPIClientId);
//Формируем запрос //Формируем запрос
try { try {
//Считаем токен доступа из контекста сервиса //Считаем токен доступа из контекста сервиса
@ -558,7 +591,7 @@ const beforeDocDelete = async prms => {
//Собираем и отдаём общий результат работы //Собираем и отдаём общий результат работы
return { return {
options: { options: {
headers: buildHeaders(SDDAUTH_API_CLIENT_ID, sToken), headers: buildHeaders(sAPIClientId, sToken),
simple: false simple: false
} }
}; };

View File

@ -6,4 +6,17 @@
//----------------- //-----------------
// Интерфейс модуля // Интерфейс модуля
//----------------- //-----------------
exports.SDDAUTH_API_CLIENT_ID = ""; //Ключ разработчика (необходимо запросить у поставщика услуг ЭДО "ДИАДОК": "https://www.diadoc.ru/integrations/api")
//Ключ разработчика (запрашивается у поставщика услуг ЭДО "ДИАДОК": "https://www.diadoc.ru/integrations/api")
//Если необходимо задать несколько ключей для разных организаций/юридических принадлежностей:
//SDDAUTH_API_CLIENT_ID = [
// { nCompany: <Рег. номер организации 1>,
// nJurPers: <Рег. номер принадлежности 1 (null - для ключа по умолчанию для организации)>,
// sAPIClientId: "<Ключ разработчика 1>" },
// { nCompany: <Рег. номер организации 2>,
// nJurPers: <Рег. номер принадлежности 2 (null - для ключа по умолчанию для организации)>,
// sAPIClientId: "<Ключ разработчика 2>" }...
//];
//Если ключ единый для всех организаций:
//SDDAUTH_API_CLIENT_ID = "<Ключ разработчика>";
exports.SDDAUTH_API_CLIENT_ID = "";