diff --git a/README.md b/README.md index 76c5f510e..02890e230 100644 --- a/README.md +++ b/README.md @@ -83,6 +83,7 @@ Configure the server with the following environmental variables: | ENV Variable Name | Required/Optional | Type | Description | Accepted Values | | -------------------- | ----------------- | --------- | ------------------------------------------------------------------------------------------- | ------------------- | +| CLIENT_HOST | Required | `string` | Frontend Host | | | JWT_SECRET | Required | `string` | JWT secret | | | DB_TYPE | Optional | `string` | Specify DB to use | `MongoDB \| FakeDB` | | DB_CONNECTION_STRING | Required | `string` | Specifies URL for MongoDB Database | | diff --git a/Server/controllers/authController.js b/Server/controllers/authController.js index 6c532e565..8d66a36df 100644 --- a/Server/controllers/authController.js +++ b/Server/controllers/authController.js @@ -13,7 +13,6 @@ const { sendEmail } = require("../utils/sendEmail"); const { registerTemplate, } = require("../utils/emailTemplates/registerTemplate"); -const RecoveryToken = require("../models/RecoveryToken"); /** * Creates and returns JWT token with an arbitrary payload @@ -88,7 +87,6 @@ const registerController = async (req, res, next) => { * @param {Express.Request} req * @param {Express.Response} res * @returns {Promise} - * @throws {Error} */ const loginController = async (req, res, next) => { try { @@ -152,11 +150,26 @@ const userEditController = async (req, res, next) => { } }; +/** + * Returns a recovery token + * @async + * @param {Express.Request} req + * @property {Object} req.body + * @property {string} req.body.email + * @param {Express.Response} res + * @returns {Promise} + */ const recoveryRequestController = async (req, res, next) => { try { const user = await req.db.getUserByEmail(req, res); if (user) { const recoveryToken = await req.db.requestRecoveryToken(req, res); + await sendEmail( + [req.body.email], + "Uptime Monitor Password Recovery", + `Click here to reset your password`, + `Recovery token: ${recoveryToken.token}` + ); return res.status(200).json({ success: true, msg: "Created recovery token", @@ -171,6 +184,15 @@ const recoveryRequestController = async (req, res, next) => { } }; +/** + * Returns a recovery token + * @async + * @param {Express.Request} req + * @property {Object} req.body + * @property {string} req.body.token + * @param {Express.Response} res + * @returns {Promise} + */ const validateRecoveryTokenController = async (req, res, next) => { try { const recoveryToken = await req.db.validateRecoveryToken(req, res); @@ -187,6 +209,16 @@ const validateRecoveryTokenController = async (req, res, next) => { } }; +/** + * Returns an updated user + * @async + * @param {Express.Request} req + * @property {Object} req.body + * @property {string} req.body.token + * @property {string} req.body.password + * @param {Express.Response} res + * @returns {Promise} + */ const resetPasswordController = async (req, res, next) => { try { user = await req.db.resetPassword(req, res); diff --git a/Server/utils/sendEmail.js b/Server/utils/sendEmail.js index d60900383..306bec2c5 100644 --- a/Server/utils/sendEmail.js +++ b/Server/utils/sendEmail.js @@ -1,7 +1,7 @@ -const sgMail = require('@sendgrid/mail') -const logger = require('./logger') -sgMail.setApiKey(process.env.SENDGRID_API_KEY) -const SERVICE_NAME = 'Email_Service'; +const sgMail = require("@sendgrid/mail"); +const logger = require("./logger"); +sgMail.setApiKey(process.env.SENDGRID_API_KEY); +const SERVICE_NAME = "Email_Service"; /** * @async * @function @@ -12,25 +12,34 @@ const SERVICE_NAME = 'Email_Service'; * @example * await sendEmail(['veysel@bluewavelabs.ca','alex@bluewavelabs.ca'],'Testing Email Service','

BlueWaveLabs

','Testing Email Service') */ -const sendEmail = async (receivers,subject, contentHTML, contentText = null ) => { - const msg = { - to: receivers, - from: { - name: 'Uptime System', - email: process.env.SYSTEM_EMAIL_ADDRESS // must be verified email by sendgrid - }, - subject: subject, - text: contentText || contentHTML, - html: contentHTML, - } - try { - await sgMail.send(msg); - logger.info(`Emails sent to receivers:${receivers} with the subject:${subject}`,{service:SERVICE_NAME}) - } catch (error) { - logger.error(`Sending Email action failed, ERROR:${error}`, { service: SERVICE_NAME }); - } -} +const sendEmail = async ( + receivers, + subject, + contentHTML, + contentText = null +) => { + const msg = { + to: receivers, + from: { + name: "Uptime System", + email: process.env.SYSTEM_EMAIL_ADDRESS, // must be verified email by sendgrid + }, + subject: subject, + text: contentText || contentHTML, + html: contentHTML, + }; + try { + await sgMail.send(msg); + logger.info( + `Emails sent to receivers:${receivers} with the subject:${subject}`, + { service: SERVICE_NAME } + ); + } catch (error) { + logger.error(`Sending Email action failed, ERROR:${error}`, { + service: SERVICE_NAME, + }); + throw error; + } +}; - - -module.exports = {sendEmail} \ No newline at end of file +module.exports = { sendEmail };