Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
const config = require('config')
const statuses = config.get('statuses')
class Collection {
constructor({ collection = {} }) {
this.collection = collection
}
async updateStatusByRecommendation({ recommendation }) {
let newStatus = 'pendingApproval'
if (['minor', 'major'].includes(recommendation))
newStatus = 'revisionRequested'
await this.updateStatus({ newStatus })
}
async updateFinalStatusByRecommendation({ recommendation }) {
let newStatus
switch (recommendation) {
case 'reject':
newStatus = 'rejected'
break
case 'publish':
newStatus = 'published'
break
case 'return-to-handling-editor':
newStatus = 'reviewCompleted'
break
default:
break
}
await this.updateStatus({ newStatus })
}
async updateStatus({ newStatus }) {
this.collection.status = newStatus
this.collection.visibleStatus = statuses[this.collection.status].private
await this.collection.save()
}
async getAuthorData({ UserModel }) {
const { collection: { authors } } = this
const submittingAuthorData = authors.find(
author => author.isSubmitting === true,
)
const submittingAuthor = await UserModel.find(submittingAuthorData.userId)
const authorsPromises = authors.map(async author => {
const user = await UserModel.find(author.userId)
return `${user.firstName} ${user.lastName}`
})
const authorsList = await Promise.all(authorsPromises)
return {
authorsList,
submittingAuthor,
}
}
getReviewerInvitations({ agree = true }) {
const { collection: { invitations } } = this
return agree
? invitations.filter(
inv =>
inv.role === 'reviewer' &&
inv.hasAnswer === true &&
inv.isAccepted === true,
)
: invitations.filter(
inv => inv.role === 'reviewer' && inv.hasAnswer === false,
)
}
async addHandlingEditor({ user, invitation }) {
this.collection.handlingEditor = {
id: user.id,
name: `${user.firstName} ${user.lastName}`,
invitedOn: invitation.invitedOn,
respondedOn: invitation.respondedOn,
email: user.email,
hasAnswer: invitation.hasAnswer,
isAccepted: invitation.isAccepted,
}
await this.updateStatus({ newStatus: 'heInvited' })
}
async updateHandlingEditor({ isAccepted }) {
const { collection: { handlingEditor } } = this
handlingEditor.hasAnswer = true
handlingEditor.isAccepted = isAccepted
handlingEditor.respondedOn = Date.now()
let status
isAccepted ? (status = 'heAssigned') : (status = 'submitted')
await this.updateStatus({ newStatus: status })
}
async updateStatusByNumberOfReviewers() {
const reviewerInvitations = this.collection.invitations.filter(
inv => inv.role === 'reviewer',
)
if (reviewerInvitations.length === 0)
await this.updateStatus({ newStatus: 'heAssigned' })
}
}
module.exports = Collection