membership-attribute-service/app/services/MobileSubscriptionService.scala (47 lines of code) (raw):

package services import com.github.nscala_time.time.OrderingImplicits._ import com.gu.monitoring.SafeLogger.LogPrefix import com.gu.monitoring.SafeLogging import com.typesafe.config.Config import models.MobileSubscriptionStatus import play.api.libs.json.{JsError, JsSuccess} import play.api.libs.ws.WSClient import scala.concurrent.{ExecutionContext, Future} trait MobileSubscriptionService { def getSubscriptionStatusForUser(identityId: String)(implicit logPrefix: LogPrefix): Future[Either[String, Option[MobileSubscriptionStatus]]] } class MobileSubscriptionServiceImpl(wsClient: WSClient, config: Config)(implicit ec: ExecutionContext) extends MobileSubscriptionService with SafeLogging { val mobileSubscriptionApiKey = config.getString("mobile.subscription.apiKey") private val subscriptionURL = config.getString("stage") match { case "PROD" => "https://mobile-purchases.mobile-aws.guardianapis.com" case _ => "https://mobile-purchases.mobile-aws.code.dev-guardianapis.com" } override def getSubscriptionStatusForUser( identityId: String, )(implicit logPrefix: LogPrefix): Future[Either[String, Option[MobileSubscriptionStatus]]] = { val response = wsClient .url(s"$subscriptionURL/user/subscriptions/$identityId") .withHttpHeaders("Authorization" -> s"Bearer $mobileSubscriptionApiKey") .get() response.map { resp => if (resp.status != 200) { Left(s"Unable to fetch the mobile subscription status for $identityId, got HTTP ${resp.status} ${resp.statusText}") } else { val parsedSubs = (resp.json \ "subscriptions") .validate[List[MobileSubscriptionStatus]] parsedSubs match { case JsError(errors) => Left(s"Unable to parse mobile subscription response: $errors") case JsSuccess(subs, _) => logger.info(s"Successfully retrieved ${subs.size} mobile subscriptions for $identityId") val mostRecentValidSub = subs.filter(_.valid).sortBy(_.to).lastOption val mostRecentInvalidSub = subs.filterNot(_.valid).sortBy(_.to).lastOption val result = mostRecentValidSub.orElse(mostRecentInvalidSub) logger.info(s"Mobile subscription for $identityId is $result") Right(result) } } } } }