fix: Add error handling and refactoring of Observable methods

This commit is contained in:
Mrugesh Mohapatra
2017-04-24 00:37:10 +05:30
committed by Berkeley Martinez
parent a426ff7ef9
commit 3f332fc1f0
2 changed files with 26 additions and 34 deletions

View File

@ -107,7 +107,10 @@ module.exports = function(User) {
User.findOne$ = Observable.fromNodeCallback(User.findOne, User); User.findOne$ = Observable.fromNodeCallback(User.findOne, User);
User.update$ = Observable.fromNodeCallback(User.updateAll, User); User.update$ = Observable.fromNodeCallback(User.updateAll, User);
User.count$ = Observable.fromNodeCallback(User.count, User); User.count$ = Observable.fromNodeCallback(User.count, User);
User.findOrCreate$ = Observable.fromCallback(User.findOrCreate, User); User.findOrCreate$ = Observable.fromNodeCallback(User.findOrCreate, User);
User.prototype.createAccessToken$ = Observable.fromNodeCallback(
User.prototype.createAccessToken
);
}); });
User.beforeRemote('create', function({ req }) { User.beforeRemote('create', function({ req }) {
@ -566,30 +569,25 @@ module.exports = function(User) {
emailVerified: false emailVerified: false
}; };
return User.findOrCreate$({ where: { email }}, userObj) return User.findOrCreate$({ where: { email }}, userObj)
.map(([ err, user, isCreated ]) => { .flatMap(([ user, isCreated ]) => {
if (err) {
return dedent`
Oops, something is not right, please try again later.
`;
}
const minutesLeft = getWaitPeriod(user.emailAuthLinkTTL); const minutesLeft = getWaitPeriod(user.emailAuthLinkTTL);
if (minutesLeft) { if (minutesLeft > 0) {
const timeToWait = minutesLeft ? const timeToWait = minutesLeft ?
`${minutesLeft} minute${minutesLeft > 1 ? 's' : ''}` : `${minutesLeft} minute${minutesLeft > 1 ? 's' : ''}` :
'a few seconds'; 'a few seconds';
debug('request before wait time : ' + timeToWait); debug('request before wait time : ' + timeToWait);
return dedent` return Observable.of(dedent`
Please wait ${timeToWait} to resend an authentication link. Please wait ${timeToWait} to resend an authentication link.
`; `);
} }
const renderAuthEmail = isCreated ? const renderAuthEmail = isCreated ?
renderSignUpEmail : renderSignInEmail; renderSignUpEmail : renderSignInEmail;
// create a temporary access token with ttl for 1 hour // create a temporary access token with ttl for 15 minutes
return user.createAccessToken({ ttl: 60 * 60 * 1000 }, (err, token) => { return user.createAccessToken$({ ttl: 15 * 60 * 1000 })
if (err) { throw err; } .flatMap(token => {
const { id: loginToken } = token; const { id: loginToken } = token;
const loginEmail = user.email; const loginEmail = user.email;
@ -597,29 +595,27 @@ module.exports = function(User) {
const mailOptions = { const mailOptions = {
type: 'email', type: 'email',
to: user.email, to: user.email,
<<<<<<< HEAD
from: 'Team@freecodecamp.com',
subject: 'Free Code Camp - Authentication Request!',
=======
from: isDev ? from: isDev ?
process.env.EMAIL_SENDER : 'team@freecodecamp.com', process.env.EMAIL_SENDER : 'team@freecodecamp.com',
subject: 'freeCodeCamp - Authentication Request!', subject: 'freeCodeCamp - Authentication Request!',
>>>>>>> fix(email): allow sender email var for development
text: renderAuthEmail({ text: renderAuthEmail({
loginEmail, loginEmail,
loginToken loginToken
}) })
}; };
this.email.send(mailOptions, err =>{ return this.email.send$(mailOptions)
if (err) { throw err; } .flatMap(() => {
}); const emailAuthLinkTTL = token.created;
const emailAuthLinkTTL = token.created; return this.update$({
this.update$({ emailAuthLinkTTL
emailAuthLinkTTL })
}) .map(() => {
.do(() => { return dedent`
this.emailAuthLinkTTL = emailAuthLinkTTL; If you entered a valid email, a magic link is on its way.
Please follow that link to sign in.
`;
});
}); });
return dedent` return dedent`
@ -628,8 +624,8 @@ module.exports = function(User) {
`; `;
}); });
}) })
.map((msg) => { .catch(err => {
if (msg) { return msg; } if (err) { debug(err); }
return dedent` return dedent`
Oops, something is not right, please try again later. Oops, something is not right, please try again later.
`; `;

View File

@ -290,15 +290,11 @@ module.exports = function(app) {
const userId = authToken.userId; const userId = authToken.userId;
return User.findById(userId, (err, user) => { return User.findById(userId, (err, user) => {
if (err) { if (err || !user || user.email !== authEmailId) {
debug(err); debug(err);
req.flash('info', { msg: defaultErrorMsg }); req.flash('info', { msg: defaultErrorMsg });
return res.redirect('/email-signin'); return res.redirect('/email-signin');
} }
if (user.email !== authEmailId) {
req.flash('info', { msg: defaultErrorMsg });
return res.redirect('/email-signin');
}
return authToken.validate((err, isValid) => { return authToken.validate((err, isValid) => {
if (err) { throw err; } if (err) { throw err; }
if (!isValid) { if (!isValid) {