Skip to content
Snippets Groups Projects
Commit d4fc0fa4 authored by Sebastian Mihalache's avatar Sebastian Mihalache :hammer_pick:
Browse files

feat(invite): add a scheduled reminder

parent b6793c89
No related branches found
No related tags found
3 merge requests!233S26 updates,!230S26 Updates,!214Hin 1170 automatic reminders
......@@ -9,6 +9,7 @@ const { staffEmail, name: journalName } = config.get('journal')
const { services, Fragment } = require('pubsweet-component-helper-service')
const { getEmailCopy } = require('./emailCopy')
const { scheduleReminderJob } = require('../jobs/reminders')
module.exports = {
async sendReviewInvitations({
......@@ -30,7 +31,7 @@ module.exports = {
submittingAuthor,
} = await fragmentHelper.getAuthorData({ UserModel })
let subjectBaseText = `${collection.customId}: Review invitation`
const subjectBaseText = `${collection.customId}: Review invitation`
const detailsPath = `/projects/${collection.id}/versions/${
fragment.id
......@@ -70,16 +71,9 @@ module.exports = {
submittingAuthor.lastName
}`
let daysExpected = 14
let emailType = 'reviewer-invitation'
let titleText = `A manuscript titled <strong>"${title}"</strong> by <strong>${authorName}</strong> et al.`
if (resend) {
emailType = 'reviewer-resend-invitation'
daysExpected = 0
subjectBaseText = `${subjectBaseText} reminder`
titleText = `the manuscript titled "${title}" by ${authorName}`
}
const daysExpected = 14
const emailType = 'reviewer-invitation'
const titleText = `A manuscript titled <strong>"${title}"</strong> by <strong>${authorName}</strong> et al.`
const { paragraph, ...bodyProps } = getEmailCopy({
emailType,
......@@ -114,6 +108,15 @@ module.exports = {
bodyProps,
})
scheduleReminderJob({
email,
title,
authorName,
subject: `${subjectBaseText} reminder`,
titleText: `the manuscript titled "${title}" by ${authorName}`,
expectedDate: services.getExpectedDate({ timestamp, daysExpected: 0 }),
})
return email.sendEmail()
},
}
const { jobs: { connectToJobQueue } } = require('pubsweet-server/src')
const { getEmailCopy } = require('../emails/emailCopy')
module.exports = {
scheduleReminderJob: async ({ email, subject, titleText, expectedDate }) => {
const jobQueue = await connectToJobQueue()
const queue = 'remind-after-4-days'
const { paragraph, ...bodyProps } = getEmailCopy({
emailType: 'reviewer-resend-invitation',
titleText,
expectedDate,
})
email.bodyProps = bodyProps
email.content.subject = subject
const minutes = 2
const currentDate = new Date()
const futureDate = new Date(currentDate.getTime() + minutes * 60000)
console.log('FUT DATE:', futureDate.toISOString())
// Add job to the queue
await jobQueue.publishAfter(queue, {}, {}, futureDate.toISOString())
// Subscribe to the job queue with an async handler
await jobQueue.subscribe(queue, async job => {
await email.sendEmail()
return `a ${subject} notification has been sent to ${email.toUser.email}`
})
await jobQueue.onComplete(queue, job => {
console.log('JOB RESPONSE', job.data.response)
})
},
}
......@@ -9,6 +9,7 @@ const {
} = require('pubsweet-component-helper-service')
const emailInvitations = require('./emails/invitations')
const reminders = require('./jobs/reminders')
const { last } = require('lodash')
......@@ -89,7 +90,6 @@ module.exports = models => async (req, res) => {
let invitation = invitationHelper.getInvitation({
invitations: fragment.invitations,
})
let resend = false
if (invitation) {
if (invitation.hasAnswer) {
......@@ -98,9 +98,9 @@ module.exports = models => async (req, res) => {
.json({ error: 'User has already replied to a previous invitation.' })
}
invitation.invitedOn = Date.now()
await fragment.save()
resend = true
// invitation.invitedOn = Date.now()
// await fragment.save()
// resend = true
} else {
const { firstName, lastName, affiliation, country } = req.body
if (
......@@ -116,6 +116,17 @@ module.exports = models => async (req, res) => {
invitation = await invitationHelper.createInvitation({
parentObject: fragment,
})
emailInvitations.sendReviewInvitations({
// resend,
baseUrl,
fragment,
collection,
invitation,
invitedUser: user,
UserModel: models.User,
timestamp: invitation.invitedOn,
})
}
const fragmentHelper = new Fragment({ fragment })
......@@ -127,17 +138,6 @@ module.exports = models => async (req, res) => {
collectionHelper.updateStatus({ newStatus: 'reviewersInvited' })
}
emailInvitations.sendReviewInvitations({
resend,
baseUrl,
fragment,
collection,
invitation,
invitedUser: user,
UserModel: models.User,
timestamp: invitation.invitedOn,
})
return res.status(200).json(invitation)
} catch (e) {
const userHelper = new User({ UserModel })
......
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