Refactoring + improved validation on POST signup
This commit is contained in:
@ -1,13 +1,42 @@
|
|||||||
|
/**
|
||||||
|
* Module dependencies.
|
||||||
|
*/
|
||||||
var mongoose = require('mongoose');
|
var mongoose = require('mongoose');
|
||||||
var passport = require('passport');
|
var passport = require('passport');
|
||||||
var _ = require('underscore');
|
var _ = require('underscore');
|
||||||
|
|
||||||
// Import models
|
/**
|
||||||
|
* Models.
|
||||||
|
*/
|
||||||
var User = require('../models/User');
|
var User = require('../models/User');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GET /login
|
||||||
|
* Login page.
|
||||||
|
*/
|
||||||
|
exports.getLogin = function(req, res) {
|
||||||
|
if (req.user) return res.redirect('/');
|
||||||
|
res.render('account/login', {
|
||||||
|
title: 'Login',
|
||||||
|
messages: req.flash('messages')
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GET /signup
|
||||||
|
* Signup page.
|
||||||
|
*/
|
||||||
|
exports.getSignup = function(req, res) {
|
||||||
|
if (req.user) return res.redirect('/');
|
||||||
|
res.render('account/signup', {
|
||||||
|
title: 'Create Account',
|
||||||
|
messages: req.flash('messages')
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GET /account
|
* GET /account
|
||||||
* User account page.
|
* Profile page.
|
||||||
*/
|
*/
|
||||||
exports.getAccount = function(req, res) {
|
exports.getAccount = function(req, res) {
|
||||||
res.render('account/profile', {
|
res.render('account/profile', {
|
||||||
@ -17,6 +46,77 @@ exports.getAccount = function(req, res) {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* POST /login
|
||||||
|
* Sign in using email and password.
|
||||||
|
*/
|
||||||
|
exports.postLogin = function(req, res, next) {
|
||||||
|
passport.authenticate('local', function(err, user, info) {
|
||||||
|
if (err) return next(err);
|
||||||
|
if (!user) {
|
||||||
|
req.flash('messages', info.message);
|
||||||
|
return res.redirect('/login');
|
||||||
|
}
|
||||||
|
req.logIn(user, function(err) {
|
||||||
|
if (err) return next(err);
|
||||||
|
return res.redirect('/');
|
||||||
|
});
|
||||||
|
})(req, res, next);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* POST /signup
|
||||||
|
* Create a new local account.
|
||||||
|
* @param {String} req.body.email
|
||||||
|
* @param {String} req.body.password
|
||||||
|
*/
|
||||||
|
exports.postSignup = function(req, res, next) {
|
||||||
|
|
||||||
|
var errors = [];
|
||||||
|
|
||||||
|
if (!req.body.email) {
|
||||||
|
errors.push('Email is missing.');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!req.body.password) {
|
||||||
|
errors.push('Password is missing.');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (req.body.password !== req.body.confirmPassword) {
|
||||||
|
errors.push('Passwords do not match.');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (errors.length) {
|
||||||
|
req.flash('messages', errors);
|
||||||
|
return res.redirect('/signup');
|
||||||
|
}
|
||||||
|
|
||||||
|
var user = new User({
|
||||||
|
username: req.body.username,
|
||||||
|
password: req.body.password
|
||||||
|
});
|
||||||
|
|
||||||
|
// TODO: simplify
|
||||||
|
user.save(function(err) {
|
||||||
|
if (err) {
|
||||||
|
if (err.name === 'ValidationError') {
|
||||||
|
// TODO: make more explicit
|
||||||
|
req.flash('messages', _.map(err.errors, function(value, key) { return value.message; }));
|
||||||
|
}
|
||||||
|
if (err.code === 11000) {
|
||||||
|
req.flash('messages', 'User already exists.');
|
||||||
|
}
|
||||||
|
return res.redirect('/signup');
|
||||||
|
}
|
||||||
|
|
||||||
|
req.logIn(user, function(err) {
|
||||||
|
if (err) return next(err);
|
||||||
|
res.redirect('/');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* POST /account/profile
|
* POST /account/profile
|
||||||
* Update profile information.
|
* Update profile information.
|
||||||
@ -46,7 +146,7 @@ exports.postUpdateProfile = function(req, res, next) {
|
|||||||
exports.postUpdatePassword = function(req, res, next) {
|
exports.postUpdatePassword = function(req, res, next) {
|
||||||
|
|
||||||
// TODO: Use Virtuals (mongoose)
|
// TODO: Use Virtuals (mongoose)
|
||||||
if (!req.body.password || !req.body.confirm.password) {
|
if (!req.body.password || !req.body.confirmPassword) {
|
||||||
req.flash('error', 'Passwords cannot be blank');
|
req.flash('error', 'Passwords cannot be blank');
|
||||||
return res.redirect('/account');
|
return res.redirect('/account');
|
||||||
}
|
}
|
||||||
@ -79,91 +179,6 @@ exports.postDeleteAccount = function(req, res, next) {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* GET /login
|
|
||||||
* User login page
|
|
||||||
*/
|
|
||||||
exports.getLogin = function(req, res) {
|
|
||||||
if (req.user) return res.redirect('back');
|
|
||||||
res.render('account/login', {
|
|
||||||
title: 'Login',
|
|
||||||
messages: req.flash('messages')
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* POST /login
|
|
||||||
* Log in with provided credentials (non-oauth)
|
|
||||||
*/
|
|
||||||
exports.postLogin = function(req, res, next) {
|
|
||||||
passport.authenticate('local', function(err, user, info) {
|
|
||||||
if (err) return next(err);
|
|
||||||
if (!user) {
|
|
||||||
req.flash('messages', info.message);
|
|
||||||
return res.redirect('/login');
|
|
||||||
}
|
|
||||||
req.logIn(user, function(err) {
|
|
||||||
if (err) return next(err);
|
|
||||||
return res.redirect('/');
|
|
||||||
});
|
|
||||||
})(req, res, next);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* GET /signup
|
|
||||||
* User signup page
|
|
||||||
*/
|
|
||||||
exports.getSignup = function(req, res) {
|
|
||||||
if (req.user) return res.redirect('back');
|
|
||||||
res.render('account/signup', {
|
|
||||||
title: 'Create Account',
|
|
||||||
messages: req.flash('messages')
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* POST /signup
|
|
||||||
* Create a new user (non-oauth)
|
|
||||||
*/
|
|
||||||
exports.postSignup = function(req, res, next) {
|
|
||||||
// TODO: add mongoose validation on ToS (virtual?)
|
|
||||||
// TODO: Mongoose virtual, move logic to model
|
|
||||||
|
|
||||||
if (req.body.password !== req.body.confirmPassword) {
|
|
||||||
req.flash('messages', 'Passwords do not match');
|
|
||||||
return res.redirect('/signup');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!req.body.tos) {
|
|
||||||
req.flash('messages', 'You must agree to terms and conditions');
|
|
||||||
return res.redirect('/signup');
|
|
||||||
}
|
|
||||||
|
|
||||||
var user = new User({
|
|
||||||
username: req.body.username,
|
|
||||||
password: req.body.password
|
|
||||||
});
|
|
||||||
|
|
||||||
// TODO: simplify
|
|
||||||
user.save(function(err) {
|
|
||||||
if (err) {
|
|
||||||
if (err.name === 'ValidationError') {
|
|
||||||
// TODO: make more explicit
|
|
||||||
req.flash('messages', _.map(err.errors, function(value, key) { return value.message; }));
|
|
||||||
}
|
|
||||||
if (err.code === 11000) {
|
|
||||||
req.flash('messages', 'User already exists');
|
|
||||||
}
|
|
||||||
return res.redirect('/signup');
|
|
||||||
}
|
|
||||||
|
|
||||||
req.logIn(user, function(err) {
|
|
||||||
if (err) return next(err);
|
|
||||||
res.redirect('/');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GET /account/unlink/:provider
|
* GET /account/unlink/:provider
|
||||||
* Unlink an oauth provider from the current user
|
* Unlink an oauth provider from the current user
|
||||||
@ -178,7 +193,7 @@ exports.getOauthUnlink = function(req, res, next) {
|
|||||||
|
|
||||||
user.save(function(err) {
|
user.save(function(err) {
|
||||||
if (err) return next(err);
|
if (err) return next(err);
|
||||||
res.redirect('/account#settings');
|
res.redirect('/account');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user