From 80ee6b0f9ab894f7351a1f4c3fd99155a497cce3 Mon Sep 17 00:00:00 2001 From: Sebastian Mihalache <sebastian.mihalache@gmail.con> Date: Tue, 3 Jul 2018 15:01:41 +0300 Subject: [PATCH] fix email bugs and reviewers copy --- .../src/services/Email.js | 8 +- .../src/services/Team.js | 41 ++------- .../src/routes/fragments/patch.js | 91 ++++++++++--------- .../component-wizard/src/redux/conversion.js | 9 +- 4 files changed, 71 insertions(+), 78 deletions(-) diff --git a/packages/component-helper-service/src/services/Email.js b/packages/component-helper-service/src/services/Email.js index 64e5bfe6f..e3ea6688a 100644 --- a/packages/component-helper-service/src/services/Email.js +++ b/packages/component-helper-service/src/services/Email.js @@ -31,14 +31,16 @@ class Email { isSubmitted = false, isRevision = false, recommendation = {}, + newFragmentId = '', }) { const { baseUrl, UserModel, collection, - parsedFragment: { recommendations, title, type, id }, + parsedFragment: { recommendations, title, type }, authors: { submittingAuthor: { firstName = '', lastName = '' } }, } = this + let { parsedFragment: { id } } = this const fragment = await FragmentModel.find(id) const fragmentHelper = new Fragment({ fragment }) const reviewerInvitations = fragmentHelper.getReviewerInvitations({ @@ -85,6 +87,7 @@ class Email { emailType = 'submitting-reviewers-after-revision' subject = `${collection.customId}: Manuscript Update` editorName = collection.handlingEditor.name + id = newFragmentId || id } } else { subject = `${collection.customId}: Reviewer Unassigned` @@ -108,6 +111,7 @@ class Email { fragment: { title, authorName: `${firstName} ${lastName}`, + id, }, }, }), @@ -397,7 +401,7 @@ class Email { const eic = await userHelper.getEditorInChief() mailService.sendNotificationEmail({ - toEmail: eic.email, + toEmail: collection.handlingEditor.email, emailType: 'new-version-submitted', meta: { baseUrl, diff --git a/packages/component-helper-service/src/services/Team.js b/packages/component-helper-service/src/services/Team.js index 3b208c4b6..2e27f9a14 100644 --- a/packages/component-helper-service/src/services/Team.js +++ b/packages/component-helper-service/src/services/Team.js @@ -8,7 +8,7 @@ class Team { this.collectionId = collectionId } - async createTeam({ role, userId, objectType }) { + async createTeam({ role = '', members = [], objectType = '' }) { const { fragmentId, TeamModel, collectionId } = this const objectId = objectType === 'collection' ? collectionId : fragmentId @@ -44,7 +44,7 @@ class Team { type: objectType, id: objectId, }, - members: [userId], + members, } let team = new TeamModel(teamBody) team = await team.save() @@ -79,7 +79,11 @@ class Team { logger.error(e) } } else { - const team = await this.createTeam({ role, userId: user.id, objectType }) + const team = await this.createTeam({ + role, + members: [user.id], + objectType, + }) user.teams.push(team.id) await user.save() return team @@ -136,37 +140,6 @@ class Team { await user.save() await collection.save() } - - async createOrUpdateTeamForNewVersion({ role, iterable }) { - const userIds = await Promise.all( - iterable.map(async obj => { - let { userId } = obj - if (role === 'author') { - userId = obj.id - } - return userId - }), - ) - - await Promise.all( - userIds.map(async id => { - const team = await this.getTeam({ - role, - objectType: 'fragment', - }) - if (team) { - team.members.push(id) - await team.save() - } else { - await this.createTeam({ - role, - userId: id, - objectType: 'fragment', - }) - } - }), - ) - } } module.exports = Team diff --git a/packages/component-manuscript-manager/src/routes/fragments/patch.js b/packages/component-manuscript-manager/src/routes/fragments/patch.js index 155a5bdae..d32334dcf 100644 --- a/packages/component-manuscript-manager/src/routes/fragments/patch.js +++ b/packages/component-manuscript-manager/src/routes/fragments/patch.js @@ -7,6 +7,7 @@ const { Collection, authsome: authsomeHelper, } = require('pubsweet-component-helper-service') +const union = require('lodash/union') module.exports = models => async (req, res) => { const { collectionId, fragmentId } = req.params @@ -44,48 +45,54 @@ module.exports = models => async (req, res) => { collectionId, fragmentId, }) + const userHelper = new User({ UserModel: models.User }) - fragment.authors = fragment.authors || [] - await teamHelper.createOrUpdateTeamForNewVersion({ - role: 'author', - iterable: fragment.authors, + const reviewerIds = fragment.invitations.map(inv => { + const { userId } = inv + return userId }) - const authorsTeam = await teamHelper.getTeam({ - role: 'author', + const reviewersTeam = await teamHelper.createTeam({ + role: 'reviewer', + members: reviewerIds, objectType: 'fragment', }) - const userHelper = new User({ UserModel: models.User }) - if (authorsTeam) { - fragment.authors.forEach(async author => { - await userHelper.updateUserTeams({ - userId: author.id, - teamId: authorsTeam.id, - }) - }) - } + reviewerIds.forEach(id => + userHelper.updateUserTeams({ + userId: id, + teamId: reviewersTeam.id, + }), + ) - fragment.invitations = fragment.invitations || [] - await teamHelper.createOrUpdateTeamForNewVersion({ - role: 'reviewer', - iterable: fragment.invitations, + const authorIds = fragment.authors.map(auth => { + const { id } = auth + return id }) - const reviewersTeam = await teamHelper.getTeam({ - role: 'reviewer', + let authorsTeam = await teamHelper.getTeam({ + role: 'author', objectType: 'fragment', }) - if (reviewersTeam) { - fragment.invitations.forEach(async inv => { - await userHelper.updateUserTeams({ - userId: inv.userId, - teamId: reviewersTeam.id, - }) + if (!authorsTeam) { + authorsTeam = await teamHelper.createTeam({ + role: 'author', + members: authorIds, + objectType: 'fragment', }) + } else { + authorsTeam.members = union(authorsTeam.members, authorIds) + await authorsTeam.save() } + authorIds.forEach(id => + userHelper.updateUserTeams({ + userId: id, + teamId: reviewersTeam.id, + }), + ) + const previousFragment = await models.Fragment.find( collection.fragments[fragLength - 2], ) @@ -105,26 +112,28 @@ module.exports = models => async (req, res) => { fragment.submitted = Date.now() fragment = await fragment.save() + const parsedFragment = await fragmentHelper.getFragmentData({ + handlingEditor: collection.handlingEditor, + }) + const authors = await fragmentHelper.getAuthorData({ + UserModel: models.User, + }) + const email = new Email({ + authors, + collection, + parsedFragment, + UserModel: models.User, + baseUrl: services.getBaseUrl(req), + }) + email.setupNewVersionSubmittedEmail() + if (heRecommendation.recommendation === 'major') { - const parsedFragment = await fragmentHelper.getFragmentData({ - handlingEditor: collection.handlingEditor, - }) - const authors = await fragmentHelper.getAuthorData({ - UserModel: models.User, - }) - const email = new Email({ - authors, - collection, - parsedFragment, - UserModel: models.User, - baseUrl: services.getBaseUrl(req), - }) - email.setupNewVersionSubmittedEmail() email.setupReviewersEmail({ agree: true, isRevision: true, isSubmitted: true, FragmentModel: models.Fragment, + newFragmentId: fragment.id, }) } diff --git a/packages/component-wizard/src/redux/conversion.js b/packages/component-wizard/src/redux/conversion.js index a7d861b8e..b88ae87c8 100644 --- a/packages/component-wizard/src/redux/conversion.js +++ b/packages/component-wizard/src/redux/conversion.js @@ -84,10 +84,17 @@ export const createRevision = ( history, ) => dispatch => { // copy invitations only if minor revision - const { id, submitted, recommendations, ...prev } = previousVersion + const { + id, + submitted, + recommendations, + invitations, + ...prev + } = previousVersion return dispatch( actions.createFragment(collection, { ...prev, + invitations: invitations.filter(inv => inv.isAccepted), created: new Date(), version: previousVersion.version + 1, }), -- GitLab