app/prism/Http.scala (40 lines of code) (raw):

package prism import models.{AMIableError, AMIableErrors, Attempt} import play.api.Logging import play.api.libs.ws.WSResponse import scala.concurrent.{ExecutionContext, Future} object Http extends Logging { /** Reusable logic for handling WS errors */ def response( response: Future[WSResponse], friendlyMessage: String, detail: String )(implicit ec: ExecutionContext): Attempt[WSResponse] = { val handleStatusCode: Future[Either[AMIableErrors, WSResponse]] = { response.map { response => response.status match { case status if status < 400 => Right(response) case status => logger.warn(s"Status code $status: $detail") Left( AMIableErrors( AMIableError(s"$status: $detail", friendlyMessage, status) ) ) } } } Attempt.fromFuture(handleStatusCode) { case e: Exception => logger.error(s"Request failed: $detail", e) Left( AMIableErrors( AMIableError( s"Request failed: $detail, ${e.getMessage}", friendlyMessage, 500 ) ) ) } } }