From 384c200501cc4a04b7195e1933539a5e8e1b68a7 Mon Sep 17 00:00:00 2001 From: Phillip Lorenzo Date: Wed, 9 Nov 2016 14:12:20 -0800 Subject: [PATCH 1/8] Updated naming conventions for widget models and updated API endpoint definitions. --- README.md | 12 +++++++++++- bin/www | 5 +++++ config/config.js | 7 +++++++ models/dashboard.js | 11 +++++++++++ models/user.js | 10 ++++++++++ models/widget.js | 13 +++++++++++++ package.json | 3 ++- routes/index.js | 11 +++++------ routes/users.js | 17 ++++++++++------- server/index.js | 5 +++-- views/layout.pug | 2 -- yarn.lock | 26 +++++++++++++++++--------- 12 files changed, 94 insertions(+), 28 deletions(-) create mode 100644 config/config.js create mode 100644 models/dashboard.js create mode 100644 models/user.js create mode 100644 models/widget.js diff --git a/README.md b/README.md index 2fbf185..4c07573 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,16 @@ A mongodb database named lizardboard must be created prior to starting the appli - brew install mongodb - Ensure `mongo` is running - yarn install +- yarn start (start the server) + +Lizardboard needs an .env file to specify environment variables that are required to run the application. +``` +echo MONGODB_URI=mongodb://localhost/lizardboard >> .env +``` + +## (Optional) Configuration for testing +- recommended - utilize Postman and Robomongo to test api routing + ## Technical Stack @@ -31,4 +41,4 @@ A mongodb database named lizardboard must be created prior to starting the appli - [React](https://facebook.github.io/react/) ## Testing -TBD \ No newline at end of file +TBD diff --git a/bin/www b/bin/www index 9a999cc..aede685 100755 --- a/bin/www +++ b/bin/www @@ -8,6 +8,9 @@ var app = require('../server/index'); var debug = require('debug')('src:server'); var http = require('http'); +const mongoose = require('mongoose') +mongoose.Promise = global.Promise +const connection = process.env.MONGODB_URI /** * Get port from environment and store in Express. */ @@ -15,6 +18,8 @@ var http = require('http'); var port = normalizePort(process.env.PORT || '3000'); app.set('port', port); +mongoose.connect( connection ) + .then( () => server.listen( port ) ) /** * Create HTTP server. */ diff --git a/config/config.js b/config/config.js new file mode 100644 index 0000000..e71085d --- /dev/null +++ b/config/config.js @@ -0,0 +1,7 @@ +const fs = require('fs') + +if( fs.existsSync( '.env' ) ) { + require( 'dotenv' ).config() +} else { + console.log( ".env not found, skipping dotenv config" ) +} diff --git a/models/dashboard.js b/models/dashboard.js new file mode 100644 index 0000000..c825500 --- /dev/null +++ b/models/dashboard.js @@ -0,0 +1,11 @@ +const mongoose = require('mongoose') +const { Schema } = mongoose + +const DashboardSchema = mongoose.Schema ({ + user: {type: Number, ref: 'User'}, + widgets: [{type: Schema.Types.ObjectId, ref:'Widget'}] +}) + +const Dashboard = mongoose.model('Dashboard', DashboardSchema) + +module.exports = Dashboard diff --git a/models/user.js b/models/user.js new file mode 100644 index 0000000..b733b59 --- /dev/null +++ b/models/user.js @@ -0,0 +1,10 @@ +const mongoose = require('mongoose') +const { Schema } = mongoose + +const UserSchema = new Schema ({ + username: String, +}) + +const User = mongoose.model( 'User', UserSchema ) + +module.exports = User diff --git a/models/widget.js b/models/widget.js new file mode 100644 index 0000000..d0cc8f0 --- /dev/null +++ b/models/widget.js @@ -0,0 +1,13 @@ +const mongoose = require('mongoose') +const { Schema } = mongoose + +const WidgetSchema = new Schema ({ + type: String, + title: String, + size: String, + contents: String +}) + +const Widget = mongoose.model( 'Widget', WidgetSchema ) + +module.exports = Widget diff --git a/package.json b/package.json index 5533364..84f39f3 100644 --- a/package.json +++ b/package.json @@ -21,9 +21,10 @@ "body-parser": "~1.15.1", "cookie-parser": "~1.4.3", "debug": "~2.2.0", + "dotenv": "^2.0.0", "ejs": "^2.5.2", "express": "~4.13.4", - "mongoose": "^4.6.5", + "mongoose": "^4.6.6", "morgan": "~1.7.0", "pug": "^2.0.0-beta6", "react": "^15.3.2", diff --git a/routes/index.js b/routes/index.js index 806b164..bed1042 100644 --- a/routes/index.js +++ b/routes/index.js @@ -1,9 +1,8 @@ -const express = require('express'); -const router = express.Router(); +const express = require('express') +const router = express.Router() -/* GET home page. */ router.get('/', (request, response, next) => { - response.render('index', { title: 'Dragonboard', logo: 'D' }); -}); + response.render('index', { title: 'Dragonboard', logo: 'D' }) +}) -module.exports = router; +module.exports = router diff --git a/routes/users.js b/routes/users.js index 4baa47e..78d4cf6 100644 --- a/routes/users.js +++ b/routes/users.js @@ -1,9 +1,12 @@ -const express = require('express'); -const router = express.Router(); +const express = require('express') +const router = express.Router() +const mongoose = require('mongoose') +const User = require('../models/user.js') -/* GET users listing. */ -router.get('/', (request, response, next) => { - response.send('respond with a resource'); -}); +router.post( '/', (request, response, next ) => { + User.create( request.body ) + .then( user => response.json( user ) ) + .catch( error => next( error) ) +}) -module.exports = router; +module.exports = router diff --git a/server/index.js b/server/index.js index 3d4d5c1..884d7fd 100644 --- a/server/index.js +++ b/server/index.js @@ -5,12 +5,13 @@ const logger = require('morgan'); const cookieParser = require('cookie-parser'); const bodyParser = require('body-parser'); +const env = process.env.NODE_ENV || 'development'; +const config = require(__dirname + '/../config/config.js')[env]; const routes = require('../routes/index'); const users = require('../routes/users'); const appRoot = process.env.APP_ROOT const app = express(); - // view engine setup app.set('views', path.join(__dirname, '../views')); app.set('view engine', 'pug'); @@ -70,4 +71,4 @@ app.use(function(err, req, res, next) { }); -module.exports = app; \ No newline at end of file +module.exports = app; diff --git a/views/layout.pug b/views/layout.pug index d6daa39..f541f17 100644 --- a/views/layout.pug +++ b/views/layout.pug @@ -22,5 +22,3 @@ html div.footer-nav include footer - script(src="/javascripts/index.js") - script(src="/public/javascripts/index.js") diff --git a/yarn.lock b/yarn.lock index 53dcb99..413a620 100644 --- a/yarn.lock +++ b/yarn.lock @@ -109,11 +109,11 @@ async@~0.2.6: version "0.2.10" resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" -async@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/async/-/async-2.0.1.tgz#b709cc0280a9c36f09f4536be823c838a9049e25" +async@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/async/-/async-2.1.2.tgz#612a4ab45ef42a70cde806bad86ee6db047e8385" dependencies: - lodash "^4.8.0" + lodash "^4.14.0" asynckit@^0.4.0: version "0.4.0" @@ -916,6 +916,10 @@ doctypes@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/doctypes/-/doctypes-1.1.0.tgz#ea80b106a87538774e8a3a4a5afe293de489e0a9" +dotenv: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-2.0.0.tgz#bd759c357aaa70365e01c96b7b0bec08a6e0d949" + duplexer@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" @@ -1681,7 +1685,11 @@ lodash.restparam@^3.0.0: version "3.6.1" resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" -lodash@^4.2.0, lodash@^4.8.0: +lodash@^4.14.0: + version "4.16.6" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.16.6.tgz#d22c9ac660288f3843e16ba7d2b5d06cca27d777" + +lodash@^4.2.0: version "4.16.5" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.16.5.tgz#77d88feac548009b1a5c4ca7b49ac431ce346ae8" @@ -1798,11 +1806,11 @@ mongodb@2.2.11: mongodb-core "2.0.13" readable-stream "2.1.5" -mongoose@^4.6.5: - version "4.6.5" - resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-4.6.5.tgz#74eed37312e557c391d428c0cf3c8b8eb8959515" +mongoose: + version "4.6.6" + resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-4.6.6.tgz#62817b63804dcefd2e5c6f7e6a9bb68e30811968" dependencies: - async "2.0.1" + async "2.1.2" bson "~0.5.4" hooks-fixed "1.2.0" kareem "1.1.3" From 2448a140270de0c1b91d1b0aad0a03b80b040ecb Mon Sep 17 00:00:00 2001 From: Phillip Lorenzo Date: Thu, 10 Nov 2016 15:48:52 -0800 Subject: [PATCH 2/8] Cleaned up spacing in users.js file --- routes/users.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routes/users.js b/routes/users.js index 78d4cf6..e89a5fe 100644 --- a/routes/users.js +++ b/routes/users.js @@ -6,7 +6,7 @@ const User = require('../models/user.js') router.post( '/', (request, response, next ) => { User.create( request.body ) .then( user => response.json( user ) ) - .catch( error => next( error) ) + .catch( error => next( error ) ) }) module.exports = router From 937221c24f2da9b70eab24513b3030175fd532c6 Mon Sep 17 00:00:00 2001 From: Phillip Lorenzo Date: Wed, 9 Nov 2016 14:12:20 -0800 Subject: [PATCH 3/8] Updated naming conventions for widget models and updated API endpoint definitions. --- README.md | 3 +-- yarn.lock | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index 4c07573..1df27da 100644 --- a/README.md +++ b/README.md @@ -16,8 +16,7 @@ A mongodb database named lizardboard must be created prior to starting the appli - yarn start (start the server) Lizardboard needs an .env file to specify environment variables that are required to run the application. -``` -echo MONGODB_URI=mongodb://localhost/lizardboard >> .env +``` echo MONGODB_URI=mongodb://localhost/lizardboard >> .env ``` ## (Optional) Configuration for testing diff --git a/yarn.lock b/yarn.lock index 413a620..8263cd2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2800,4 +2800,3 @@ yargs@~3.10.0: cliui "^2.1.0" decamelize "^1.0.0" window-size "0.1.0" - From bcdba383c0d0009b71e352689dfe7004cb12c5c1 Mon Sep 17 00:00:00 2001 From: Amelia Clarke Date: Tue, 8 Nov 2016 16:23:04 -0800 Subject: [PATCH 4/8] Installed nodemailer and implemented welcome email --- package.json | 2 ++ server/mailer/welcomeemail.js | 28 ++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 server/mailer/welcomeemail.js diff --git a/package.json b/package.json index 84f39f3..b624bda 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,8 @@ "express": "~4.13.4", "mongoose": "^4.6.6", "morgan": "~1.7.0", + "nodemailer": "^2.6.4", + "nodemailer-sendgrid-transport": "^0.2.0", "pug": "^2.0.0-beta6", "react": "^15.3.2", "react-dom": "^15.3.2", diff --git a/server/mailer/welcomeemail.js b/server/mailer/welcomeemail.js new file mode 100644 index 0000000..8494b07 --- /dev/null +++ b/server/mailer/welcomeemail.js @@ -0,0 +1,28 @@ +import nodemailer from 'nodemailer' +import sgTransport from 'nodemailer-sendgrid-transport' + +const sgOptions = { + auth: { + api_user: 'SENDGRID_USERNAME', + api_key: 'SENDGRID_PASSWORD' + } +} + +const mailer = nodemailer.createTransport(sgTransport(sgOptions)) + +const sendWelcomeEmail = user => { + return mailer.sendMail( welcomeEmail(user.email, user.name) ) +} + +const welcomeEmail = ( userEmail, userName ) => { + return { + from: '"LizardBoard" ', + to: userEmail, + subject: `Are You Ready For Lizards, ${userName}?`, + text: "Welcome to Lizardboard, we have lizards.", + html: "

Lizards~!

" + } +} + + +module.exports = { sendWelcomeEmail } From 1706f53641ddb29abfe00389580d1d1d74c7ab2c Mon Sep 17 00:00:00 2001 From: Amelia Clarke Date: Thu, 10 Nov 2016 12:09:36 -0800 Subject: [PATCH 5/8] Welcome emails are sending via smtpTransport --- models/user.js | 1 + package.json | 1 + routes/users.js | 8 ++++++-- server/mailer/welcomeemail.js | 17 +++++++---------- 4 files changed, 15 insertions(+), 12 deletions(-) diff --git a/models/user.js b/models/user.js index b733b59..01ff71b 100644 --- a/models/user.js +++ b/models/user.js @@ -3,6 +3,7 @@ const { Schema } = mongoose const UserSchema = new Schema ({ username: String, + email: String }) const User = mongoose.model( 'User', UserSchema ) diff --git a/package.json b/package.json index b624bda..324b7e9 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "morgan": "~1.7.0", "nodemailer": "^2.6.4", "nodemailer-sendgrid-transport": "^0.2.0", + "nodemailer-smtp-transport": "^2.7.2", "pug": "^2.0.0-beta6", "react": "^15.3.2", "react-dom": "^15.3.2", diff --git a/routes/users.js b/routes/users.js index e89a5fe..55c4127 100644 --- a/routes/users.js +++ b/routes/users.js @@ -2,11 +2,15 @@ const express = require('express') const router = express.Router() const mongoose = require('mongoose') const User = require('../models/user.js') +const {sendWelcomeEmail} = require('../server/mailer/welcomeemail.js') router.post( '/', (request, response, next ) => { User.create( request.body ) - .then( user => response.json( user ) ) - .catch( error => next( error ) ) + .then( user => { + sendWelcomeEmail(user) + response.json( user ) + }) + .catch( error => next( error) ) }) module.exports = router diff --git a/server/mailer/welcomeemail.js b/server/mailer/welcomeemail.js index 8494b07..787e866 100644 --- a/server/mailer/welcomeemail.js +++ b/server/mailer/welcomeemail.js @@ -1,17 +1,14 @@ -import nodemailer from 'nodemailer' -import sgTransport from 'nodemailer-sendgrid-transport' +const nodemailer = require('nodemailer') +const smtpTransport = require('nodemailer-smtp-transport') + -const sgOptions = { - auth: { - api_user: 'SENDGRID_USERNAME', - api_key: 'SENDGRID_PASSWORD' - } -} -const mailer = nodemailer.createTransport(sgTransport(sgOptions)) +const mailer = nodemailer.createTransport(smtpTransport('smtps://lizardboardmailer@gmail.com:lizardmail!@smtp.gmail.com')) const sendWelcomeEmail = user => { - return mailer.sendMail( welcomeEmail(user.email, user.name) ) + console.log(user) + console.log('sending email') + return mailer.sendMail( welcomeEmail(user.email, user.username) ) } const welcomeEmail = ( userEmail, userName ) => { From d45383171269aaaa56e277cce9b1db27ea4af273 Mon Sep 17 00:00:00 2001 From: Amelia Clarke Date: Thu, 10 Nov 2016 12:14:19 -0800 Subject: [PATCH 6/8] Email and password for mailer are now found in .env --- server/mailer/welcomeemail.js | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/server/mailer/welcomeemail.js b/server/mailer/welcomeemail.js index 787e866..12949ef 100644 --- a/server/mailer/welcomeemail.js +++ b/server/mailer/welcomeemail.js @@ -1,23 +1,22 @@ const nodemailer = require('nodemailer') const smtpTransport = require('nodemailer-smtp-transport') - - -const mailer = nodemailer.createTransport(smtpTransport('smtps://lizardboardmailer@gmail.com:lizardmail!@smtp.gmail.com')) +const mailer = nodemailer.createTransport(smtpTransport(`smtps://${process.env.MAILER_EMAIL}:${process.env.MAILER_PASSWORD}@smtp.gmail.com`)) const sendWelcomeEmail = user => { console.log(user) console.log('sending email') + console.log(process.env.MAILER_PASSWORD) return mailer.sendMail( welcomeEmail(user.email, user.username) ) } const welcomeEmail = ( userEmail, userName ) => { return { - from: '"LizardBoard" ', + from: '"Lizardboard" ', to: userEmail, subject: `Are You Ready For Lizards, ${userName}?`, - text: "Welcome to Lizardboard, we have lizards.", - html: "

Lizards~!

" + text: "Welcome to Lizardboard", + html: "

We have so many lizards.

" } } From 73f0a1b08ad5dd6315ffaa4b304eb56f017a2b53 Mon Sep 17 00:00:00 2001 From: Amelia Clarke Date: Thu, 10 Nov 2016 14:52:50 -0800 Subject: [PATCH 7/8] Added .env instructions for mailer to readme, updated mailer text --- README.md | 3 +++ routes/users.js | 2 +- server/mailer/welcomeemail.js | 15 ++++++++++----- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 1df27da..f3db2b2 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,9 @@ A mongodb database named lizardboard must be created prior to starting the appli Lizardboard needs an .env file to specify environment variables that are required to run the application. ``` echo MONGODB_URI=mongodb://localhost/lizardboard >> .env + echo PORT=3000 >> .env + echo MAILER_EMAIL=lizardboardmailer@gmail.com >> .env + echo MAILER_PASSWORD=lizardmail! >> .env ``` ## (Optional) Configuration for testing diff --git a/routes/users.js b/routes/users.js index 55c4127..0d03754 100644 --- a/routes/users.js +++ b/routes/users.js @@ -2,7 +2,7 @@ const express = require('express') const router = express.Router() const mongoose = require('mongoose') const User = require('../models/user.js') -const {sendWelcomeEmail} = require('../server/mailer/welcomeemail.js') +const { sendWelcomeEmail } = require('../server/mailer/welcomeemail.js') router.post( '/', (request, response, next ) => { User.create( request.body ) diff --git a/server/mailer/welcomeemail.js b/server/mailer/welcomeemail.js index 12949ef..5b88829 100644 --- a/server/mailer/welcomeemail.js +++ b/server/mailer/welcomeemail.js @@ -1,12 +1,15 @@ const nodemailer = require('nodemailer') const smtpTransport = require('nodemailer-smtp-transport') -const mailer = nodemailer.createTransport(smtpTransport(`smtps://${process.env.MAILER_EMAIL}:${process.env.MAILER_PASSWORD}@smtp.gmail.com`)) +const mailer_account = { + email: process.env.MAILER_EMAIL, + password: process.env.MAILER_PASSWORD +} +const mailer = nodemailer.createTransport(smtpTransport( + `smtps://${mailer_account.email}:${mailer_account.password}@smtp.gmail.com`) +) const sendWelcomeEmail = user => { - console.log(user) - console.log('sending email') - console.log(process.env.MAILER_PASSWORD) return mailer.sendMail( welcomeEmail(user.email, user.username) ) } @@ -16,7 +19,9 @@ const welcomeEmail = ( userEmail, userName ) => { to: userEmail, subject: `Are You Ready For Lizards, ${userName}?`, text: "Welcome to Lizardboard", - html: "

We have so many lizards.

" + html: `

Hi ${userName},
I wanted to personally welcome you and + congratulate you on joining Lizardboard.
We've made it super easy + to get started. Just start!
Cheers,
The Lizardboard Team

` } } From 9acbfcbf55db9fb2805c75e79bf67f9ac0262538 Mon Sep 17 00:00:00 2001 From: Amelia Clarke Date: Thu, 10 Nov 2016 15:46:48 -0800 Subject: [PATCH 8/8] Adjusted spacing in users.js route --- routes/users.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routes/users.js b/routes/users.js index 0d03754..17b2c56 100644 --- a/routes/users.js +++ b/routes/users.js @@ -7,7 +7,7 @@ const { sendWelcomeEmail } = require('../server/mailer/welcomeemail.js') router.post( '/', (request, response, next ) => { User.create( request.body ) .then( user => { - sendWelcomeEmail(user) + sendWelcomeEmail( user ) response.json( user ) }) .catch( error => next( error) )