From ad2b48bb41ac09f8b31122e9cd095184f86de871 Mon Sep 17 00:00:00 2001 From: veyselboybay Date: Mon, 13 May 2024 19:20:56 -0400 Subject: [PATCH] Added logging service and emailing function --- README.md | 2 ++ Server/.gitignore | 4 +--- Server/index.js | 11 ++++++---- Server/utils/logger.js | 26 +++++++++++++++++++++++ Server/utils/sendEmail.js | 43 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 79 insertions(+), 7 deletions(-) create mode 100644 Server/utils/logger.js create mode 100644 Server/utils/sendEmail.js diff --git a/README.md b/README.md index 4b5375c8f..3397a324d 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,8 @@ Configure the server with the following environmental variables | ENV Varialbe Name | Required/Optional | Type | Description | | -------------------- | ----------------- | ------ | --------------------------------- | | DB_CONNECTION_STRING | Required | string | Specfies URL for MongoDB Database | +| MAILERSEND_API_KEY | Required | string | Specfies API KEY for MailerSend service | +| SYSTEM_EMAIL_ADDRESS | Required | string | Specfies System email to be used in emailing service | --- diff --git a/Server/.gitignore b/Server/.gitignore index e27ddd889..1dcef2d9f 100644 --- a/Server/.gitignore +++ b/Server/.gitignore @@ -1,4 +1,2 @@ node_modules -.env -utils/sendEmail.js -utils/logger.js \ No newline at end of file +.env \ No newline at end of file diff --git a/Server/index.js b/Server/index.js index 8487c5012..967a9899b 100644 --- a/Server/index.js +++ b/Server/index.js @@ -5,6 +5,7 @@ const authRouter = require("./routes/authRoute"); const monitorRouter = require("./routes/monitorRoute"); const { connectDbAndRunServer } = require("./configs/db"); require("dotenv").config(); +const logger = require('./utils/logger'); // const { sendEmail } = require('./utils/sendEmail') // ************************** @@ -53,15 +54,17 @@ app.use("/api/v1/monitors", monitorRouter); // Testing email service // app.use('/sendEmail', async (req, res) => { -// const response = sendEmail('veysel.boybay@outlook.com', ['veysel.boybay@bluewavelabs.ca'], 'Testing email service', '

Testing Bluewavelabs

'); +// const response = sendEmail(['veysel.boybay@bluewavelabs.ca'], 'Testing email service', '

Testing Bluewavelabs

'); // console.log(response); // }) //health check app.use("/api/v1/healthy", (req, res) => { - try { - return res.status(200).json({ message: "Healthy" }); - } catch (error) { + try { + logger.info("Checking Health of the server.") + return res.status(200).json({ message: "Healthy" }); + } catch (error) { + logger.error(error.message) return res.status(500).json({ message: error.message }); } }); diff --git a/Server/utils/logger.js b/Server/utils/logger.js new file mode 100644 index 000000000..a8f65527c --- /dev/null +++ b/Server/utils/logger.js @@ -0,0 +1,26 @@ +const winston = require('winston'); +/** + * @module + * @example + * logger.info("Registered a new user!") + * logger.warn("User not found!") + * logger.error("Cannot save") + * @example + * "Specify service and ID in the log if applicable." + * logger.error("Descriptive Message",{"service":"monitor","monitorId":"123456"}) + * logger.error("Incorrect Credentials",{"service":"Auth","userId":"654321"}) + * logger.error("User not found!",{"service":"Auth"}) + */ +const logger = winston.createLogger({ + level: 'info', + format: winston.format.combine( + winston.format.timestamp(), + winston.format.json() + ), + transports: [ + new winston.transports.Console(), + new winston.transports.File({ filename: 'app.log' }), + ], +}); + +module.exports = logger; \ No newline at end of file diff --git a/Server/utils/sendEmail.js b/Server/utils/sendEmail.js new file mode 100644 index 000000000..712a651bd --- /dev/null +++ b/Server/utils/sendEmail.js @@ -0,0 +1,43 @@ +const { MailerSend, EmailParams, Sender, Recipient } = require('mailersend') +const logger = require('../utils/logger') + + +const mailersend = new MailerSend({ + apiKey: process.env.MAILERSEND_API_KEY, +}) +/** + * @function + * @param {[string]} receivers - takes an array of strings + * @param {string} subject - takes a single string + * @param {string} contentHTML - takes a single string that contains HTML + * @returns {JSON} + * @example + * sendEmail(['veysel@bluewavelabs.ca','alex@bluewavelabs.ca','monzer@bluewavelabs.ca'],'Testing Email Servide','

BlueWaveLabs

') + */ +// TODO: from email should be in .env file +const sendEmail = async (receivers,subject,contentHTML) => { + // Sender + const from = process.env.SYSTEM_EMAIL_ADDRESS; + const sender = new Sender(from); + // receivers + let recipients = [] + receivers.map(email => recipients.push(new Recipient(email))); + // Set params + const emailParams = new EmailParams() + .setFrom(sender) + .setTo(recipients) + .setSubject(subject) + .setHtml(contentHTML); + + try { + const response = await mailersend.email.send(emailParams); + logger.info("Email sent to receivers!",{"service":"Email"}) + return response; + + } catch (error) { + logger.error(error.body,{"service":"email"}) + console.log(error.body) + } +} + +module.exports = {sendEmail} \ No newline at end of file