Skip to content
Snippets Groups Projects
Collection.js 2.74 KiB
Newer Older
class Collection {
  constructor({ collection = {} }) {
    this.collection = collection
  }

  async updateStatusByRecommendation({
    recommendation,
    isHandlingEditor = false,
  }) {
    let newStatus
    if (isHandlingEditor) {
      newStatus = 'pendingApproval'
      if (['minor', 'major'].includes(recommendation)) {
        newStatus = 'revisionRequested'
      }
    } else {
      if (recommendation === 'minor') {
        newStatus = 'reviewCompleted'
      }
        newStatus = 'underReview'
  }

  async updateFinalStatusByRecommendation({ recommendation }) {
    let newStatus
    switch (recommendation) {
      case 'reject':
        newStatus = 'rejected'
        break
      case 'publish':
        break
      case 'return-to-handling-editor':
        newStatus = 'reviewCompleted'
        break
      default:
        break
    }

    await this.updateStatus({ newStatus })
  }

  async updateStatus({ newStatus }) {
    this.collection.status = newStatus
    await this.collection.save()
  }

  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({ invitations }) {
    const reviewerInvitations = invitations.filter(
      inv => inv.role === 'reviewer',
    )
    if (reviewerInvitations.length === 0)
      await this.updateStatus({ newStatus: 'heAssigned' })
  }

  async updateStatusOnRecommendation({ isEditorInChief, recommendation }) {
    if (isEditorInChief) {
      if (recommendation === 'return-to-handling-editor') {
        this.updateStatus({ newStatus: 'reviewCompleted' })
      } else {
        this.updateFinalStatusByRecommendation({
          recommendation,
        })
      }
    } else {
      this.updateStatusByRecommendation({
        recommendation,
        isHandlingEditor: true,
      })
    }
  }
    const [firstName, lastName] = this.collection.handlingEditor.name.split(' ')
    return lastName || firstName