Skip to content
Snippets Groups Projects
Collection.js 2.96 KiB
Newer Older
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