diff --git a/modules/send_mail.js b/modules/send_mail.js index bfb5c79..971e341 100644 --- a/modules/send_mail.js +++ b/modules/send_mail.js @@ -10,7 +10,6 @@ const xml2js = require("xml2js"); //Конвертация XML в JSON и JSON в XML const cfg = require("./../config"); //Настройки сервера приложений const { makeErrorText, sendMail } = require("./../core/utils"); //Вспомогательные функции -const oracledb = require("oracledb"); //Работа с СУБД Oracle //--------------------- // Глобальные константы @@ -24,84 +23,37 @@ const NSTATUS_DONE = 3; // Тело модуля //------------ -//Чтение данных из курсора -const readCursorData = cursor => { - return new Promise((resolve, reject) => { - let queryStream = cursor.toQueryStream(); - let rows = []; - queryStream.on("data", row => { - rows.push(row); - }); - queryStream.on("error", err => { - reject(new Error(err.message)); - }); - queryStream.on("close", () => { - resolve(rows); - }); - }); -}; - //Установка статуса отправки const setSendMsg = async prms => { - let pooledConnection; - try { - pooledConnection = await prms.connection.getConnection(); - await pooledConnection.execute( - "begin PKG_EXS_EXT_MAIL.EXSEXTMAIL_SET_STATUS(NRN => :NRN, SERR_TEXT => :SERR_TEXT, NSTATUS => :NSTATUS); end;", - { NRN: prms.nRn, SERR_TEXT: prms.sErrMsg, NSTATUS: prms.nStatus }, - { autoCommit: true } - ); - } catch (e) { - throw new Error(e.message); - } finally { - if (pooledConnection) { - try { - await pooledConnection.close(); - } catch (e) { - throw new Error(e.message); - } + 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 pooledConnection; - try { - pooledConnection = await prms.connection.getConnection(); - let res = await pooledConnection.execute( - "begin PKG_EXS_EXT_MAIL.GET_ATTACH(NIDENT => :NIDENT, RCDOCUMENTS => :RCDOCUMENTS); end;", - { - NIDENT: prms.nIdent, - RCDOCUMENTS: { type: oracledb.CURSOR, dir: oracledb.BIND_OUT } - }, - { outFormat: oracledb.OBJECT, autoCommit: true } - ); - let rows = await readCursorData(res.outBinds.RCDOCUMENTS); - let rowsRes = []; - //Если результат запроса не пустой - if (rows.length !== 0) { - //Переводим BLOB в BUFFER и формируем формат аттача - for (let i = 0; i < rows.length; i++) { - let rowContent = await rows[i].BDATA.getData(); + 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: rows[i].FILENAME, - content: rowContent + filename: data.FILENAME ? data.FILENAME : data.filename, + content: data.BDATA ? data.BDATA : data.bdata }); - } - } - return rowsRes; - } catch (e) { - throw new Error(e.message); - } finally { - if (pooledConnection) { - try { - await pooledConnection.close(); - } catch (e) { - throw new Error(e.message); - } - } - } + }); + return rowsRes; }; //Разбор XML @@ -125,7 +77,7 @@ const before = async prms => { parseRes = await parseXML(prms.queue.blMsg.toString()); //Если есть присоединенные файлы - добавляем их if (parseRes.mail.ident) { - parseRes.mail.attachments = await getMailAttach({ connection: prms.dbConn.connection, nIdent: parseRes.mail.ident }); + parseRes.mail.attachments = await getMailAttach({ dbConn: prms.dbConn, nIdent: parseRes.mail.ident }); } //Если указан текст в обычном формате if (parseRes.mail.text) { @@ -158,7 +110,7 @@ const before = async prms => { //Если имеется рег. номер записи очереди отправки E-mail - обновляем информацию о текущем сообщении if (parseRes.mail.nExsextmailId) { await setSendMsg({ - connection: prms.dbConn.connection, + dbConn: prms.dbConn, nRn: parseRes.mail.nExsextmailId, sErrMsg: "", nStatus: NSTATUS_DONE @@ -170,7 +122,7 @@ const before = async prms => { //Если имеется рег. номер записи очереди отправки E-mail - обновляем информацию о текущем сообщении if (parseRes.mail.nExsextmailId) { await setSendMsg({ - connection: prms.dbConn.connection, + dbConn: prms.dbConn, nRn: parseRes.mail.nExsextmailId, sErrMsg: res, nStatus: NSTATUS_ERR