Skip to content
Snippets Groups Projects
Commit 10bb7edb authored by Bogdan Cochior's avatar Bogdan Cochior
Browse files

Merge branch 'develop' of https://gitlab.coko.foundation/xpub/xpub-faraday into develop

parents 049ca767 a180d4b2
No related branches found
No related tags found
1 merge request!13Sprint #14
......@@ -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,
......
......@@ -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
......@@ -172,6 +172,7 @@ module.exports = {
const declineUrl = helpers.createUrl(baseUrl, resetPasswordPath, {
...queryParams,
agree: false,
fragmentId: meta.fragment.id,
collectionId: meta.collection.id,
invitationToken: user.invitationToken,
})
......
......@@ -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,
})
}
......
......@@ -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,
}),
......
......@@ -39,10 +39,14 @@ export default compose(
invitationToken,
reviewerDecline,
replace,
fragmentId,
} = this.props
reviewerDecline(invitationId, collectionId, invitationToken).catch(
redirectToError(replace),
)
reviewerDecline(
invitationId,
collectionId,
fragmentId,
invitationToken,
).catch(redirectToError(replace))
},
}),
)(ReviewerDecline)
......
......@@ -194,11 +194,12 @@ export const reviewerDecision = (
export const reviewerDecline = (
invitationId,
collectionId,
fragmentId,
invitationToken,
) => dispatch => {
dispatch(reviewerDecisionRequest())
return update(
`/collections/${collectionId}/invitations/${invitationId}/decline`,
`/collections/${collectionId}/fragments/${fragmentId}/invitations/${invitationId}/decline`,
{
invitationToken,
},
......
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