refactor(User): Make requestAuthEmail into instance method

This commit is contained in:
Berkeley Martinez
2017-12-26 20:12:15 -08:00
committed by mrugesh mohapatra
parent b35501c78e
commit 44c2eb65d5
2 changed files with 43 additions and 59 deletions

View File

@ -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
) { ) {

View File

@ -22,6 +22,10 @@
"emailVerifyTTL": { "emailVerifyTTL": {
"type": "date" "type": "date"
}, },
"emailVerified": {
"type": "bolean",
"default": false
},
"emailAuthLinkTTL": { "emailAuthLinkTTL": {
"type": "date" "type": "date"
}, },