Skip to content
Snippets Groups Projects
Commit d2418542 authored by Andrei Cioromila's avatar Andrei Cioromila
Browse files

refactor(user): extract forgot password email

parent 46d07119
No related branches found
No related tags found
3 merge requests!160Update staging with master features,!156Develop,!149Hin 1089
...@@ -10,39 +10,33 @@ const { name: journalName, staffEmail } = config.get('journal') ...@@ -10,39 +10,33 @@ const { name: journalName, staffEmail } = config.get('journal')
const unsubscribeSlug = config.get('unsubscribe.url') const unsubscribeSlug = config.get('unsubscribe.url')
module.exports = { module.exports = {
async sendNotifications({ user, baseUrl }) { async sendForgotPasswordEmail({ user, baseUrl }) {
const { paragraph, ...bodyProps } = getEmailCopy({
emailType: 'user-forgot-password',
})
const email = new Email({ const email = new Email({
type: 'system', type: 'system',
toUser: {
email: user.email,
},
fromEmail: `${journalName} <${staffEmail}>`, fromEmail: `${journalName} <${staffEmail}>`,
content: { content: {
subject: 'Forgot Password',
ctaLink: services.createUrl(baseUrl, forgotPath, { ctaLink: services.createUrl(baseUrl, forgotPath, {
email: user.email, email: user.email,
token: user.accessTokens.passwordReset, token: user.accessTokens.passwordReset,
}), }),
ctaText: 'RESET PASSWORD', ctaText: 'RESET PASSWORD',
paragraph,
unsubscribeLink: services.createUrl(baseUrl, unsubscribeSlug, {
id: user.id,
token: user.accessTokens.unsubscribe,
}),
}, },
bodyProps,
}) })
sendForgotPasswordEmail({ email, baseUrl, user }) email.sendEmail()
}, },
} }
const sendForgotPasswordEmail = ({ email, baseUrl, user }) => {
email.toUser = {
email: user.email,
}
email.content.subject = 'Forgot Password'
email.content.unsubscribeLink = services.createUrl(baseUrl, unsubscribeSlug, {
id: user.id,
token: user.accessTokens.unsubscribe,
})
const { html, text } = email.getNotificationBody({
emailBodyProps: getEmailCopy({
emailType: 'user-forgot-password',
}),
})
email.sendEmail({ html, text })
}
...@@ -10,41 +10,41 @@ module.exports = models => async (req, res) => { ...@@ -10,41 +10,41 @@ module.exports = models => async (req, res) => {
if (!services.checkForUndefinedParams(email)) if (!services.checkForUndefinedParams(email))
return res.status(400).json({ error: 'Email address is required.' }) return res.status(400).json({ error: 'Email address is required.' })
let user
try { try {
const user = await models.User.findByEmail(email) user = await models.User.findByEmail(email)
const authsome = authsomeHelper.getAuthsome(models)
const canRequest = await authsome.can(req.user, '', {
targetUser: user,
})
if (!canRequest) {
return res.status(403).json({ error: 'Unauthorized.' })
}
if (user.passwordResetTimestamp) {
const resetDate = new Date(user.passwordResetTimestamp)
const hoursPassed = Math.floor(
(new Date().getTime() - resetDate) / 3600000,
)
if (hoursPassed < 24) {
return res
.status(400)
.json({ error: 'A password reset has already been requested.' })
}
}
user.accessTokens.passwordReset = services.generateHash()
user.passwordResetTimestamp = Date.now()
await user.save()
notifications.sendNotifications({
user,
baseUrl: services.getBaseUrl(req),
})
} catch (e) { } catch (e) {
logger.error( logger.error(
`A forgot password request has been made on an non-existent email: ${email}`, `A forgot password request has been made on an non-existent email: ${email}`,
) )
} }
const authsome = authsomeHelper.getAuthsome(models)
const canRequest = await authsome.can(req.user, '', {
targetUser: user,
})
if (!canRequest) {
return res.status(403).json({ error: 'Unauthorized.' })
}
if (user.passwordResetTimestamp) {
const resetDate = new Date(user.passwordResetTimestamp)
const hoursPassed = Math.floor((new Date().getTime() - resetDate) / 3600000)
if (hoursPassed < 24) {
return res
.status(400)
.json({ error: 'A password reset has already been requested.' })
}
}
user.accessTokens.passwordReset = services.generateHash()
user.passwordResetTimestamp = Date.now()
await user.save()
notifications.sendForgotPasswordEmail({
user,
baseUrl: services.getBaseUrl(req),
})
res.status(200).json({ res.status(200).json({
message: `A password reset email has been sent to ${email}.`, message: `A password reset email has been sent to ${email}.`,
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment