def userFromRequestIdapi()

in mobile-save-for-later/src/main/scala/com/gu/sfl/identity/IdentityService.scala [38:88]


  def userFromRequestIdapi(identityHeaders: IdentityHeader): Future[Option[String]] = {
    val meUrl = s"${identityConfig.identityApiHost}/user/me/identifiers"

    val headers = new Headers.Builder()
      .add("X-GU-ID-Client-Access-Token", identityHeaders.accessToken)
      .add("Authorization", identityHeaders.auth)
      .build()

    val promise = Promise[Option[String]]

    val request = new Request.Builder()
      .url(meUrl)
      .headers(headers)
      .get()
      .build()

    def extractUserIdFromSuccessResult(response: Response) = {
      Try {
        val body = response.body().string()
        logger.debug(s"Identity api response: $body")
        val node = mapper.readTree(body.getBytes)
        node.path("id").textValue
      } match {
        case Success(userId) =>
          // .textValue can return null, so wrap in Option.apply
          promise.success(Option(userId))
        case Failure(_) =>
          promise.success(None)
      }
    }

    okHttpClient.newCall(
      request
    ).enqueue(new Callback {
      override def onResponse(call: Call, response: Response): Unit = {
        val responseCodeGroup = response.code() / 100

        // 5XX responses should not log users out, so fail the promise instead of returning None
        if (responseCodeGroup == 5) {
          promise.failure(IdentityApiRequestError("Identity api server error"))
        } else if (responseCodeGroup == 2) {
          extractUserIdFromSuccessResult(response)
        } else {
          promise.success(None)
        }
      }

      override def onFailure(call: Call, e: IOException): Unit = promise.failure(IdentityApiRequestError("Did not get identiy api response"))
    })
    promise.future
  }