Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
Mail.js 17.67 KiB
const Email = require('@pubsweet/component-send-email')
const config = require('config')
const helpers = require('./helpers/helpers')

const resetPasswordPath = config.get('invite-reviewer.url')
const resetPath = config.get('invite-reset-password.url')

module.exports = {
  sendSimpleEmail: async ({
    toEmail,
    user,
    emailType,
    dashboardUrl,
    meta = {},
  }) => {
    let subject, textBody
    let emailTemplate = 'simpleCTA'
    const replacements = {}
    switch (emailType) {
      case 'assign-handling-editor':
        subject = 'Hindawi Handling Editor Invitation'
        replacements.headline =
          'You have been assigned as a Handling Editor to a manuscript.'
        replacements.paragraph =
          'Please click on the link below to access your dashboard.'
        replacements.previewText = 'An Editor in Chief has assigned you'
        replacements.buttonText = 'VIEW DASHBOARD'
        replacements.url = dashboardUrl
        textBody = `${replacements.headline} ${replacements.paragraph} ${
          replacements.url
        } ${replacements.buttonText}`
        break
      case 'add-author':
        subject = 'Manuscript Assignment on Hindawi'
        replacements.headline =
          'You have been assigned as an Author to a manuscript.'
        replacements.paragraph =
          "The manuscript will become visible on your dashboard once it's submitted. Please click on the link below to access your dashboard."
        replacements.previewText = 'You are now an author'
        replacements.buttonText = 'VIEW DASHBOARD'
        replacements.url = dashboardUrl
        textBody = `${replacements.headline} ${replacements.paragraph} ${
          replacements.url
        } ${replacements.buttonText}`
        break
      case 'invite-author':
        subject = 'Hindawi Invitation'
        replacements.headline =
          'You have been invited as an Author to a manuscript.'
        replacements.paragraph =
          "The manuscript will be visible on your dashboard once it's submitted. Please confirm your account and set your account details by clicking on the link below."
        replacements.previewText = 'You have been invited'
        replacements.buttonText = 'CONFIRM'
        replacements.url = helpers.createUrl(dashboardUrl, resetPath, {
          email: user.email,
          token: user.passwordResetToken,
          firstName: user.firstName,
          lastName: user.lastName,
          affiliation: user.affiliation,
          title: user.title,
        })
        textBody = `${replacements.headline} ${replacements.paragraph} ${
          replacements.url
        } ${replacements.buttonText}`
        break
      case 'invite':
        subject = 'Hindawi Invitation'
        replacements.headline = 'You have been invited to join Hindawi.'
        replacements.paragraph =
          'You can now join Hindawi. Please confirm your account and set your account details by clicking on the link below.'
        replacements.previewText = 'You have been invited'
        replacements.buttonText = 'CONFIRM'
        replacements.url = helpers.createUrl(dashboardUrl, resetPath, {
          email: user.email,
          token: user.passwordResetToken,
          firstName: user.firstName,
          lastName: user.lastName,
          affiliation: user.affiliation,
          title: user.title,
        })
        textBody = `${replacements.headline} ${replacements.paragraph} ${
          replacements.url
        } ${replacements.buttonText}`
        break
      case 'handling-editor-agreed':
        subject = 'Handling Editor Agreed'
        replacements.headline = `${user.firstName} ${
          user.lastName
        } agreed to be a Handling Editor on manuscript ${meta.collectionId}.`
        replacements.paragraph =
          'Please click on the link below to access your dashboard.'
        replacements.previewText = 'a user has is now handling editor'
        replacements.buttonText = 'VIEW DASHBOARD'
        replacements.url = dashboardUrl
        textBody = `${replacements.headline} ${replacements.paragraph} ${
          replacements.url
        } ${replacements.buttonText}`
        break
      case 'handling-editor-declined':
        subject = 'Handling Editor Declined'
        replacements.headline = `${user.firstName} ${
          user.lastName
        } has declined to be a Handling Editor on manuscript ${
          meta.collectionId
        }.`
        replacements.paragraph = meta.reason ? `Reason: "${meta.reason}"` : ''
        replacements.previewText = 'a user has declined your invitation'
        textBody = `${replacements.headline} ${replacements.paragraph}`
        emailTemplate = 'noCTA'
        break
      case 'revoke-handling-editor':
        subject = 'Invitation Has Been Cancelled'
        replacements.headline =
          'Your Handling Editor invitation to a manuscript has been revoked.'
        replacements.paragraph = ''
        replacements.previewText = 'you are no longer invited'
        textBody = `${replacements.headline}`
        emailTemplate = 'noCTA'
        break
      default:
        subject = 'Welcome to Hindawi!'
        break
    }

    const htmlBody = helpers.getEmailBody(emailTemplate, replacements)
    const mailData = {
      from: config.get('mailer.from'),
      to: toEmail,
      subject,
      text: textBody,
      html: htmlBody,
    }

    return Email.send(mailData)
  },
  sendReviewerInvitationEmail: async ({
    user,
    baseUrl,
    toEmail,
    subject,
    emailType,
    meta = {},
  }) => {
    let queryParams = {
      invitationId: meta.invitation.id,
      agree: true,
    }

    const declineUrl = helpers.createUrl(baseUrl, resetPasswordPath, {
      ...queryParams,
      agree: false,
      collectionId: meta.collection.id,
      invitationToken: user.invitationToken,
    })

    let agreeUrl = helpers.createUrl(
      baseUrl,
      `/projects/${meta.collection.id}/versions/${meta.fragment.id}/details`,
      queryParams,
    )

    if (!user.isConfirmed) {
      queryParams = {
        ...queryParams,
        email: user.email,
        token: user.passwordResetToken,
        collectionId: meta.collection.id,
        fragmentId: meta.fragment.id,
        agree: true,
      }
      agreeUrl = helpers.createUrl(baseUrl, resetPasswordPath, queryParams)
    }
    const replacements = {
      agreeUrl,
      declineUrl,
      baseUrl,
      title: meta.fragment.title,
      authors: meta.fragment.authors,
      abstract: meta.fragment.abstract,
      previewText: 'invitation from Hindawi',
      intro: `Dear ${user.firstName} ${user.lastName}`,
      manuscriptText: '',
    }
    let textBody
    switch (emailType) {
      case 'invite-reviewer':
        replacements.upperContent = `A manuscript titled "${
          meta.fragment.title
        }" by ${meta.collection.authorName}, has been submitted
        for possible publication in Hindawi. As the Academic Editor handling the manuscript,
        I would be delighted if you would agree to review it and let me know whether you
        feel it is suitable for publication.`

        replacements.manuscriptText =
          "The manuscript's abstract, and author information is below to help you decide. Once you have agreed to review, you will be able to download the full article PDF."

        replacements.lowerContent = `If a potential conflict of interest exists between yourself and either the authors or
          the subject of the manuscript, please decline to handle the manuscript. If a conflict
          becomes apparent during the review process, please let me know at the earliest possible
          opportunity. For more information about our conflicts of interest policies, please
          see:
          <a href="https://www.hindawi.com/ethics/#coi">https://www.hindawi.com/ethics/#coi</a>.
          If you are able to review the manuscript, I would be grateful if you could submit your
          report by ${helpers.getExpectedDate(meta.invitation.timestamp, 14)}.`

        replacements.signatureName = meta.collection.handlingEditor.name
        replacements.signatureEmail = meta.collection.handlingEditor.email
        textBody = `${replacements.intro} ${replacements.upperContent} ${
          replacements.agreeUrl
        } ${replacements.declineUrl} ${replacements.manuscriptText} ${
          replacements.lowerContent
        } ${replacements.signature}`
        break
      case 'resend-reviewer':
        replacements.upperContent = `On ${helpers.getExpectedDate(
          meta.invitation.timestamp,
          0,
        )} I sent you a request to review the manuscript titled "${
          meta.fragment.title
        }" by ${
          meta.collection.authorName
        }, submitted for possible publication in Hindawi.
          I would be grateful if you would agree to review it and let me know whether you feel
          it is suitable for publication. If you are unable to review this manuscript then
          please decline to review. More details are available by clicking the link.`

        replacements.lowerContent =
          'I would like to thank you in advance for your help with the evaluation of this manuscript, since it would not be possible for us to run the journal without the help of our reviewers. I am looking forward to hearing from you.'

        replacements.signatureName = meta.collection.handlingEditor.name
        replacements.signatureEmail = meta.collection.handlingEditor.email
        textBody = `${replacements.intro} ${replacements.upperContent} ${
          replacements.agreeUrl
        } ${replacements.declineUrl} ${replacements.lowerContent} ${
          replacements.signatureName
        } ${replacements.signatureEmail}`
        break
      default:
        break
    }

    const htmlBody = helpers.getInvitationBody('invitation', replacements)
    const mailData = {
      from: config.get('mailer.from'),
      to: toEmail,
      subject,
      text: textBody,
      html: htmlBody,
    }
    return Email.send(mailData)
  },
  sendNotificationEmail: async ({
    toEmail,
    user,
    emailType,
    meta = { privateNote: '' },
  }) => {
    let subject, textBody
    const privateNoteText =
      meta.privateNote !== undefined
        ? `Private note: "${meta.privateNote}"`
        : ''
    const emailTemplate = 'notification'
    const replacements = {
      detailsUrl: helpers.createUrl(
        meta.baseUrl,
        `/projects/${meta.collection.id}/versions/${meta.fragment.id}/details`,
      ),
      beforeAnchor: '',
      afterAnchor: '',
      hasLink: true,
    }
    switch (emailType) {
      case 'unassign-reviewer':
        subject = `${meta.collection.customId}: Review Unassigned`
        replacements.previewText = 'notification from Hindawi'
        replacements.intro = `Dear ${user.firstName} ${user.lastName}`

        replacements.paragraph = `You are no longer needed to review the article titled "${
          meta.fragment.title
        }" by ${
          meta.fragment.authorName
        }. If you have comments on this manuscript you believe the Editor should
          see, please email them to ${config.get(
            'mailer.from',
          )} as soon as possible. Thank you for your
          time and I hope you will consider reviewing for Hindawi again.`
        replacements.beforeAnchor = 'Please visit the'
        replacements.afterAnchor = 'to see the full review'
        replacements.signatureName = meta.handlingEditorName
        textBody = `${replacements.intro} ${replacements.paragraph} ${
          replacements.beforeAnchor
        } ${replacements.detailsUrl} ${replacements.afterAnchor} ${
          replacements.signatureName
        }`
        break
      case 'review-submitted':
        subject = `${meta.collection.customId}: Manuscript Review`
        replacements.previewText = 'a new review has been submitted'
        replacements.intro = `Dear ${meta.handlingEditorName}`

        replacements.paragraph = `We are pleased to inform you that Dr. ${
          user.firstName
        } ${user.lastName} has submitted a review for the manuscript titled "${
          meta.fragment.title
        }" by ${meta.fragment.authorName}.`
        replacements.beforeAnchor = 'Please visit the'
        replacements.afterAnchor = 'to see the full review'

        replacements.signatureName = meta.eicName
        textBody = `${replacements.intro} ${replacements.paragraph} ${
          replacements.beforeAnchor
        } ${replacements.detailsUrl} ${replacements.afterAnchor} ${
          replacements.signatureName
        }`
        break
      case 'reviewer-agreed':
        subject = `${meta.collection.customId}: Manuscript Reviews`
        replacements.previewText = 'a user has agreed to review'
        replacements.intro = `Dear ${meta.handlingEditorName}`

        replacements.paragraph = `We are pleased to inform you that Dr. ${
          user.firstName
        } ${user.lastName} has agreed to review the manuscript titled "${
          meta.fragment.title
        }" by ${
          meta.fragment.authorName
        }. You should receive the report by Dr. ${user.firstName} ${
          user.lastName
        } before ${helpers.getExpectedDate(meta.timestamp, 14)}.`
        replacements.beforeAnchor =
          'If you have any queries, or would like to send a reminder if you no report has been submitted, then please visit the'
        replacements.afterAnchor = 'to see the full review'

        replacements.signatureName = meta.eicName
        textBody = `${replacements.intro} ${replacements.paragraph} ${
          replacements.beforeAnchor
        } ${replacements.detailsUrl} ${replacements.afterAnchor} ${
          replacements.signatureName
        }`
        break
      case 'reviewer-declined':
        subject = `${meta.collection.customId}: Manuscript Reviews`
        replacements.previewText = 'a user has declined to review'
        replacements.intro = `Dear ${meta.handlingEditorName}`
        replacements.paragraph = `We regret to inform you that Dr. ${
          user.firstName
        } ${user.lastName} has declined to review the manuscript titled "${
          meta.fragment.title
        }" by ${meta.fragment.authorName}.`
        replacements.beforeAnchor = 'Please visit the'
        replacements.afterAnchor =
          'to see if you need to invite any additional reviewers in order to reach a decision on the manuscript'
        replacements.signatureName = meta.eicName
        textBody = `${replacements.intro} ${replacements.paragraph} ${
          replacements.beforeAnchor
        } ${replacements.detailsUrl} ${replacements.afterAnchor} ${
          replacements.signatureName
        }`
        break
      case 'reviewer-thank-you':
        subject = `${meta.collection.customId}: Manuscript Review`
        replacements.previewText = 'Hindawi says thank you'
        replacements.intro = `Dear Dr. ${user.firstName} ${user.lastName}`

        replacements.paragraph = `Thank you for agreeing to review the manuscript titled "${
          meta.fragment.title
        }" by ${meta.fragment.authorName}.`
        replacements.beforeAnchor =
          'You can view the full PDF file of the manuscript and post your review report using the following URL:'
        replacements.signatureName = meta.handlingEditorName
        textBody = `${replacements.intro} ${replacements.paragraph} ${
          replacements.beforeAnchor
        } ${replacements.detailsUrl} ${replacements.afterAnchor} ${
          replacements.signatureName
        }`
        break
      case 'after-he-recommendation':
        subject = `${
          meta.collection.customId
        }: Manuscript Recommendation Submitted`
        replacements.hasLink = false
        replacements.previewText =
          'a manuscript has received a recommendation based on reviews'
        replacements.intro = `Dear Dr. ${user.firstName} ${user.lastName}`

        replacements.paragraph = `I appreciate any time you may have spent reviewing manuscript "${
          meta.fragment.title
        }" by ${
          meta.fragment.authorName
        }. However, an editorial decision has been made and the review of this manuscript is now complete. I apologize for any inconvenience. <br/>
        If you have comments on this manuscript you believe the Editor should see, please email them to Hindawi as soon as possible. <br/>
        Thank you for your interest and I hope you will consider reviewing for Hindawi again.`
        delete replacements.detailsUrl
        replacements.signatureName = meta.handlingEditorName
        textBody = `${replacements.intro} ${replacements.paragraph} ${
          replacements.signatureName
        }`
        break
      case 'eic-recommendation':
        subject = `${meta.collection.customId}: Manuscript Recommendation`
        replacements.previewText =
          'a handling editor has submitted a recommendation'
        replacements.intro = `Dear Dr. ${meta.eicName}`
        replacements.paragraph = `It is my recommendation, based on the reviews I have received for the manuscript titled "${
          meta.fragment.title
        }" by ${meta.fragment.authorName}, that ${
          meta.heRecommendation
        }. <br/><br/>
        ${privateNoteText}<br/><br/>`

        replacements.beforeAnchor =
          'For more information, and to see the full review, please visit the '
        replacements.signatureName = meta.handlingEditorName
        textBody = `${replacements.intro} ${replacements.paragraph} ${
          replacements.beforeAnchor
        } ${replacements.detailsUrl} ${replacements.afterAnchor} ${
          replacements.signatureName
        }`
        break
      default:
        subject = 'Hindawi Notification!'
        break
    }
    const htmlBody = helpers.getNotificationBody(emailTemplate, replacements)
    const mailData = {
      from: config.get('mailer.from'),
      to: toEmail,
      subject,
      text: textBody,
      html: htmlBody,
    }
    return Email.send(mailData)
  },
}