From c17ff59aef7d3155ea733b0735df3c0c95c3e862 Mon Sep 17 00:00:00 2001 From: jameskopacz Date: Wed, 25 Mar 2015 20:43:11 -0500 Subject: [PATCH] Handle callback errors for user, bonfire, challenges, courseware, and resources controllers --- controllers/bonfire.js | 53 +++++++++++++++++++++------------------ controllers/challenges.js | 4 +-- controllers/courseware.js | 16 ++++++------ controllers/resources.js | 4 ++- controllers/user.js | 18 +++++++------ 5 files changed, 53 insertions(+), 42 deletions(-) diff --git a/controllers/bonfire.js b/controllers/bonfire.js index 83431a390d..2fe914df9d 100644 --- a/controllers/bonfire.js +++ b/controllers/bonfire.js @@ -35,7 +35,7 @@ exports.index = function(req, res) { }); }; -exports.returnNextBonfire = function(req, res) { +exports.returnNextBonfire = function(req, res, next) { if (!req.user) { return res.redirect('../bonfires/meet-bonfire'); } @@ -48,24 +48,24 @@ exports.returnNextBonfire = function(req, res) { return elem; } }); - req.user.save(); - - var uncompletedBonfires = req.user.uncompletedBonfires; - - var displayedBonfires = Bonfire.find({'_id': uncompletedBonfires[0]}); - displayedBonfires.exec(function(err, bonfire) { - if (err) { - next(err); - } - bonfire = bonfire.pop(); - if (bonfire === undefined) { - req.flash('errors', { - msg: "It looks like you've completed all the bonfires we have available. Good job!" - }); - return res.redirect('../bonfires/meet-bonfire'); - } - nameString = bonfire.name.toLowerCase().replace(/\s/g, '-'); - return res.redirect('../bonfires/' + nameString); + req.user.save(function(err) { + if (err) return next(err); + var uncompletedBonfires = req.user.uncompletedBonfires; + var displayedBonfires = Bonfire.find({'_id': uncompletedBonfires[0]}); + displayedBonfires.exec(function(err, bonfire) { + if (err) { + return next(err); + } + bonfire = bonfire.pop(); + if (bonfire === undefined) { + req.flash('errors', { + msg: "It looks like you've completed all the bonfires we have available. Good job!" + }); + return res.redirect('../bonfires/meet-bonfire'); + } + nameString = bonfire.name.toLowerCase().replace(/\s/g, '-'); + return res.redirect('../bonfires/' + nameString); + }); }); }; @@ -76,7 +76,7 @@ exports.returnIndividualBonfire = function(req, res, next) { Bonfire.find({"name" : new RegExp(bonfireName, 'i')}, function(err, bonfire) { if (err) { - next(err); + return next(err); } @@ -215,7 +215,7 @@ exports.generateChallenge = function(req, res) { res.send(response); }; -exports.completedBonfire = function (req, res) { +exports.completedBonfire = function (req, res, next) { var isCompletedWith = req.body.bonfireInfo.completedWith || undefined; var isCompletedDate = Math.round(+new Date() / 1000); var bonfireHash = req.body.bonfireInfo.bonfireHash; @@ -225,7 +225,7 @@ exports.completedBonfire = function (req, res) { var paired = User.find({"profile.username": isCompletedWith.toLowerCase()}).limit(1); paired.exec(function (err, pairedWith) { if (err) { - return err; + return next(err); } else { var index = req.user.uncompletedBonfires.indexOf(bonfireHash); if (index > -1) { @@ -256,9 +256,12 @@ exports.completedBonfire = function (req, res) { }) req.user.save(function (err, user) { + if (err) { + return next(err); + } pairedWith.save(function (err, paired) { if (err) { - throw err; + return next(err); } if (user && paired) { res.send(true); @@ -284,7 +287,7 @@ exports.completedBonfire = function (req, res) { req.user.save(function (err, user) { if (err) { - throw err; + return next(err); } if (user) { debug('Saving user'); @@ -292,4 +295,4 @@ exports.completedBonfire = function (req, res) { } }); } -}; \ No newline at end of file +}; diff --git a/controllers/challenges.js b/controllers/challenges.js index 6658e18e13..85dcae7130 100644 --- a/controllers/challenges.js +++ b/controllers/challenges.js @@ -27,7 +27,7 @@ exports.returnNextChallenge = function(req, res) { } }; -exports.returnChallenge = function(req, res) { +exports.returnChallenge = function(req, res, next) { var challengeNumber = parseInt(req.params.challengeNumber) || 0; if (challengeNumber === 2) { return res.redirect('../challenges/3'); @@ -41,7 +41,7 @@ exports.returnChallenge = function(req, res) { Challenge.find({}, null, { sort: { challengeNumber: 1 } }, function(err, c) { if (err) { debug('Challenge err: ', err); - next(err); + return next(err); } res.render('challenges/show', { title: 'Challenge: ' + c[challengeNumber].name, diff --git a/controllers/courseware.js b/controllers/courseware.js index 58e57cef7d..069ede984f 100644 --- a/controllers/courseware.js +++ b/controllers/courseware.js @@ -14,7 +14,7 @@ exports.coursewareNames = function(req, res) { }); }; -exports.returnNextCourseware = function(req, res) { +exports.returnNextCourseware = function(req, res, next) { if (!req.user) { return res.redirect('../coursewares/start-our-challenges'); } @@ -27,14 +27,16 @@ exports.returnNextCourseware = function(req, res) { return elem; } }); - req.user.save(); + req.user.save(function(err) { + if (err) return next(err); + }); var uncompletedCoursewares = req.user.uncompletedCoursewares; var displayedCoursewares = Courseware.find({'_id': uncompletedCoursewares[0]}); displayedCoursewares.exec(function(err, courseware) { if (err) { - next(err); + return next(err); } courseware = courseware.pop(); if (courseware === undefined) { @@ -55,7 +57,7 @@ exports.returnIndividualCourseware = function(req, res, next) { Courseware.find({"name" : new RegExp(coursewareName, 'i')}, function(err, courseware) { if (err) { - next(err); + return next(err); } // Handle not found if (courseware.length < 1) { @@ -203,7 +205,7 @@ exports.generateChallenge = function(req, res) { res.send(response); }; -exports.completedCourseware = function (req, res) { +exports.completedCourseware = function (req, res, next) { var isCompletedDate = Math.round(+new Date() / 1000); var coursewareHash = req.body.coursewareInfo.coursewareHash; @@ -221,10 +223,10 @@ exports.completedCourseware = function (req, res) { req.user.save(function (err, user) { if (err) { - throw err; + return next(err); } if (user) { res.send(true) } }); -}; \ No newline at end of file +}; diff --git a/controllers/resources.js b/controllers/resources.js index fe3d09c0aa..cf8fe48bde 100644 --- a/controllers/resources.js +++ b/controllers/resources.js @@ -182,7 +182,9 @@ module.exports = { if (req.user) { if (!req.user.profile.picture || req.user.profile.picture === "https://s3.amazonaws.com/freecodecamp/favicons/apple-touch-icon-180x180.png") { req.user.profile.picture = "https://s3.amazonaws.com/freecodecamp/camper-image-placeholder.png"; - req.user.save(); + req.user.save(function(err) { + if (err) return next(err); + }); } } var date1 = new Date("10/15/2014"); diff --git a/controllers/user.js b/controllers/user.js index 20fda23b1a..5b0d2a9bb4 100644 --- a/controllers/user.js +++ b/controllers/user.js @@ -179,7 +179,7 @@ exports.postEmailSignup = function(req, res, next) { ].join('') }; transporter.sendMail(mailOptions, function(err) { - if (err) { return err; } + if (err) { return next(err); } }); }); }); @@ -210,8 +210,9 @@ exports.getAccountAngular = function(req, res) { * Unique username check API Call */ -exports.checkUniqueUsername = function(req, res) { +exports.checkUniqueUsername = function(req, res, next) { User.count({'profile.username': req.params.username.toLowerCase()}, function (err, data) { + if (err) { return next(err); } if (data == 1) { return res.send(true); } else { @@ -223,8 +224,9 @@ exports.checkUniqueUsername = function(req, res) { /** * Existing username check */ -exports.checkExistingUsername = function(req, res) { +exports.checkExistingUsername = function(req, res, next) { User.count({'profile.username': req.params.username.toLowerCase()}, function (err, data) { + if (err) { return next(err); } if (data === 1) { return res.send(true); } else { @@ -237,8 +239,9 @@ exports.checkExistingUsername = function(req, res) { * Unique email check API Call */ -exports.checkUniqueEmail = function(req, res) { +exports.checkUniqueEmail = function(req, res, next) { User.count({'email': decodeURIComponent(req.params.email).toLowerCase()}, function (err, data) { + if (err) { return next(err); } if (data == 1) { return res.send(true); } else { @@ -255,10 +258,11 @@ exports.checkUniqueEmail = function(req, res) { exports.returnUser = function(req, res, next) { User.find({'profile.username': req.params.username.toLowerCase()}, function(err, user) { - if (err) { debug('Username err: ', err); next(err); } + if (err) { debug('Username err: ', err); return next(err); } if (user[0]) { var user = user[0]; Challenge.find({}, null, {sort: {challengeNumber: 1}}, function (err, c) { + if (err) { return next(err); } res.render('account/show', { title: 'Camper ' + user.profile.username + '\'s portfolio', username: user.profile.username, @@ -300,7 +304,7 @@ exports.returnUser = function(req, res, next) { * Update profile information. */ -exports.updateProgress = function(req, res) { +exports.updateProgress = function(req, res, next) { User.findById(req.user.id, function(err, user) { if (err) return next(err); user.email = req.body.email || ''; @@ -471,7 +475,7 @@ exports.getOauthUnlink = function(req, res, next) { * Reset Password page. */ -exports.getReset = function(req, res) { +exports.getReset = function(req, res, next) { if (req.isAuthenticated()) { return res.redirect('/'); }