diff --git a/common/app/routes/settings/components/Settings.jsx b/common/app/routes/settings/components/Settings.jsx index 1609c44c8bc..5d7880234af 100644 --- a/common/app/routes/settings/components/Settings.jsx +++ b/common/app/routes/settings/components/Settings.jsx @@ -258,6 +258,15 @@ export class Settings extends React.Component { > Delete my Free Code Camp account + diff --git a/server/boot/user.js b/server/boot/user.js index cc5ea1d664c..3a4aab0fe94 100644 --- a/server/boot/user.js +++ b/server/boot/user.js @@ -183,6 +183,16 @@ module.exports = function(app) { sendNonUserToMap, getAccount ); + router.get( + '/reset-my-progress', + sendNonUserToMap, + showResetProgress + ); + api.post( + '/account/resetprogress', + ifNoUser401, + postResetProgress + ); // Ensure these are the last routes! api.get( @@ -450,6 +460,35 @@ module.exports = function(app) { }); } + function showResetProgress(req, res) { + return res.render('account/reset-progress', { title: 'Reset My Progress!' + }); + } + + function postResetProgress(req, res, next) { + User.findById(req.user.id, function(err, user) { + if (err) { return next(err); } + return user.updateAttributes({ + progressTimestamps: [{ + timestamp: Date.now() + }], + currentStreak: 0, + longestStreak: 0, + currentChallengeId: '', + isBackEndCert: false, + isFullStackCert: false, + isDataVisCert: false, + isFrontEndCert: false, + challengeMap: {}, + challegesCompleted: [] + }, function(err) { + if (err) { return next(err); } + req.flash('info', { msg: 'You\'ve successfully reset your progress.' }); + return res.redirect('/'); + }); + }); + } + function getReset(req, res) { if (!req.accessToken) { req.flash('errors', { msg: 'access token invalid' }); diff --git a/server/views/account/reset-progress.jade b/server/views/account/reset-progress.jade new file mode 100644 index 00000000000..40311da1972 --- /dev/null +++ b/server/views/account/reset-progress.jade @@ -0,0 +1,25 @@ +extends ../layout +block content + include ../partials/flyer + #modal-dialog.modal.animated.wobble + .modal-dialog + .modal-content + .modal-header + a.close(href='/settings', data-dismiss='modal', aria-hidden='true') × + h3 You don't really want to reset your progress, do you? + .modal-body + p This will really delete all of your progress and brownie points. + p We won't be able to recover any of it for you later, even if you change your mind. + .modal-footer + a.btn.btn-success.btn-block(href='/settings', data-dismiss='modal', aria-hidden='true') + | Nevermind, I don't want to delete all of my progress and brownie points + .spacer + form(action='/account/resetprogress', method='POST') + input(type='hidden', name='_csrf', value=_csrf) + button.btn.btn-danger.btn-block(type='submit') + | I am 100% sure I want to reset all of my progress and brownie points + script. + document.addEventListener('DOMContentLoaded', function() { + const modal$ = document.getElementById('modal-dialog'); + modal$.classList.add('show'); + });