From 85f86781cd89f5950f8606f9e2f48b632510a7c3 Mon Sep 17 00:00:00 2001 From: bbrengma Date: Mon, 6 Apr 2020 20:42:22 -0400 Subject: [PATCH 1/2] Email controller, schema, and routes Add new files for the controller, schema, and routes of the new email page --- server/controllers/email.controller.js | 50 ++++++++++++++++++++++++++ server/models/email.js | 13 +++++++ server/routes/email.routes.js | 9 +++++ server/server.js | 6 ++++ 4 files changed, 78 insertions(+) create mode 100644 server/controllers/email.controller.js create mode 100644 server/models/email.js create mode 100644 server/routes/email.routes.js diff --git a/server/controllers/email.controller.js b/server/controllers/email.controller.js new file mode 100644 index 000000000..7909ad0eb --- /dev/null +++ b/server/controllers/email.controller.js @@ -0,0 +1,50 @@ +import Email from '../models/email'; +import cuid from 'cuid'; +import sanitizeHtml from 'sanitize-html'; + +// ADDPOST function +export function addPost(req, res) { + // Make sure a recipient, subject, and body are entered + if (!req.body.form.to || !req.body.form.title || !req.body.form.body) { + res.status(403).end(); + } + + // Make sure recipient email is valid, if not respond with 400 status + if (!(/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(req.body.form.to))) { + res.status(400).json({ error: true, message: 'Invalid recipient address' }); + return; + } + + // Initialize and send email through sendgrid + const sgMail = require('../../node_modules/@sendgrid/mail'); + sgMail.setApiKey('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'); + const msg = { + to: req.body.form.to, + from: 'benbrengman@icloud.com', + subject: req.body.form.title, + text: req.body.form.body, + }; + sgMail + .send(msg) + .catch(error => { res.status(400).send(error); }); + + // Initialize new email form + const newForm = new Email(req.body.form); + + // Sanitize inputs + newForm.to = sanitizeHtml(newForm.to); + newForm.title = sanitizeHtml(newForm.title); + newForm.body = sanitizeHtml(newForm.body); + + newForm.cuid = cuid(); + newForm.save((err, saved) => { + // If error sending email for whatever reason, respond with 500 status + if (err) { + res.status(500).send(err); + res.json({ form: saved, error: false, message: 'ERROR sending email' }); + } + // If no error, respond with 200 status + res.json({ form: saved, error: false, message: 'Email sent!' }); + res.status(200).end(); + }); +}// addPost diff --git a/server/models/email.js b/server/models/email.js new file mode 100644 index 000000000..324fc1165 --- /dev/null +++ b/server/models/email.js @@ -0,0 +1,13 @@ +import mongoose from 'mongoose'; +const Schema = mongoose.Schema; + +// Schema for email forms +const emailSchema = new Schema({ + to: { type: 'String', required: true }, + title: { type: 'String', required: true }, + body: { type: 'String', required: true }, + cuid: { type: 'String', required: true }, + dateAdded: { type: 'Date', default: Date.now, required: true } +}); + +export default mongoose.model('Email', emailSchema); diff --git a/server/routes/email.routes.js b/server/routes/email.routes.js new file mode 100644 index 000000000..9579b96f3 --- /dev/null +++ b/server/routes/email.routes.js @@ -0,0 +1,9 @@ +import { Router } from 'express'; +import * as EmailController from '../controllers/email.controller'; + +const router = new Router(); + +// Add route for emails +router.route('/email').post(EmailController.addPost); + +export default router; diff --git a/server/server.js b/server/server.js index 382249c91..219d982cb 100644 --- a/server/server.js +++ b/server/server.js @@ -49,6 +49,9 @@ import posts from './routes/post.routes'; import dummyData from './dummyData'; import serverConfig from './config'; +// NEW: Import module for emails +import emails from './routes/email.routes'; + // Set native promises as mongoose promise mongoose.Promise = global.Promise; @@ -72,6 +75,9 @@ app.use(bodyParser.urlencoded({ limit: '20mb', extended: false })); app.use(Express.static(path.resolve(__dirname, '../dist/client'))); app.use('/api', posts); +// NEW: Apply body Parser and server public assets and routes for emails +app.use('/api', emails); + // Render Initial HTML const renderFullPage = (html, initialState) => { const head = Helmet.rewind(); From 49266a3fb15865fdd55b26d56c58c2d8b47d24d5 Mon Sep 17 00:00:00 2001 From: bbrengma Date: Mon, 6 Apr 2020 21:03:28 -0400 Subject: [PATCH 2/2] Email class Add file that contains the class for an email form --- client/modules/Email/Email.js | 38 +++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 client/modules/Email/Email.js diff --git a/client/modules/Email/Email.js b/client/modules/Email/Email.js new file mode 100644 index 000000000..50fc910bd --- /dev/null +++ b/client/modules/Email/Email.js @@ -0,0 +1,38 @@ +import React, { Component } from 'react'; + +class Email extends Component { + + constructor(props) { + super(props); + this.state = { + to: "", + title: "", + body: "" + }; + } + + render() { + return ( +
+
Send an email:
+
+
+ + +
+
+ + +
+
+ + +
+ +
+
+ ); + } +} + +export default Email;