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))
}