-
Sebastian Mihalache authored3e29633a
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
const {
Team,
User,
services,
Fragment,
Collection,
authsome: authsomeHelper,
} = require('pubsweet-component-helper-service')
module.exports = models => async (req, res) => {
const { collectionId, fragmentId } = req.params
let collection, fragment
try {
collection = await models.Collection.find(collectionId)
if (!collection.fragments.includes(fragmentId))
return res.status(400).json({
error: `Collection and fragment do not match.`,
})
const fragLength = collection.fragments.length
if (fragLength < 2) {
return res.status(400).json({
error: 'No previous version has been found.',
})
}
fragment = await models.Fragment.find(fragmentId)
const authsome = authsomeHelper.getAuthsome(models)
const target = {
fragment,
path: req.route.path,
}
const canPatch = await authsome.can(req.user, 'PATCH', target)
if (!canPatch)
return res.status(403).json({
error: 'Unauthorized.',
})
const collectionHelper = new Collection({ collection })
const fragmentHelper = new Fragment({ fragment })
const teamHelper = new Team({
TeamModel: models.Team,
collectionId,
fragmentId,
})
fragment.authors = fragment.authors || []
teamHelper.createOrUpdateTeamForNewVersion({
role: 'author',
iterable: fragment.authors,
})
const authorsTeam = await teamHelper.getTeam({
role: 'author',
objectType: 'fragment',
})
const userHelper = new User({ UserModel: models.User })
if (authorsTeam) {
fragment.authors.forEach(author => {
userHelper.updateUserTeams({
userId: author.id,
teamId: authorsTeam.id,
})
})
}
fragment.invitations = fragment.invitations || []
teamHelper.createOrUpdateTeamForNewVersion({
role: 'reviewer',
iterable: fragment.invitations,
})
const reviewersTeam = await teamHelper.getTeam({
role: 'reviewer',
objectType: 'fragment',
})
if (reviewersTeam) {
fragment.invitations.forEach(inv => {
userHelper.updateUserTeams({
userId: inv.userId,
teamId: reviewersTeam.id,
})
})
}
fragment.save()
const previousFragment = await models.Fragment.find(
collection.fragments[fragLength - 2],
)
fragmentHelper.fragment = previousFragment
const heRecommendation = fragmentHelper.getHeRequestToRevision()
if (!heRecommendation) {
return res.status(400).json({
error: 'No Handling Editor recommendation has been found.',
})
}
collectionHelper.updateStatusByRecommendation({
recommendation: heRecommendation.recommendation,
})
return res.status(200).json(fragment)
} catch (e) {
const notFoundError = await services.handleNotFoundError(e, 'Item')
return res.status(notFoundError.status).json({
error: notFoundError.message,
})
}
}