def updateStatus()

in api/src/main/scala/com/gu/core/store/store.scala [130:170]


  def updateStatus(id: String, status: Status): Either[Error, UpdatedAvatar] = {
    def demoteActive(user: User): Either[Error, Unit] = {
      def recoverNotFound(e: Error): Either[Error, Unit] = e match {
        case AvatarNotFound(_, _) => Right(())
        case err => Left(err)
      }

      getActive(user)
        .flatMap(active => updateKv(active.body.id, active.body.status, isActive = false))
        .fold(recoverNotFound, _ => Right(()))
    }

    def handleApproved(user: User, avatar: Avatar) = {
      for {
        _ <- demoteActive(user)
        updated <- updateKv(avatar.id, Approved, isActive = true)
        _ <- copyToPublic(updated)
        _ <- cleanupInactive(user)
      } yield updated
    }

    def handleRejected(user: User, avatar: Avatar) = {
      for {
        updated <- updateKv(avatar.id, Rejected, isActive = false)
        _ <- Right(if (avatar.isActive) deletePublicAvatarFile(updated.userId).map(_ => ()) else ())
      } yield updated
    }

    val result = for {
      avatar <- get(id).map(_.body)
      user = User(avatar.userId)
      updated <- status match {
        case noChange if avatar.status == status => Right(avatar)
        case Approved => handleApproved(user, avatar)
        case Rejected => handleRejected(user, avatar)
        case otherStatus => updateKv(id, otherStatus, isActive = false)
      }
    } yield updated

    logIfError(s"Unable to update status for Avatar ID: $id. Avatar may be left in an inconsistent state.", result.map(UpdatedAvatar.apply))
  }