Newer
Older
Sebastian Mihalache
committed
const config = require('config')
const { get, forOwn } = require('lodash')
const Email = require('@pubsweet/component-email-templating')
Sebastian Mihalache
committed
const unsubscribeSlug = config.get('unsubscribe.url')
const inviteReviewerPath = config.get('invite-reviewer.url')
const { staffEmail, name: journalName } = config.get('journal')
Sebastian Mihalache
committed
const { services, Fragment } = require('pubsweet-component-helper-service')
Sebastian Mihalache
committed
const { getEmailCopy } = require('./emailCopy')
const { scheduleReminderJob } = require('../jobs/reminders')

Sebastian Mihalache
committed
const { scheduleRemovalJob } = require('../jobs/removal')
const daysList = config.get('reminders.reviewer.days')
const timeUnit = config.get('reminders.reviewer.timeUnit')
const removalDays = config.get('reminders.reviewer.remove')
const daysExpected = config.get('daysExpectedForReview')
Sebastian Mihalache
committed
module.exports = {
async sendReviewInvitations({
Sebastian Mihalache
committed
baseUrl,
fragment,
UserModel,
collection,
invitation,
invitedUser,
}) {
const fragmentHelper = new Fragment({ fragment })
const { title, abstract } = await fragmentHelper.getFragmentData({
handlingEditor: collection.handlingEditor,
})
const {
activeAuthors: authors,
submittingAuthor,
} = await fragmentHelper.getAuthorData({ UserModel })
Sebastian Mihalache
committed
const subjectBaseText = `${collection.customId}: Review invitation`
Sebastian Mihalache
committed
const detailsPath = `/projects/${collection.id}/versions/${
fragment.id
}/details`
const declineLink = services.createUrl(baseUrl, inviteReviewerPath, {
invitationId: invitation.id,
Sebastian Mihalache
committed
agree: false,
fragmentId: fragment.id,
collectionId: collection.id,
invitationToken: invitedUser.accessTokens.invitation,
Sebastian Mihalache
committed
})
let agreeLink = services.createUrl(baseUrl, detailsPath, {
invitationId: invitation.id,
agree: true,
})
Sebastian Mihalache
committed
if (!invitedUser.isConfirmed) {
agreeLink = services.createUrl(baseUrl, inviteReviewerPath, {
invitationId: invitation.id,
Sebastian Mihalache
committed
email: invitedUser.email,
collectionId: collection.id,
token: invitedUser.accessTokens.passwordReset,
})
Sebastian Mihalache
committed
}
const authorsList = authors.map(
author => `${author.firstName} ${author.lastName}`,
)
const handlingEditor = get(collection, 'handlingEditor', {})
const authorName = `${submittingAuthor.firstName} ${
submittingAuthor.lastName
}`
const emailType = 'reviewer-invitation'
const titleText = `A manuscript titled <strong>"${title}"</strong> by <strong>${authorName}</strong> et al.`
const { paragraph, ...bodyProps } = getEmailCopy({
emailType,
titleText,
expectedDate: services.getExpectedDate({
timestamp: invitation.invitedOn,
daysExpected,
}),
})
Sebastian Mihalache
committed
const email = new Email({
type: 'user',
templateType: 'invitation',
fromEmail: `${handlingEditor.name} <${staffEmail}>`,
Sebastian Mihalache
committed
toUser: {
email: invitedUser.email,
name: invitedUser.lastName,
Sebastian Mihalache
committed
},
content: {
Sebastian Mihalache
committed
abstract,
agreeLink,
declineLink,
signatureJournal: journalName,
signatureName: handlingEditor.name,
authorsList: authorsList.join(', '),
subject: subjectBaseText,
paragraph,
Sebastian Mihalache
committed
detailsLink: services.createUrl(baseUrl, detailsPath),
unsubscribeLink: services.createUrl(baseUrl, unsubscribeSlug, {
id: invitedUser.id,
token: invitedUser.accessTokens.unsubscribe,
Sebastian Mihalache
committed
}),
},
bodyProps,
Sebastian Mihalache
committed
})
await email.sendEmail()
forOwn(daysList, (days, order) =>
scheduleReminderJob({
email,
timeUnit,

Sebastian Mihalache
committed
userId: invitedUser.id,
invitationId: invitation.id,
subject: `${subjectBaseText} reminder`,
titleText: `the manuscript titled "${title}" by ${authorName}`,
expectedDate: services.getExpectedDate({
timestamp: invitation.invitedOn,
daysExpected: 0,
}),
}),
)
scheduleRemovalJob({
timeUnit,
invitation,
days: removalDays,
userId: invitedUser.id,
fragmentId: fragment.id,
collectionId: collection.id,
})