fix: Add error handling and refactoring of Observable methods
This commit is contained in:
committed by
Berkeley Martinez
parent
a426ff7ef9
commit
3f332fc1f0
@ -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;
|
||||||
this.update$({
|
return this.update$({
|
||||||
emailAuthLinkTTL
|
emailAuthLinkTTL
|
||||||
})
|
})
|
||||||
.do(() => {
|
.map(() => {
|
||||||
this.emailAuthLinkTTL = emailAuthLinkTTL;
|
return dedent`
|
||||||
|
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.
|
||||||
`;
|
`;
|
||||||
|
@ -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) {
|
||||||
|
Reference in New Issue
Block a user