From 969286ee080c7d7a0581bafa4c589a38ac252a0d Mon Sep 17 00:00:00 2001 From: Thomas Hauge Date: Tue, 5 Dec 2017 05:28:25 +0100 Subject: [PATCH 1/9] zotimi fillestar --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 7513987..ed10373 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,4 @@ # assignment_thoreddit A social news web application for Viking thunder Gods + +Name: Thomas Hauge From e770109dc9fd5d5a80d66699d33309a4663ab4a5 Mon Sep 17 00:00:00 2001 From: Thomas Hauge Date: Tue, 5 Dec 2017 08:24:21 +0100 Subject: [PATCH 2/9] login --- .gitignore | 3 + app.js | 79 +++++++++++++++++++++++++ config/mongo.json | 13 +++++ controllers/sessions.js | 65 +++++++++++++++++++++ controllers/users.js | 87 ++++++++++++++++++++++++++++ models/index.js | 11 ++++ models/post.js | 17 ++++++ models/user.js | 18 ++++++ mongo.js | 10 ++++ package.json | 38 ++++++++++++ repl.js | 13 +++++ seeds/index.js | 49 ++++++++++++++++ views/layouts/application.handlebars | 23 ++++++++ views/sessions/new.handlebars | 17 ++++++ views/shared/_nav.handlebars | 30 ++++++++++ views/users/edit.handlebars | 31 ++++++++++ views/users/index.handlebars | 45 ++++++++++++++ views/users/new.handlebars | 29 ++++++++++ views/users/show.handlebars | 32 ++++++++++ 19 files changed, 610 insertions(+) create mode 100644 .gitignore create mode 100644 app.js create mode 100644 config/mongo.json create mode 100644 controllers/sessions.js create mode 100644 controllers/users.js create mode 100644 models/index.js create mode 100644 models/post.js create mode 100644 models/user.js create mode 100644 mongo.js create mode 100644 package.json create mode 100644 repl.js create mode 100644 seeds/index.js create mode 100644 views/layouts/application.handlebars create mode 100644 views/sessions/new.handlebars create mode 100644 views/shared/_nav.handlebars create mode 100644 views/users/edit.handlebars create mode 100644 views/users/index.handlebars create mode 100644 views/users/new.handlebars create mode 100644 views/users/show.handlebars diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..69e29b5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +node_modules/ +npm-debug.log +queries.js diff --git a/app.js b/app.js new file mode 100644 index 0000000..64f2f7a --- /dev/null +++ b/app.js @@ -0,0 +1,79 @@ +const express = require('express'); +const app = express(); + +// Body Parser +const bodyParser = require('body-parser'); +app.use(bodyParser.urlencoded({ extended: true })); + +// Session/Cookies +const cookieSession = require('cookie-session'); +app.use( + cookieSession({ + name: 'session', + keys: ['asdf1234'] + }) +); + +app.use((req, res, next) => { + res.locals.session = req.session; + res.locals.currentUser = req.session.currentUser; + next(); +}); + +// Method Override +const methodOverride = require('method-override'); +const getPostSupport = require('express-method-override-get-post-support'); +app.use(methodOverride(getPostSupport.callback, getPostSupport.options)); + +// Referrer +app.use((req, res, next) => { + req.session.backUrl = req.header('Referer') || '/'; + next(); +}); + +// Logging +const morgan = require('morgan'); +app.use(morgan('tiny')); + +// Mongoose +const mongoose = require('mongoose'); +app.use((req, res, next) => { + if (mongoose.connection.readyState) { + next(); + } else { + require('./mongo')().then(() => next()); + } +}); + +// Routes +const sessionsRoutes = require('./controllers/sessions')(app); +app.use('/', sessionsRoutes); + +const usersRoutes = require('./controllers/users'); +app.use('/users', usersRoutes); + +// Template Engine +const expressHandlebars = require('express-handlebars'); + +const hbs = expressHandlebars.create({ + partialsDir: 'views/', + defaultLayout: 'application' +}); + +app.engine('handlebars', hbs.engine); +app.set('view engine', 'handlebars'); + +// Server +const port = process.env.PORT || process.argv[2] || 3000; +const host = 'localhost'; + +let args; +process.env.NODE_ENV === 'production' ? (args = [port]) : (args = [port, host]); + +args.push(() => { + console.log(`Listening: http://${host}:${port}`); +}); + +app.listen.apply(app, args); + +module.exports = app; diff --git a/config/mongo.json b/config/mongo.json new file mode 100644 index 0000000..cff3d4f --- /dev/null +++ b/config/mongo.json @@ -0,0 +1,13 @@ +{ + "development": { + "database": "assignment_thoreddit_development", + "host": "localhost" + }, + "test": { + "database": "assignment_thoreddit_test", + "host": "localhost" + }, + "production": { + "use_env_variable": "MONGODB_URI" + } +} diff --git a/controllers/sessions.js b/controllers/sessions.js new file mode 100644 index 0000000..53833bf --- /dev/null +++ b/controllers/sessions.js @@ -0,0 +1,65 @@ +const url = require('url'); +const express = require('express'); +const mongoose = require('mongoose'); +const models = require('./../models'); + +const router = express.Router(); +const User = mongoose.model('User'); + +module.exports = app => { + // Auth + app.use((req, res, next) => { + const reqUrl = url.parse(req.url); + if ( + !req.session.currentUser && + !['/', '/login', '/sessions'].includes(reqUrl.pathname) + ) { + res.redirect('/login'); + } else { + next(); + } + }); + + // New + const onNew = (req, res) => { + if (req.session.currentUser) { + res.redirect('/users'); + } else { + res.render('sessions/new'); + } + }; + router.get('/', onNew); + router.get('/login', onNew); + + // Create + router.post('/sessions', (req, res) => { + User.findOne({ + username: req.body.username, + email: req.body.email + }) + .then(user => { + if (user) { + req.session.currentUser = { + username: user.username, + email: user.email, + id: user.id, + _id: user._id + }; + res.redirect('/users'); + } else { + res.redirect('/login'); + } + }) + .catch(e => res.status(500).send(e.stack)); + }); + + // Destroy + const onDestroy = (req, res) => { + req.session.currentUser = null; + res.redirect('/login'); + }; + router.get('/logout', onDestroy); + router.delete('/logout', onDestroy); + + return router; +}; diff --git a/controllers/users.js b/controllers/users.js new file mode 100644 index 0000000..adebf52 --- /dev/null +++ b/controllers/users.js @@ -0,0 +1,87 @@ +const express = require('express'); +const mongoose = require('mongoose'); +const models = require('./../models'); + +const router = express.Router(); +const User = mongoose.model('User'); + +// Index +router.get('/', (req, res) => { + User.find() + .then(users => { + res.render('users/index', { users }); + }) + .catch(e => res.status(500).send(e.stack)); +}); + +// New +router.get('/new', (req, res) => { + res.render('users/new'); +}); + +// Edit +router.get('/:id/edit', (req, res) => { + User.findById(req.params.id) + .then(user => { + res.render('users/edit', { user }); + }) + .catch(e => res.status(500).send(e.stack)); +}); + +// Show +router.get('/:id', (req, res) => { + User.findById(req.params.id) + .then(user => { + res.render('users/show', { user }); + }) + .catch(e => res.status(500).send(e.stack)); +}); + +// Create +router.post('/', (req, res) => { + const user = new User({ + fname: req.body.user.fname, + lname: req.body.user.lname, + username: req.body.user.username, + email: req.body.user.email + }); + + user + .save() + .then(user => { + res.redirect(`/users/${user.id}`); + }) + .catch(e => res.status(500).send(e.stack)); +}); + +// Update +router.put('/:id', (req, res) => { + const userParams = { + fname: req.body.user.fname, + lname: req.body.user.lname, + username: req.body.user.username, + email: req.body.user.email + }; + + User.findByIdAndUpdate(req.params.id, userParams) + .then(user => { + res.redirect(`/users/${user.id}`); + }) + .catch(e => res.status(500).send(e.stack)); +}); + +// Destroy +router.delete('/:id', (req, res) => { + const currentUser = req.session.currentUser; + User.findByIdAndRemove(req.params.id) + .then(() => { + if (currentUser.id === req.params.id) { + res.redirect('/logout'); + } else { + res.redirect('/users'); + } + }) + .catch(e => res.status(500).send(e.stack)); +}); + +module.exports = router; diff --git a/models/index.js b/models/index.js new file mode 100644 index 0000000..77e206d --- /dev/null +++ b/models/index.js @@ -0,0 +1,11 @@ +const mongoose = require('mongoose'); +const bluebird = require('bluebird'); + +mongoose.Promise = bluebird; + +let models = {}; + +// Load models and attach to models here +models.User = require('./user'); + +module.exports = models; diff --git a/models/post.js b/models/post.js new file mode 100644 index 0000000..d7e900b --- /dev/null +++ b/models/post.js @@ -0,0 +1,17 @@ +const mongoose = require('mongoose'); +const Schema = mongoose.Schema; + +const PostSchema = new Schema( + { + title: String, + body: String + // author: + }, + { + timestamps: true + } +); + +const Post = mongoose.model('Post', PostSchema); + +module.exports = Post; diff --git a/models/user.js b/models/user.js new file mode 100644 index 0000000..807a277 --- /dev/null +++ b/models/user.js @@ -0,0 +1,18 @@ +const mongoose = require('mongoose'); +const Schema = mongoose.Schema; + +const UserSchema = new Schema( + { + fname: String, + lname: String, + username: String, + email: String + }, + { + timestamps: true + } +); + +const User = mongoose.model('User', UserSchema); + +module.exports = User; diff --git a/mongo.js b/mongo.js new file mode 100644 index 0000000..9e9db31 --- /dev/null +++ b/mongo.js @@ -0,0 +1,10 @@ +const mongoose = require('mongoose'); +const env = process.env.NODE_ENV || 'development'; +const config = require('./config/mongo')[env]; + +module.exports = () => { + const envUrl = process.env[config.use_env_variable]; + const localUrl = `mongodb://${config.host}/${config.database}`; + const mongoUrl = envUrl ? envUrl : localUrl; + return mongoose.connect(mongoUrl); +}; diff --git a/package.json b/package.json new file mode 100644 index 0000000..dea8c19 --- /dev/null +++ b/package.json @@ -0,0 +1,38 @@ +{ + "name": "assignment_thoreddit", + "version": "1.0.0", + "description": "A social news web application for Viking thunder Gods", + "main": "app.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "which nodemon > /dev/null && nodemon app.js || node app.js", + "console": "node repl.js", + "c": "node repl.js", + "seed": "node seeds", + "seeds": "node seeds" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/thomahau/assignment_thoreddit.git" + }, + "author": "", + "license": "ISC", + "bugs": { + "url": "https://github.com/thomahau/assignment_thoreddit/issues" + }, + "homepage": "https://github.com/thomahau/assignment_thoreddit#readme", + "dependencies": { + "bluebird": "^3.5.1", + "body-parser": "^1.18.2", + "cookie-session": "^2.0.0-beta.3", + "express": "^4.16.2", + "express-handlebars": "^3.0.0", + "express-method-override-get-post-support": "^1.0.0", + "faker": "^4.1.0", + "method-override": "^2.3.10", + "mongoose": "^4.13.6", + "mongooseeder": "^2.0.5", + "morgan": "^1.9.0", + "voca": "^1.3.1" + } +} diff --git a/repl.js b/repl.js new file mode 100644 index 0000000..539cffe --- /dev/null +++ b/repl.js @@ -0,0 +1,13 @@ +const mongoose = require('mongoose'); +const repl = require('repl').start({}); +const models = require('./models'); + +require('./mongo')().then(() => { + repl.context.models = models; + + Object.keys(models).forEach(modelName => { + repl.context[modelName] = mongoose.model(modelName); + }); + + repl.context.lg = data => console.log(data); +}); diff --git a/seeds/index.js b/seeds/index.js new file mode 100644 index 0000000..a923eef --- /dev/null +++ b/seeds/index.js @@ -0,0 +1,49 @@ +const mongoose = require('mongoose'); +const mongooseeder = require('mongooseeder'); +const faker = require('faker'); +const voca = require('voca'); +const models = require('./../models'); +const env = process.env.NODE_ENV || 'development'; +const config = require('./../config/mongo')[env]; + +const { User } = models; +const MULTIPLIER = 1; + +const seeds = () => { + // Users + console.log('Creating Users'); + const users = []; + for (let i = 0; i < MULTIPLIER * 5; i++) { + const user = new User({ + fname: 'Foo', + lname: 'Bar', + username: `foobar${i}`, + email: `foobar${i}@gmail.com` + }); + users.push(user); + } + // Posts + + // Finish + console.log('Saving...'); + const promises = []; + [users].forEach(collection => { + collection.forEach(model => { + promises.push(model.save()); + }); + }); + return Promise.all(promises); +}; + +const mongodbUrl = + process.env.NODE_ENV === 'production' + ? process.env[config.use_env_variable] + : `mongodb://${config.host}/${config.database}`; + +mongooseeder.seed({ + mongodbUrl: mongodbUrl, + seeds: seeds, + clean: true, + models: models, + mongoose: mongoose +}); diff --git a/views/layouts/application.handlebars b/views/layouts/application.handlebars new file mode 100644 index 0000000..f82289c --- /dev/null +++ b/views/layouts/application.handlebars @@ -0,0 +1,23 @@ + + + + + + + + Thoreddit + + + + + + + + + + {{> shared/_nav }} +
+ {{{ body }}} +
+ + diff --git a/views/sessions/new.handlebars b/views/sessions/new.handlebars new file mode 100644 index 0000000..eafe41e --- /dev/null +++ b/views/sessions/new.handlebars @@ -0,0 +1,17 @@ + + +
+
+ + +
+
+ + +
+
+ +
+
diff --git a/views/shared/_nav.handlebars b/views/shared/_nav.handlebars new file mode 100644 index 0000000..259ff19 --- /dev/null +++ b/views/shared/_nav.handlebars @@ -0,0 +1,30 @@ + diff --git a/views/users/edit.handlebars b/views/users/edit.handlebars new file mode 100644 index 0000000..a60aa48 --- /dev/null +++ b/views/users/edit.handlebars @@ -0,0 +1,31 @@ + + +
+ + +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+
diff --git a/views/users/index.handlebars b/views/users/index.handlebars new file mode 100644 index 0000000..131589b --- /dev/null +++ b/views/users/index.handlebars @@ -0,0 +1,45 @@ + + +{{#if users.length }} + + + + + + + + + + + + + {{#each users as |user| }} + + + + + + + + + {{/each }} + +
First NameLast NameUsernameEmail
+ {{ user.fname }} + + {{ user.lname }} + + {{ user.username }} + + {{ user.email }} + + Edit + + Delete +
+{{else }} +

No users

+{{/if }} diff --git a/views/users/new.handlebars b/views/users/new.handlebars new file mode 100644 index 0000000..7f1a74d --- /dev/null +++ b/views/users/new.handlebars @@ -0,0 +1,29 @@ + + +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+
diff --git a/views/users/show.handlebars b/views/users/show.handlebars new file mode 100644 index 0000000..42a3c4e --- /dev/null +++ b/views/users/show.handlebars @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KeyValue
First Name{{ user.fname }}
Last Name{{ user.lname }}
Username{{ user.username }}
Email{{ user.email }}
From 195c6908690d582405a4a0010ea391e5b4384b88 Mon Sep 17 00:00:00 2001 From: Thomas Hauge Date: Tue, 5 Dec 2017 09:20:26 +0100 Subject: [PATCH 3/9] working on posts --- app.js | 3 +++ controllers/posts.js | 43 ++++++++++++++++++++++++++++++++++++ models/index.js | 2 +- models/post.js | 7 ++++-- seeds/index.js | 9 ++++++++ views/posts/index.handlebars | 43 ++++++++++++++++++++++++++++++++++++ views/posts/new.handlebars | 23 +++++++++++++++++++ views/posts/show.handlebars | 0 views/shared/_nav.handlebars | 4 ++-- 9 files changed, 129 insertions(+), 5 deletions(-) create mode 100644 controllers/posts.js create mode 100644 views/posts/index.handlebars create mode 100644 views/posts/new.handlebars create mode 100644 views/posts/show.handlebars diff --git a/app.js b/app.js index 64f2f7a..a49a74c 100644 --- a/app.js +++ b/app.js @@ -52,6 +52,9 @@ app.use('/', sessionsRoutes); const usersRoutes = require('./controllers/users'); app.use('/users', usersRoutes); +const postsRoutes = require('./controllers/posts'); +app.use('/posts', postsRoutes); + // Template Engine const expressHandlebars = require('express-handlebars'); diff --git a/controllers/posts.js b/controllers/posts.js new file mode 100644 index 0000000..ffc74ed --- /dev/null +++ b/controllers/posts.js @@ -0,0 +1,43 @@ +const express = require('express'); +const mongoose = require('mongoose'); +const models = require('./../models'); + +const router = express.Router(); +// const User = mongoose.model('User'); +const Post = mongoose.model('Post'); + +// Index +router.get('/', (req, res) => { + Post.find() + .populate('author') + .then(posts => { + res.render('posts/index', { posts }); + }) + .catch(e => res.status(500).send(e.stack)); +}); + +// New +router.get('/new', (req, res) => { + res.render('posts/new'); +}); + +// Show + +// Create +router.post('/', (req, res) => { + const post = new Post({ + title: req.body.post.title, + body: req.body.post.body, + author: req.body.post.author + }); + + post + .save() + .then(post => { + res.redirect('/posts'); + // res.redirect(`/posts/${post.id}`); + }) + .catch(e => res.status(500).send(e.stack)); +}); + +module.exports = router; diff --git a/models/index.js b/models/index.js index 77e206d..1aa386d 100644 --- a/models/index.js +++ b/models/index.js @@ -5,7 +5,7 @@ mongoose.Promise = bluebird; let models = {}; -// Load models and attach to models here models.User = require('./user'); +models.Post = require('./post'); module.exports = models; diff --git a/models/post.js b/models/post.js index d7e900b..12f3040 100644 --- a/models/post.js +++ b/models/post.js @@ -4,8 +4,11 @@ const Schema = mongoose.Schema; const PostSchema = new Schema( { title: String, - body: String - // author: + body: String, + author: { + type: Schema.Types.ObjectId, + ref: 'User' + } }, { timestamps: true diff --git a/seeds/index.js b/seeds/index.js index a923eef..5d2676f 100644 --- a/seeds/index.js +++ b/seeds/index.js @@ -23,6 +23,15 @@ const seeds = () => { users.push(user); } // Posts + // console.log('Creating Posts'); + // const posts = []; + // for (let i = 0; i < MULTIPLIER * 5; i++) { + // const post = new Post({ + // title: + // body: + // + // }) + // } // Finish console.log('Saving...'); diff --git a/views/posts/index.handlebars b/views/posts/index.handlebars new file mode 100644 index 0000000..7379e3f --- /dev/null +++ b/views/posts/index.handlebars @@ -0,0 +1,43 @@ + + +{{#if posts.length }} + + + + + + + + + + + {{#each posts as |post| }} + + + + + + + + {{/each }} + +
Posted AtTitleBodyUsername
+ {{ post.createdAt }} + + {{ post.title }} + + {{ post.body }} + + {{ post.author.username }} +
+{{else }} +

No posts

+{{/if }} diff --git a/views/posts/new.handlebars b/views/posts/new.handlebars new file mode 100644 index 0000000..57a75ec --- /dev/null +++ b/views/posts/new.handlebars @@ -0,0 +1,23 @@ + + +
+
+ +
+ +
+ + +
+ +
+ + +
+ +
+ +
+
diff --git a/views/posts/show.handlebars b/views/posts/show.handlebars new file mode 100644 index 0000000..e69de29 diff --git a/views/shared/_nav.handlebars b/views/shared/_nav.handlebars index 259ff19..e7fea37 100644 --- a/views/shared/_nav.handlebars +++ b/views/shared/_nav.handlebars @@ -1,4 +1,4 @@ -