From 43ed1917e2d914229bd87e65e43be8f8d39885bf Mon Sep 17 00:00:00 2001 From: stephengrider Date: Mon, 17 Jul 2017 15:41:42 -0700 Subject: [PATCH 01/27] mailer --- server/services/Mailer.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/server/services/Mailer.js b/server/services/Mailer.js index 60f5127..09ad996 100644 --- a/server/services/Mailer.js +++ b/server/services/Mailer.js @@ -2,6 +2,15 @@ const sendgrid = require('sendgrid'); const helper = sendgrid.mail; const keys = require('../config/keys'); -class Mailer extends helper.Mail {} +class Mailer extends helper.Mail { + constructor({ subject, recipients }, content) { + super(); + + this.from_email = new helper.Email('no-reply@emaily.com'); + this.subject = subject; + this.body = new helper.Content('text/html', content); + this.recipients = this.formatAddresses(recipients); + } +} module.exports = Mailer; From 598ba5efa5e00603fa1d0e6209b93e8b16aeacb1 Mon Sep 17 00:00:00 2001 From: stephengrider Date: Mon, 17 Jul 2017 15:52:19 -0700 Subject: [PATCH 02/27] email boilerplate --- server/services/Mailer.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/server/services/Mailer.js b/server/services/Mailer.js index 09ad996..17eab5c 100644 --- a/server/services/Mailer.js +++ b/server/services/Mailer.js @@ -10,6 +10,24 @@ class Mailer extends helper.Mail { this.subject = subject; this.body = new helper.Content('text/html', content); this.recipients = this.formatAddresses(recipients); + + this.addContent(this.body); + this.addClickTracking(); + this.addRecipients(); + } + + formatAddresses(recipients) { + return recipients.map(({ email }) => { + return new helper.Email(email); + }); + } + + addClickTracking() { + const trackingSettings = new helper.TrackingSettings(); + const clickTracking = new helper.ClickTracking(true, true); + + trackingSettings.setClickTracking(clickTracking); + this.addTrackingSettings(trackingSettings); } } From fcfde28b005931d8d78f2d0d7cf397c08710857e Mon Sep 17 00:00:00 2001 From: stephengrider Date: Mon, 17 Jul 2017 16:14:18 -0700 Subject: [PATCH 03/27] send emails --- server/services/Mailer.js | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/server/services/Mailer.js b/server/services/Mailer.js index 17eab5c..7b9b599 100644 --- a/server/services/Mailer.js +++ b/server/services/Mailer.js @@ -6,6 +6,7 @@ class Mailer extends helper.Mail { constructor({ subject, recipients }, content) { super(); + this.sgApi = sendgrid(keys.sendGridKey); this.from_email = new helper.Email('no-reply@emaily.com'); this.subject = subject; this.body = new helper.Content('text/html', content); @@ -29,6 +30,26 @@ class Mailer extends helper.Mail { trackingSettings.setClickTracking(clickTracking); this.addTrackingSettings(trackingSettings); } + + addRecipients() { + const personalize = new helper.Personalization(); + + this.recipients.forEach(recipient => { + personalize.addTo(recipient); + }); + this.addPersonalization(personalize); + } + + async send() { + const request = this.sgApi.emptyRequest({ + method: 'POST', + path: '/v3/mail/send', + body: this.toJSON() + }); + + const response = this.sgApi.API(request); + return response; + } } module.exports = Mailer; From 7faa7b6a83e8b9cf9fab2a7a3169351235cdbad0 Mon Sep 17 00:00:00 2001 From: stephengrider Date: Mon, 17 Jul 2017 16:30:30 -0700 Subject: [PATCH 04/27] test emails --- server/routes/surveyRoutes.js | 1 + 1 file changed, 1 insertion(+) diff --git a/server/routes/surveyRoutes.js b/server/routes/surveyRoutes.js index bd1ed5c..5b0d9bc 100644 --- a/server/routes/surveyRoutes.js +++ b/server/routes/surveyRoutes.js @@ -21,5 +21,6 @@ module.exports = app => { // Great place to send an email! const mailer = new Mailer(survey, surveyTemplate(survey)); + mailer.send(); }); }; From 454eeba56e3cf6fd24240b7f2fb5cc74cf48a410 Mon Sep 17 00:00:00 2001 From: stephengrider Date: Mon, 17 Jul 2017 16:49:44 -0700 Subject: [PATCH 05/27] improve template --- server/client/src/index.js | 4 ++++ server/index.js | 1 + .../services/emailTemplates/surveyTemplate.js | 18 +++++++++++++++++- 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/server/client/src/index.js b/server/client/src/index.js index b4fa33d..2c6c4f4 100644 --- a/server/client/src/index.js +++ b/server/client/src/index.js @@ -8,6 +8,10 @@ import reduxThunk from 'redux-thunk'; import App from './components/App'; import reducers from './reducers'; +// Development only axios helpers! +import axios from 'axios'; +window.axios = axios; + const store = createStore(reducers, {}, applyMiddleware(reduxThunk)); ReactDOM.render( diff --git a/server/index.js b/server/index.js index 081dce7..d30d3aa 100644 --- a/server/index.js +++ b/server/index.js @@ -8,6 +8,7 @@ require('./models/User'); require('./models/Survey'); require('./services/passport'); +mongoose.Promise = global.Promise; mongoose.connect(keys.mongoURI); const app = express(); diff --git a/server/services/emailTemplates/surveyTemplate.js b/server/services/emailTemplates/surveyTemplate.js index 4ddb6f3..696dee1 100644 --- a/server/services/emailTemplates/surveyTemplate.js +++ b/server/services/emailTemplates/surveyTemplate.js @@ -1,3 +1,19 @@ module.exports = survey => { - return '
' + survey.body + '
'; + return ` + + +
+

I'd like your input!

+

Please answer the following question:

+

${survey.body}

+
+ Yes +
+
+ No +
+
+ + + `; }; From c8e3cfd14b6036fe12a73a113c9ef577535d46ee Mon Sep 17 00:00:00 2001 From: stephengrider Date: Mon, 17 Jul 2017 17:17:47 -0700 Subject: [PATCH 06/27] added error checking --- server/routes/surveyRoutes.js | 14 ++++++++++++-- server/services/Mailer.js | 2 +- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/server/routes/surveyRoutes.js b/server/routes/surveyRoutes.js index 5b0d9bc..4b5e217 100644 --- a/server/routes/surveyRoutes.js +++ b/server/routes/surveyRoutes.js @@ -7,7 +7,7 @@ const surveyTemplate = require('../services/emailTemplates/surveyTemplate'); const Survey = mongoose.model('surveys'); module.exports = app => { - app.post('/api/surveys', requireLogin, requireCredits, (req, res) => { + app.post('/api/surveys', requireLogin, requireCredits, async (req, res) => { const { title, subject, body, recipients } = req.body; const survey = new Survey({ @@ -21,6 +21,16 @@ module.exports = app => { // Great place to send an email! const mailer = new Mailer(survey, surveyTemplate(survey)); - mailer.send(); + + try { + await mailer.send(); + await survey.save(); + req.user.credits -= 1; + const user = await req.user.save(); + + res.send(user); + } catch (err) { + res.status(422).send(err); + } }); }; diff --git a/server/services/Mailer.js b/server/services/Mailer.js index 7b9b599..78a2358 100644 --- a/server/services/Mailer.js +++ b/server/services/Mailer.js @@ -47,7 +47,7 @@ class Mailer extends helper.Mail { body: this.toJSON() }); - const response = this.sgApi.API(request); + const response = await this.sgApi.API(request); return response; } } From 821bb80e265b9320b976d39cc2c234144db69fa7 Mon Sep 17 00:00:00 2001 From: stephengrider Date: Mon, 17 Jul 2017 17:38:24 -0700 Subject: [PATCH 07/27] feedback for feedback --- server/config/prod.js | 3 ++- server/routes/surveyRoutes.js | 4 ++++ server/services/emailTemplates/surveyTemplate.js | 6 ++++-- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/server/config/prod.js b/server/config/prod.js index e043f6e..c053d56 100644 --- a/server/config/prod.js +++ b/server/config/prod.js @@ -6,5 +6,6 @@ module.exports = { cookieKey: process.env.COOKIE_KEY, stripePublishableKey: process.env.STRIPE_PUBLISHABLE_KEY, stripeSecretKey: process.env.STRIPE_SECRET_KEY, - sendGridKey: process.env.SEND_GRID_KEY + sendGridKey: process.env.SEND_GRID_KEY, + redirectDomain: process.env.REDIRECT_DOMAIN }; diff --git a/server/routes/surveyRoutes.js b/server/routes/surveyRoutes.js index 4b5e217..54d410f 100644 --- a/server/routes/surveyRoutes.js +++ b/server/routes/surveyRoutes.js @@ -7,6 +7,10 @@ const surveyTemplate = require('../services/emailTemplates/surveyTemplate'); const Survey = mongoose.model('surveys'); module.exports = app => { + app.get('/api/surveys/thanks', (req, res) => { + res.send('Thanks for voting!'); + }); + app.post('/api/surveys', requireLogin, requireCredits, async (req, res) => { const { title, subject, body, recipients } = req.body; diff --git a/server/services/emailTemplates/surveyTemplate.js b/server/services/emailTemplates/surveyTemplate.js index 696dee1..dd052bd 100644 --- a/server/services/emailTemplates/surveyTemplate.js +++ b/server/services/emailTemplates/surveyTemplate.js @@ -1,3 +1,5 @@ +const keys = require('../../config/keys'); + module.exports = survey => { return ` @@ -7,10 +9,10 @@ module.exports = survey => {

Please answer the following question:

${survey.body}

- Yes + Yes
- No + No
From de5aaee4db688104b1d47b471293a3322ee8c913 Mon Sep 17 00:00:00 2001 From: stephengrider Date: Tue, 18 Jul 2017 13:13:04 -0700 Subject: [PATCH 08/27] dashboard --- server/client/src/components/App.js | 2 +- server/client/src/components/Dashboard.js | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 server/client/src/components/Dashboard.js diff --git a/server/client/src/components/App.js b/server/client/src/components/App.js index def2c2d..2de6d6c 100644 --- a/server/client/src/components/App.js +++ b/server/client/src/components/App.js @@ -5,7 +5,7 @@ import * as actions from '../actions'; import Header from './Header'; import Landing from './Landing'; -const Dashboard = () =>

Dashboard

; +import Dashboard from './Dashboard'; const SurveyNew = () =>

SurveyNew

; class App extends Component { diff --git a/server/client/src/components/Dashboard.js b/server/client/src/components/Dashboard.js new file mode 100644 index 0000000..a804635 --- /dev/null +++ b/server/client/src/components/Dashboard.js @@ -0,0 +1,11 @@ +import React from 'react'; + +const Dashboard = () => { + return ( +
+ Dashboard +
+ ); +}; + +export default Dashboard; From c0b0080034e6631dbfe90499d78abbfe36acb589 Mon Sep 17 00:00:00 2001 From: stephengrider Date: Tue, 18 Jul 2017 13:25:45 -0700 Subject: [PATCH 09/27] material icons --- server/client/public/index.html | 1 + server/client/src/components/Dashboard.js | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/server/client/public/index.html b/server/client/public/index.html index 7bee027..1f3073d 100644 --- a/server/client/public/index.html +++ b/server/client/public/index.html @@ -10,6 +10,7 @@ --> +