147 lines
5.5 KiB
JavaScript
147 lines
5.5 KiB
JavaScript
/*
|
||
Сервис интеграции ПП Парус 8 с WEB API
|
||
Дополнительный модуль: Рассылка E-Mail (MAIL)
|
||
*/
|
||
|
||
//------------------------------
|
||
// Подключение внешних библиотек
|
||
//------------------------------
|
||
|
||
const xml2js = require("xml2js"); //Конвертация XML в JSON и JSON в XML
|
||
const cfg = require("./../config"); //Настройки сервера приложений
|
||
const { makeErrorText, sendMail } = require("./../core/utils"); //Вспомогательные функции
|
||
|
||
//---------------------
|
||
// Глобальные константы
|
||
//---------------------
|
||
|
||
//Статусы отправки
|
||
const NSTATUS_ERR = 2;
|
||
const NSTATUS_DONE = 3;
|
||
|
||
//------------
|
||
// Тело модуля
|
||
//------------
|
||
|
||
//Установка статуса отправки
|
||
const setSendMsg = async prms => {
|
||
await prms.dbConn.executeStored({
|
||
connection: prms.dbConn.connection,
|
||
sName: "PKG_EXS_EXT_MAIL.EXSEXTMAIL_SET_STATUS",
|
||
inPrms: {
|
||
NRN: prms.nRn,
|
||
SERR_TEXT: prms.sErrMsg,
|
||
NSTATUS: prms.nStatus
|
||
}
|
||
});
|
||
};
|
||
|
||
//Считывание записей прикладываемых документов
|
||
const getMailAttach = async prms => {
|
||
let attachData = await prms.dbConn.executeStored({
|
||
connection: prms.dbConn.connection,
|
||
sName: "PKG_EXS_EXT_MAIL.GET_ATTACH",
|
||
inPrms: { NIDENT: prms.nIdent },
|
||
outPrms: { RCDOCUMENTS: prms.dbConn.connector.DT_CURSOR }
|
||
});
|
||
let rowsRes = [];
|
||
if (attachData)
|
||
if (attachData.RCDOCUMENTS)
|
||
attachData.RCDOCUMENTS.map(data => {
|
||
rowsRes.push({
|
||
filename: data.FILENAME ? data.FILENAME : data.filename,
|
||
content: data.BDATA ? data.BDATA : data.bdata
|
||
});
|
||
});
|
||
return rowsRes;
|
||
};
|
||
|
||
//Разбор XML
|
||
const parseXML = xmlDoc => {
|
||
return new Promise((resolve, reject) => {
|
||
xml2js.parseString(xmlDoc, { explicitArray: false, mergeAttrs: true }, (err, result) => {
|
||
if (err) reject(err);
|
||
else resolve(result);
|
||
});
|
||
});
|
||
};
|
||
|
||
//Обработчик "До" для исходящего сообщения
|
||
const before = async prms => {
|
||
//Инициализируем переменные
|
||
let res = "OK";
|
||
let parseRes = null;
|
||
//Разбираем параметры отправки
|
||
try {
|
||
//Формируем объект на основании XML
|
||
parseRes = await parseXML(prms.queue.blMsg.toString());
|
||
//Если есть присоединенные файлы - добавляем их
|
||
if (parseRes.mail.ident) {
|
||
parseRes.mail.attachments = await getMailAttach({ dbConn: prms.dbConn, nIdent: parseRes.mail.ident });
|
||
}
|
||
//Если указан текст в обычном формате
|
||
if (parseRes.mail.text) {
|
||
parseRes.mail.text = Buffer.from(parseRes.mail.text, "base64").toString("utf-8");
|
||
}
|
||
//Если указан текст в формате HTML
|
||
if (parseRes.mail.html) {
|
||
parseRes.mail.html = Buffer.from(parseRes.mail.html, "base64").toString("utf-8");
|
||
}
|
||
} catch (e) {
|
||
parseRes = prms.queue.blMsg.toString();
|
||
res = `Ошибка разбора параметров отправки: ${makeErrorText(e)}`;
|
||
}
|
||
if (res === "OK") {
|
||
try {
|
||
await sendMail({
|
||
mail: cfg.mail,
|
||
sTo: parseRes.mail.to,
|
||
sSubject: parseRes.mail.title,
|
||
sMessage: parseRes.mail.text,
|
||
sHTML: parseRes.mail.html,
|
||
attachments: parseRes.mail.attachments
|
||
});
|
||
} catch (e) {
|
||
res = `Ошибка отправки E-Mail сообщения: ${makeErrorText(e)}`;
|
||
}
|
||
}
|
||
//Если сообщение отправилось
|
||
if (res === "OK") {
|
||
//Если имеется рег. номер записи очереди отправки E-mail - обновляем информацию о текущем сообщении
|
||
if (parseRes.mail.nExsextmailId) {
|
||
await setSendMsg({
|
||
dbConn: prms.dbConn,
|
||
nRn: parseRes.mail.nExsextmailId,
|
||
sErrMsg: "",
|
||
nStatus: NSTATUS_DONE
|
||
});
|
||
}
|
||
} else {
|
||
//Если количество попыток не указано или это последняя попытка
|
||
if (prms.queue.nRetryAttempts === 0 || (prms.queue.nRetryAttempts !== 0 && prms.queue.nExecCnt + 1 === prms.queue.nRetryAttempts)) {
|
||
//Если имеется рег. номер записи очереди отправки E-mail - обновляем информацию о текущем сообщении
|
||
if (parseRes.mail.nExsextmailId) {
|
||
await setSendMsg({
|
||
dbConn: prms.dbConn,
|
||
nRn: parseRes.mail.nExsextmailId,
|
||
sErrMsg: res,
|
||
nStatus: NSTATUS_ERR
|
||
});
|
||
}
|
||
}
|
||
//Выдаем ошибку
|
||
throw new Error(res);
|
||
}
|
||
//Возвращаем результат и флаг того, что дальше отрабатывать это сообщение не надо
|
||
return {
|
||
blMsg: Buffer.from(JSON.stringify({ message: parseRes, state: res })),
|
||
bStopPropagation: true
|
||
};
|
||
};
|
||
|
||
//-----------------
|
||
// Интерфейс модуля
|
||
//-----------------
|
||
|
||
exports.before = before;
|