From 7e3fc7367eceea8ee7a68451a4b923d4410529ba Mon Sep 17 00:00:00 2001 From: "Josepablo C." Date: Wed, 15 Nov 2023 22:58:12 -0600 Subject: [PATCH] feat: Adding contact-email endpoint --- README.md | 22 +++++++++++ src/apps/public/contact-email/routes.js | 7 ++++ src/apps/public/contact-email/services.js | 38 +++++++++++++++++++ src/apps/public/index.js | 2 + src/config/apiConfig.json | 9 +++++ src/config/apiConfig_local.json | 9 +++++ .../Handlers/MailClient/SendGrid.handler.js | 14 ++++++- .../Handlers/MailClient/StandAlone.handler.js | 24 ++++++++++++ src/lib/Handlers/MailClient/index.js | 11 +++++- 9 files changed, 133 insertions(+), 3 deletions(-) create mode 100644 src/apps/public/contact-email/routes.js create mode 100644 src/apps/public/contact-email/services.js create mode 100644 src/lib/Handlers/MailClient/StandAlone.handler.js diff --git a/README.md b/README.md index 27c08a6..2cfdc5d 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,7 @@ Read registered resources: - `GET /public-load-attachments/download/:id`: Downloads the attachment of the load identified by Id. - `GET /public-vehicles`: List registered vehicles. - `GET /states`: List registered states. + - `POST /contact-email`: Send an email from the Landing Page. All these endpoints support the following parameters (except for those with `public-` as prefix, for example `public-vehicles`): @@ -181,6 +182,27 @@ Returns: } ``` +### POST /contact-email + +Send an email from the Landing Page: + +Body content: + +```{.json} +{ + "email":"josepablo134@gmail.com", + "name":"Josepablo C.", + "message":"This is a test" +} +``` + +Returns: +```{.json} +{ + "msg": "Email sent!" +} +``` + ### GET /public-companies Get public fields from registered companies. diff --git a/src/apps/public/contact-email/routes.js b/src/apps/public/contact-email/routes.js new file mode 100644 index 0000000..2bd09b4 --- /dev/null +++ b/src/apps/public/contact-email/routes.js @@ -0,0 +1,7 @@ +'use strict'; +const router = require('express').Router(); +const services= require('./services.js'); + +router.post('/', services.postSendConactEMail); + +module.exports = router; diff --git a/src/apps/public/contact-email/services.js b/src/apps/public/contact-email/services.js new file mode 100644 index 0000000..a6e9729 --- /dev/null +++ b/src/apps/public/contact-email/services.js @@ -0,0 +1,38 @@ +"use strict"; +const { ROOT_PATH, HANDLERS_PATH } = process.env; +const { emailEvent , EMAIL_EVENTS } = require( `${ROOT_PATH}/${HANDLERS_PATH}/MailClient` ); + +const { Validator } = require( "jsonschema" ); +const validator = new Validator(); + +const conact_email = { + type : 'object', + properties : { + name : { type : 'string' , maxLength : 256 }, + email : { type : 'string' , maxLength : 256 }, + message : { type : 'string', maxLength : 1024 } + }, + required : [ 'name', 'email', 'message' ] +}; + +const postSendConactEMail = async(req, res) => { + try{ + if( validator.validate( req.body , conact_email ).valid ){ + const receiver = req.body.email; + const content = { + name : req.body.name, + email : req.body.email, + message : req.body.message + } + await emailEvent( EMAIL_EVENTS.CONTACT_EMAIL , receiver , content ); + }else{ + res.status(400).send( { error : "Invalid request" } ); + } + return res.status(200).send({ msg : "Email sent!"}); + } catch ( err ){ + console.error( err ); + return res.status(500).send({ error : "Contact-Email: Internal error" }); + } +}; + +module.exports = { postSendConactEMail }; diff --git a/src/apps/public/index.js b/src/apps/public/index.js index bbc4b25..0bf406c 100644 --- a/src/apps/public/index.js +++ b/src/apps/public/index.js @@ -6,6 +6,7 @@ const router = require('express').Router(); const account = require('./account/routes.js'); const cities = require('./cities/routes.js'); +const contactEmail = require('./contact-email/routes.js'); const countries = require('./countries/routes.js'); const metaData = require('./meta-data/routes.js'); const metaGroups = require('./meta-groups/routes.js'); @@ -21,6 +22,7 @@ const test = require('./test/routes.js'); router.use('/account', account); router.use('/cities', cities); +router.use('/contact-email', contactEmail); router.use('/countries', countries); router.use('/meta-data', metaData); router.use('/meta-groups', metaGroups); diff --git a/src/config/apiConfig.json b/src/config/apiConfig.json index 7d2b595..71fc10b 100644 --- a/src/config/apiConfig.json +++ b/src/config/apiConfig.json @@ -35,5 +35,14 @@ "API_KEY": "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", "FROM": "noreply@etaviaporte.com" }, + "email_standalone" : { + "host": "smtp.hostinger.com", + "port": "465", + "secure": true, + "auth": { + "user": "noreply@etaviaporte.com", + "pass": "-)WJt[oP~P$`76Q4" + } + }, "mongodb": "mongodb+srv://enruta_admin:NeptFx4RUZG8OsfA@enruta.vwofshy.mongodb.net/enrutaviaporte?retryWrites=true&w=majority" } diff --git a/src/config/apiConfig_local.json b/src/config/apiConfig_local.json index 163f700..1784656 100644 --- a/src/config/apiConfig_local.json +++ b/src/config/apiConfig_local.json @@ -35,5 +35,14 @@ "API_KEY": "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", "FROM": "noreply@etaviaporte.com" }, + "email_standalone" : { + "host": "smtp.hostinger.com", + "port": "465", + "secure": true, + "auth": { + "user": "noreply@etaviaporte.com", + "pass": "-)WJt[oP~P$`76Q4" + } + }, "mongodb": "mongodb://localhost/etaviaporte?retryWrites=true&w=majority" } diff --git a/src/lib/Handlers/MailClient/SendGrid.handler.js b/src/lib/Handlers/MailClient/SendGrid.handler.js index 52f5395..5dfedf2 100644 --- a/src/lib/Handlers/MailClient/SendGrid.handler.js +++ b/src/lib/Handlers/MailClient/SendGrid.handler.js @@ -63,4 +63,16 @@ async function AccountPwdResetEmail( receiver, content ){ return await sendMailTemplate( templateId, receiver, subject, content_to_send ); } -module.exports = { AccountVerifyEmail, AccountConfirmed, AccountPwdResetEmail }; +async function ContactEmail( receiver, content ){ + const templateId = "d-1090dda1091442f3a75ee8ab39ad0f10"; + const subject = "[ETA] Contact Email"; + const content_to_send = { + project_name: SiteName, + user_name: content.name, + user_email: receiver + }; + return await sendMailTemplate( templateId, receiver, subject, content_to_send ); +} +//ContactEmail( "josepablo134@gmail.com", { email : "josepablo134@gmail.com", name:"Josepablo C.", message: "This is an example" } ).then().catch(); + +module.exports = { AccountVerifyEmail, AccountConfirmed, AccountPwdResetEmail, ContactEmail }; diff --git a/src/lib/Handlers/MailClient/StandAlone.handler.js b/src/lib/Handlers/MailClient/StandAlone.handler.js new file mode 100644 index 0000000..7bcd353 --- /dev/null +++ b/src/lib/Handlers/MailClient/StandAlone.handler.js @@ -0,0 +1,24 @@ +'user strict'; +const { ROOT_PATH, API_CONFIG } = process.env; +const nodemailer = require("nodemailer"); + +const apiConfig = require( `${ROOT_PATH}/${API_CONFIG}` ); + +const transporter = nodemailer.createTransport( + apiConfig.email_standalone +); + +async function StandAloneContactEmail( content ){ + const default_from = apiConfig.email_standalone.auth.user; + const receiver = "support@etaviaporte.com"; + const {name, email, message } = content; + return await transporter.sendMail({ + from: `${name} <${default_from}>`, + to: receiver, + subject: "Contact Email From Landing Page", + text: `\n\n The following is an email from : ${email}\n\n\n` + message + }); +} +//StandAloneContactEmail( { email : "josepablo134@gmail.com", name:"Josepablo C.", message: "This is an example" } ).then().catch(); + +module.exports = { StandAloneContactEmail }; diff --git a/src/lib/Handlers/MailClient/index.js b/src/lib/Handlers/MailClient/index.js index 897efc0..8242b01 100644 --- a/src/lib/Handlers/MailClient/index.js +++ b/src/lib/Handlers/MailClient/index.js @@ -1,11 +1,13 @@ 'user strict'; const { ROOT_PATH, HANDLERS_PATH, MODELS_PATH, API_CONFIG } = process.env; -const { AccountVerifyEmail, AccountConfirmed, AccountPwdResetEmail } = require('./SendGrid.handler'); +const { StandAloneContactEmail } = require('./StandAlone.handler'); +const { AccountVerifyEmail, AccountConfirmed, AccountPwdResetEmail, ContactEmail } = require('./SendGrid.handler'); const EMAIL_EVENTS={ ACCOUNT_VERIFY:1, ACCOUNT_CONFIRMED:2, ACCOUNT_PWD_RESET:3, + CONTACT_EMAIL:4, } /** @@ -31,13 +33,18 @@ async function emailEvent( eventId, receiver , content ){ return await AccountPwdResetEmail( receiver, content ); } break; + case EMAIL_EVENTS.CONTACT_EMAIL: + { + await StandAloneContactEmail( content ); + return await ContactEmail( receiver, content ); + } + break; default: { throw new Error(`Email event not defined ${eventId}`); } break; } - return await usersModel.findById( id , { password : 0 } ); } module.exports = { emailEvent , EMAIL_EVENTS };