From 90fe02430c828b0d99d5f60c3073c54278d85236 Mon Sep 17 00:00:00 2001 From: nanalelfe Date: Fri, 22 Jul 2016 07:33:52 -0400 Subject: Cleaned up the routing for users. Header changeable depending on whether user is logged in or not. Logout option. --- app.js | 10 ++++ config/passport.js | 18 +++++-- routes/index.js | 81 ------------------------------- routes/user.js | 115 +++++++++++++++++++++++++++++++++++++++++++++ views/partials/header.hbs | 14 ++++-- views/signin.hbs | 2 +- views/signup.hbs | 2 +- views/user_profile_alt.hbs | 14 +++--- 8 files changed, 159 insertions(+), 97 deletions(-) create mode 100644 routes/user.js diff --git a/app.js b/app.js index 8b469f9..a96a932 100644 --- a/app.js +++ b/app.js @@ -12,6 +12,7 @@ var passport = require('passport'); var flash = require('connect-flash'); var routes = require('./routes/index'); +var userRoutes = require('./routes/user'); var app = express(); // Templating engine, we are using handlebars @@ -39,8 +40,17 @@ require('./config/passport'); // simply need to load it /*LOADS ALL STATIC FILES FROM THE DIRECTORY __dirname*/ app.use(express.static(__dirname)); + +// Needed to style the header based on the whether the user is signed in or not +// Gives errors for admin - need to figure out +app.use(function(req, res, next) { + res.locals.login = req.isAuthenticated(); // global variable + next(); +}); + // Allows us to customize express routing // in a separate file. +app.use('/user', userRoutes); app.use('/', routes); module.exports = app; diff --git a/config/passport.js b/config/passport.js index 71e8a15..19acd7f 100644 --- a/config/passport.js +++ b/config/passport.js @@ -1,6 +1,3 @@ -/** - * Created by nanalelfe on 2016-07-20. - */ var passport = require('passport'); var dbFile = require("../node_simple.js"); var LocalStrategy = require('passport-local').Strategy; @@ -52,7 +49,20 @@ passport.use('local_signup', new LocalStrategy({ else { console.log("ELSE"); - return done(null, fields); + var user_data = { + email: fields[0], + user_name: fields[1], + f_name: fields[2], + l_name: fields[3], + university: fields[4], + department: fields[5], + answered: 0, + messages: 0, + comments: 0, + phone_num: fields[7], + followers: [] + }; + return done(null, user_data); } }); diff --git a/routes/index.js b/routes/index.js index 51e1cd2..a0a66d0 100644 --- a/routes/index.js +++ b/routes/index.js @@ -1,11 +1,6 @@ var dbFile = require("../node_simple.js"); var express = require('express'); var router = express.Router(); -var csrf = require('csurf'); // Cross-Site Request Forgery prevention -var passport = require('passport'); - -var csrfProtection = csrf(); -router.use(csrfProtection); // router is protected /* Render/GET homepage. */ router.get('/', function(req, res, next) { @@ -24,11 +19,6 @@ router.get('/user_solutions', function(req, res, next) { res.render('user_solutions'); }); -/* Render/GET user_profile page */ -router.get('/user_profile', function(req, res, next) { - res.render('user_profile_alt'); -}); - /* Render/GET questions page */ router.get('/questions', function(req, res, next) { res.render('questions'); @@ -155,79 +145,8 @@ router.get('/questions/:exam_id', function (req,res) { }); }); -router.get('/signup', function(req, res, next) { - res.render('signup', {csrfToken: req.csrfToken(), success: req.session.success, errors: req.session.errors}); - req.session.errors = null; -}); - -router.get('/signup/failed', function(req, res, next) { - var msg = req.flash('error'); - - res.render('signup', {csrfToken: req.csrfToken(), - success: req.session.success, - errors: req.session.errors, - flashMsg: msg}); -}); - - -router.get('/signin', function (req, res, next) { - var msg = req.flash('error'); - res.render('signin', {csrfToken: req.csrfToken(), success: req.session.success, errors: req.session.errors, flashMsg: msg}); -}); -router.post('/signup', function(req, res, next) { - req.check('fname', 'Please enter a valid first name.').notEmpty().withMessage('First name required.').isAlpha(); - req.check('lname', 'Please enter a valid first name.').notEmpty().withMessage('Last name required.').isAlpha(); - req.check('email', 'Enter a valid Email address').notEmpty().withMessage('Email required').isEmail(); - req.check('usrname', 'Enter a valid username').notEmpty().withMessage('Username required.'); - req.check('password', "Password should be between 6 and 12 characters.") - .notEmpty().withMessage('Password required').isLength({min: 6, max: 12}); - req.check('password', "The confirmation password doesn't match.").equals(req.body.confirmPassword); - req.check('phone_num', 'Please enter a valid phone number').optional().isMobilePhone('en-CA'); - // password has to be at least 4 characters long - - var errors = req.validationErrors(); - if (errors) { - req.session.errors = errors; - req.session.success = false; - res.redirect('/signup'); - } else { - console.log("GOT SUCCESS"); - passport.authenticate('local_signup', { - successRedirect: '/user_profile', - failureRedirect: '/signup/failed', - failureFlash: true - })(req, res); - - } - //res.redirect('/signup'); - -}); - -router.post('/signin', function(req, res, next) { - req.check('usrname', 'Username field is empty.').notEmpty(); - req.check('password', "Password field is empty.").notEmpty(); - // password has to be at least 4 characters long - - var errors = req.validationErrors(); - if (errors) { - req.session.errors = errors; - req.session.success = false; - res.redirect('/signin'); - } else { - console.log("GOT SUCCESS"); - passport.authenticate('local_signin', { - successRedirect: '/user_profile', - failureRedirect: '/signin', - failureFlash: true - })(req, res); - - } - //res.redirect('/signup'); - -}); - /**** Helpers ****/ function getExamsForCourseCode(courseCode) { diff --git a/routes/user.js b/routes/user.js new file mode 100644 index 0000000..a8e90bb --- /dev/null +++ b/routes/user.js @@ -0,0 +1,115 @@ +var express = require('express'); +var router = express.Router(); +var csrf = require('csurf'); // Cross-Site Request Forgery prevention +var passport = require('passport'); + +var csrfProtection = csrf(); +router.use(csrfProtection); // router is protected + + +router.get('/logout', function (req, res, next) { + req.logout(); + res.redirect('/'); +}); + +/* Render/GET user_profile page */ +router.get('/user_profile', loggedIn, function(req, res, next) { + res.render('user_profile_alt'); +}); + +router.get('/signup', function(req, res, next) { + res.render('signup', {csrfToken: req.csrfToken(), success: req.session.success, errors: req.session.errors}); + req.session.errors = null; +}); + +router.get('/signup/failed', function(req, res, next) { + var msg = req.flash('error'); + + res.render('signup', {csrfToken: req.csrfToken(), + success: req.session.success, + errors: req.session.errors, + flashMsg: msg}); +}); + + +router.get('/signin', function (req, res, next) { + var msg = req.flash('error'); + res.render('signin', { + csrfToken: req.csrfToken(), + success: req.session.success, + errors: req.session.errors, + flashMsg: msg + }); +}); + + +router.post('/signup', loggedOut, function(req, res, next) { + req.check('fname', 'Please enter a valid first name.').notEmpty().withMessage('First name required.').isAlpha(); + req.check('lname', 'Please enter a valid first name.').notEmpty().withMessage('Last name required.').isAlpha(); + req.check('email', 'Enter a valid Email address').notEmpty().withMessage('Email required').isEmail(); + req.check('usrname', 'Enter a valid username').notEmpty().withMessage('Username required.'); + req.check('password', "Password should be between 6 and 12 characters.") + .notEmpty().withMessage('Password required').isLength({min: 6, max: 12}); + req.check('password', "The confirmation password doesn't match.").equals(req.body.confirmPassword); + req.check('phone_num', 'Please enter a valid phone number').isMobilePhone('en-CA').optional(); + // password has to be at least 4 characters long + + var errors = req.validationErrors(); + if (errors) { + req.session.errors = errors; + req.session.success = false; + res.redirect('/signup'); + } else { + console.log("GOT SUCCESS"); + passport.authenticate('local_signup', { + successRedirect: '/user/user_profile', + failureRedirect: '/user/signup/failed', + failureFlash: true + })(req, res); + + } + //res.redirect('/signup'); + +}); + +router.post('/signin', loggedOut, function(req, res, next) { + req.check('usrname', 'Username field is empty.').notEmpty(); + req.check('password', "Password field is empty.").notEmpty(); + // password has to be at least 4 characters long + + var errors = req.validationErrors(); + if (errors) { + req.session.errors = errors; + req.session.success = false; + res.redirect('/signin'); + } else { + console.log("GOT SUCCESS"); + passport.authenticate('local_signin', { + successRedirect: '/user/user_profile', + failureRedirect: '/user/signin', + failureFlash: true + })(req, res); + + } + //res.redirect('/signup'); + +}); + +module.exports = router; + + + +function loggedIn(req, res, next) { + if (req.isAuthenticated()) { + return next(); + } + res.redirect('/'); +} + + +function loggedOut(req, res, next) { + if (!req.isAuthenticated()) { + return next(); + } + res.redirect('/'); +} \ No newline at end of file diff --git a/views/partials/header.hbs b/views/partials/header.hbs index 4e7f1c2..9140302 100644 --- a/views/partials/header.hbs +++ b/views/partials/header.hbs @@ -36,15 +36,23 @@
  • Fourth Year
  • -
  • Sign In
  • + {{# if login }} +
  • Profile Page
  • + {{ else }} +
  • Sign In
  • + {{/if}}
  • Admin Panel
  • -
  • Sign up
  • + {{# if login}} +
  • Logout
  • + {{ else }} +
  • Sign up
  • + {{/if}}