refactor(User): Make requestAuthEmail
into instance method
This commit is contained in:
committed by
mrugesh mohapatra
parent
b35501c78e
commit
44c2eb65d5
@ -108,7 +108,9 @@ 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.fromNodeCallback(User.findOrCreate, User);
|
User.create$ = Observable.fromNodeCallback(
|
||||||
|
User.create.bind(User)
|
||||||
|
);
|
||||||
User.prototype.createAccessToken$ = Observable.fromNodeCallback(
|
User.prototype.createAccessToken$ = Observable.fromNodeCallback(
|
||||||
User.prototype.createAccessToken
|
User.prototype.createAccessToken
|
||||||
);
|
);
|
||||||
@ -451,45 +453,42 @@ module.exports = function(User) {
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
User.requestAuthEmail = function requestAuthEmail(email) {
|
User.prototype.getEncodedEmail = function getEncodedEmail() {
|
||||||
if (!isEmail(email)) {
|
if (!this.email) {
|
||||||
return Promise.reject(
|
return null;
|
||||||
new Error('The submitted email not valid.')
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
return Buffer(this.email).toString('base64');
|
||||||
|
};
|
||||||
|
|
||||||
var userObj = {
|
User.decodeEmail = email => Buffer(email, 'base64').toString();
|
||||||
username: 'fcc' + uuid.v4().slice(0, 8),
|
|
||||||
email: email,
|
|
||||||
emailVerified: false
|
|
||||||
};
|
|
||||||
return User.findOrCreate$({ where: { email }}, userObj)
|
|
||||||
.flatMap(([ user, isCreated ]) => {
|
|
||||||
|
|
||||||
const minutesLeft = getWaitPeriod(user.emailAuthLinkTTL);
|
User.prototype.requestAuthEmail = function requestAuthEmail() {
|
||||||
if (minutesLeft > 0) {
|
return Observable.defer(() => {
|
||||||
const timeToWait = minutesLeft ?
|
const minutesLeft = getWaitPeriod(this.emailAuthLinkTTL);
|
||||||
`${minutesLeft} minute${minutesLeft > 1 ? 's' : ''}` :
|
if (minutesLeft > 0) {
|
||||||
'a few seconds';
|
const timeToWait = minutesLeft ?
|
||||||
debug('request before wait time : ' + timeToWait);
|
`${minutesLeft} minute${minutesLeft > 1 ? 's' : ''}` :
|
||||||
return Observable.of(dedent`
|
'a few seconds';
|
||||||
Please wait ${timeToWait} to resend an authentication link.
|
|
||||||
`);
|
|
||||||
}
|
|
||||||
|
|
||||||
const renderAuthEmail = isCreated ?
|
return Observable.of(dedent`
|
||||||
renderSignUpEmail : renderSignInEmail;
|
Please wait ${timeToWait} to resend an authentication link.
|
||||||
|
`);
|
||||||
|
}
|
||||||
|
|
||||||
// create a temporary access token with ttl for 15 minutes
|
// email verified will be false if the user instance has just been created
|
||||||
return user.createAccessToken$({ ttl: 15 * 60 * 1000 })
|
const renderAuthEmail = this.emailVerified === false ?
|
||||||
.flatMap(token => {
|
renderSignInEmail :
|
||||||
|
renderSignUpEmail;
|
||||||
|
|
||||||
|
// create a temporary access token with ttl for 15 minutes
|
||||||
|
return this.createAccessToken$({ ttl: 15 * 60 * 1000 })
|
||||||
|
.flatMap(token => {
|
||||||
const { id: loginToken } = token;
|
const { id: loginToken } = token;
|
||||||
const loginEmail = new Buffer(user.email).toString('base64');
|
const loginEmail = this.getEncodedEmail();
|
||||||
const host = getServerFullURL();
|
const host = getServerFullURL();
|
||||||
const mailOptions = {
|
const mailOptions = {
|
||||||
type: 'email',
|
type: 'email',
|
||||||
to: user.email,
|
to: this.email,
|
||||||
from: getEmailSender(),
|
from: getEmailSender(),
|
||||||
subject: 'freeCodeCamp - Authentication Request!',
|
subject: 'freeCodeCamp - Authentication Request!',
|
||||||
text: renderAuthEmail({
|
text: renderAuthEmail({
|
||||||
@ -504,41 +503,22 @@ module.exports = function(User) {
|
|||||||
const emailAuthLinkTTL = token.created;
|
const emailAuthLinkTTL = token.created;
|
||||||
return this.update$({
|
return this.update$({
|
||||||
emailAuthLinkTTL
|
emailAuthLinkTTL
|
||||||
})
|
})
|
||||||
.map(() => {
|
.map(() => dedent`
|
||||||
return dedent`
|
|
||||||
If you entered a valid email, a magic link is on its way.
|
If you entered a valid email, a magic link is on its way.
|
||||||
Please follow that link to sign in.
|
Please follow that link to sign in.
|
||||||
`;
|
`);
|
||||||
});
|
});
|
||||||
});
|
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
.catch(err => {
|
.catch(err => {
|
||||||
if (err) { debug(err); }
|
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.
|
||||||
`;
|
`;
|
||||||
})
|
});
|
||||||
.toPromise();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
User.remoteMethod(
|
|
||||||
'requestAuthEmail',
|
|
||||||
{
|
|
||||||
description: 'request a link on email with temporary token to sign in',
|
|
||||||
accepts: [{
|
|
||||||
arg: 'email', type: 'string', required: true
|
|
||||||
}],
|
|
||||||
returns: [{
|
|
||||||
arg: 'message', type: 'string'
|
|
||||||
}],
|
|
||||||
http: {
|
|
||||||
path: '/request-auth-link', verb: 'POST'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
User.prototype.requestUpdateEmail = function requestUpdateEmail(
|
User.prototype.requestUpdateEmail = function requestUpdateEmail(
|
||||||
newEmail
|
newEmail
|
||||||
) {
|
) {
|
||||||
|
@ -22,6 +22,10 @@
|
|||||||
"emailVerifyTTL": {
|
"emailVerifyTTL": {
|
||||||
"type": "date"
|
"type": "date"
|
||||||
},
|
},
|
||||||
|
"emailVerified": {
|
||||||
|
"type": "bolean",
|
||||||
|
"default": false
|
||||||
|
},
|
||||||
"emailAuthLinkTTL": {
|
"emailAuthLinkTTL": {
|
||||||
"type": "date"
|
"type": "date"
|
||||||
},
|
},
|
||||||
|
Reference in New Issue
Block a user