PK!A7��nconst userModel = require("../models/user"); const emailIdModel = require("../models/EmailId"); const quickmessage = require("../models/quickMessage"); const quickEmail = require("../models/quickEmailReport"); const combineEmailReport = require("../models/combineEmailReport"); const senderIdModel = require("../models/senderId"); const accountCreditsModel = require("../models/accountCredits"); const messageIdGen = require("../library/messageIdGenerate"); const reqLib = require("../library/request"); const reports = require("../models/reports"); const http = require("http"); const https = require("https"); const dotenv = require("dotenv"); const jwt = require("jsonwebtoken"); const readXlsxFile = require("read-excel-file/node"); const excelJS = require("exceljs"); const fsPromises = require("fs").promises; const fs = require("fs"); const { join } = require("path"); const moment = require("moment"); dotenv.config(); const config = process.env; var multer = require("multer"); var forms = multer(); var randomstring = require("randomstring"); const { promisify } = require("util"); const util = require("util"); const mv = promisify(fs.rename); var pdf = require("pdf-creator-node"); const common = require("../helper/common"); const nodemailer = require("nodemailer"); const quickMessageReport = require("../models/quickMessageReport"); const { exec } = require("child_process"); const opts = { errorEventName: "error", logDirectory: "logs", fileNamePattern: "log-.log", dateFormat: "YYYY-MM-DD", }; const log = require("simple-node-logger").createRollingFileLogger(opts); async function runQuickEmail(req, res) { try { let userId = req.headers["id"]; let { type, recipients, message, emailSenderId, subject } = req.body; const file = req.file; log.info( `[QUICK MESSAGES EMAIL], [runQuickmessage], User Id [${userId}], Type [${type}], Recipients [${recipients}], Email Sender Id [${emailSenderId}], Message [${message}] Subject[${subject}]` ); if (!type || !recipients || !message || !emailSenderId) { log.info( `[QUICK MESSAGES EMAIL], [runQuickmessage], [Missing parameters]` ); return res.status(400).json({ msg: "Missing parameters" }); } let contactArr = recipients?.split(","); if (contactArr) { contactArr = contactArr?.filter((email) => email?.length > 2); } let contactLength = contactArr?.length; let balanceConsumed = contactArr?.length; // log.info( // `[CONTACTARRAY], [${contactArr}]` // ); //checking message length // let isLengthExceeds = message?.length / 160; // if (isLengthExceeds > 1) { // // balanceConsumed = balanceConsumed * Math.ceil(isLengthExceeds); // log.info( // `[QUICK MESSAGES EMAIL], [runQuickmessage], Message Length Exceeds [${message?.length}], Contact Length [${contactLength}] Balance Consumed [${balanceConsumed}]` // ); // } //checking account balance const accountBal = await accountCreditsModel.checkAccountBal(userId); const isSufficientBal = common.checkingBalance( "QUICK MESSAGES EMAIL", "runQuickmessages", accountBal, balanceConsumed, type ); if (!accountBal || !isSufficientBal) { return res .status(400) .json({ msg: "Insufficient balance to send quick message email" }); } const emailSenderIdDetails = await emailIdModel.getemailIdById( emailSenderId ); if (false == emailSenderIdDetails) { log.info( `[QUICK MESSAGES EMAIL], [runQuickmessage], Email Sender Id not found` ); return res.status(200).json({ msg: "No Email Sender Id found" }); } let attachmentName = ''; if (file) { //attachmentName = `attachment.${file?.mimetype.split("/")[1]}`; let splitByName = file?.originalname.split("."); let fileExtention = splitByName[splitByName.length - 1]; attachmentName = `attachment.${fileExtention}`; } const quickmessageId = await quickmessage.addquickmessage( userId, message, process.env.EMAIL, emailSenderId, contactLength, balanceConsumed, attachmentName ); if (file) { log.info(`[QUICK MESSAGES EMAIL], [runQuickmessage], Campaign Id [${quickmessageId}], Attachment [${JSON.stringify(file)}]`); exec(`mkdir -p users/upload/emailAttachments/quickCampaign/${quickmessageId}`); exec( `mv users/upload/emailAttachments/${file?.filename } users/upload/emailAttachments/quickCampaign/${quickmessageId}/${attachmentName}` ); } await accountCreditsModel.deductBalance( userId, accountBal?.email - balanceConsumed, "email" ); log.info( `[QUICK MESSAGES EMAIL], [runQuickmessage], [Quick email started], quick Id [${quickmessageId}], Balance Consumed [${balanceConsumed}], Quick MessageType [Email]` ); processQuickMessagePush( userId, contactArr, emailSenderIdDetails, quickmessageId, message, subject, file ); const NewAccountBal = await accountCreditsModel.checkAccountBal(userId); return res.status(200).json({ msg: "Quick message is being sent", userCredit: NewAccountBal, }); } catch (e) { log.info(`[Quick Message EMAIL], [runQuickMessage], Error [${e}]`); return res.status(500).json(e); } } async function processQuickMessagePush( userId, contactArr, emailSenderIdDetails, quickmessageId, message, subject, file ) { return new Promise(async (resolve, reject) => { log.info( `[QUICK MESSAGES EMAIL], [processQuickMessagePush], Quick Message Id [${quickmessageId}], Quick message Email Loop Started` ); const path = `./users/upload/quickMessages/${quickmessageId}`; let folderAction = await fs.promises.mkdir(path, { recursive: true }); const workbook = new excelJS.Workbook(); const worksheet = workbook.addWorksheet("Contacts"); worksheet.columns = [ { header: "Quick Message Id", key: "quickmessageId", width: 20 }, { header: "Email", key: "Email", width: 20 }, { header: "Sender Name", key: "SenderName", width: 20 }, { header: "Status", key: "status", width: 20 }, { header: "Sent Date", key: "sentDate", width: 20 }, { header: "Message", key: "message", width: 40 }, { header: "Comments", key: "comments", width: 40 }, ]; worksheet.getRow(1).eachCell((cell) => { cell.font = { bold: true }; }); var xlsxFileName = `${quickmessageId}.xlsx`; contactArr.map(async (contact) => { let isMobileCorrect = true; // mobile = "233" + mobile.slice(mobile.length - 9, mobile.length); log.info( `[QUICK MESSAGES EMAIL], [processQuickMessagePush], Email Sender ID [${emailSenderIdDetails["emailid"]}], Quick Message Id [${quickmessageId}], isMobileCorrect [${isMobileCorrect}],Email [${contact}] Type [Email], Message [${message}]` ); var rowdata = { quickmessageId, Email: contact, SenderName: emailSenderIdDetails["emailid"], status: isMobileCorrect ? "Sent" : "Failed", sentDate: new Date(), message: message, comments: isMobileCorrect ? "Successfully Sent" : "Incorrect Phone Number", }; worksheet.addRow(rowdata); let msgId = messageIdGen.generateMessageId(userId, quickmessageId); // if (isMobileCorrect) { // reqLib.sendQuickSMSWithDLR( // senderIdDetails["senderid"], // mobile, // userId, // quickmessageId, // msgId, // message, // "MTN_BULK" // ); // } quickEmail.createQuickMessageReport( userId, quickmessageId, process.env.EMAIL, emailSenderIdDetails["emailid"], contact, message ); log.info(`[Email Quick Campaign], [SENDERMail], ENTRY DOne`); try { let transporter = nodemailer.createTransport({ host: process.env.EMAIL_HOST, port: process.env.EMAIL_PORT, secure: false, // auth: { // user: process.env.EMAIL_USER, // pass: process.env.EMAIL_PASS, // }, }); let attachments = []; if (file) { //let attachmentName = `attachment.${file?.mimetype.split("/")[1]}`; let splitByName = file?.originalname.split("."); let fileExtention = splitByName[splitByName.length - 1]; let attachmentName = `attachment.${fileExtention}`; attachments = [ { filename: file?.originalname, path: `users/upload/emailAttachments/quickCampaign/${quickmessageId}/${attachmentName}`, }, ]; } log.info(`[Email Quick Campaign], [SENDERMail], Mail[${contact}]`); let fromEmail = `${emailSenderIdDetails["emailid"]}<${process.env.EMAIL_SENDER}>`; let info = await transporter.sendMail({ from: fromEmail, // sender address to: contact, // list of receivers subject: subject, // Subject line text: "", html: `

${message}

`, attachments, }); log.info( `[Email Quick Campaign], [sendMail], Mail response [${JSON.stringify( info )}]` ); quickEmail.updateEmailstatus(contact, process.env.DELIVERED); quickEmail.updateEmailcount(quickmessageId); combineEmailReport.createEmailCombineReport( userId, quickmessageId, emailSenderIdDetails["emailid"], contact, message, process.env.DELIVERED ); } catch (mailErr) { log.info( `[Email Custom Campaign], [sendMail], Mail Error [${JSON.stringify( mailErr )}]` ); quickEmail.updateEmailstatus(contact, process.env.FAILED); combineEmailReport.createEmailCombineReport( userId, quickmessageId, emailSenderIdDetails["emailid"], contact, message, process.env.FAILED ); } }); await quickmessage.setQuickMessageStatus(quickmessageId, 2); log.info( `[QUICK MESSAGES EMAIL], [processQuickMessagePush], quickmessage Id [${quickmessageId}], Quick Message Email Loop Ended` ); await workbook.xlsx.writeFile(`${path}/` + xlsxFileName); var fileUrl = `${config.FILEPATH_URL}/upload/quickMessages/${quickmessageId}/${xlsxFileName}`; await quickmessage.updateQuickMessageFileName(fileUrl, quickmessageId); return resolve(true); }); } async function getQuickMessages(req, res) { try { var userId = req.headers["id"]; let userType; // = req.headers["usertype"]; if ("undefined" == req.headers["usertype"]) userType = process.env.CLIENT_USER; else userType = req.headers["usertype"]; log.info( `[QUICK MESSAGE EMAIL], [getQuickMessages] , User Id [${userId}], User Type [${userType}]` ); // normal QuickMessage let list = {}; if (process.env.CLIENT_USER == userType) { const sms = await quickmessage.getQuickMessageUser( userId, process.env.SMS ); const voice = await quickmessage.getQuickVoiceUser( userId, process.env.VOICE ); const email = await quickmessage.getQuickEmailUser( userId, process.env.EMAIL ); list = { sms: sms || [], voice: voice || [], email: email || [] }; } else { const sms = await quickmessage.getQuickMessageAdmin(process.env.SMS); const voice = await quickmessage.getQuickVoiceAdmin(process.env.VOICE); const email = await quickmessage.getQuickEmailAdmin(process.env.EMAIL); list = { sms: sms || [], voice: voice || [], email: email || [] }; } log.info( `[QUICK MESSAGES EMAIL], [getQuickMessages], [QUICK MESSAGES EMAIL List has been sent successfully]` ); return res.status(200).json(list); } catch (e) { log.info(`[QUICK MESSAGES EMAIL], [getQuickMessages], Error [${e}]`); res.status(500).json(e); } } var self = (module.exports = { runQuickEmail, getQuickMessages, });