private def jsonParse()

in membership-common/src/main/scala/com/gu/salesforce/Scalaforce.scala [100:135]


  private def jsonParse(response: String): JsValue = Json.parse(response)

  object Contact {
    def read(key: String, id: String)(implicit logPrefix: LogPrefix): Future[\/[String, Option[JsValue]]] = {
      val path = s"services/data/v57.0/sobjects/Contact/$key/$id"
      Timing
        .record(metrics, "Read Contact") {
          get(path)
        }
        .map { response =>
          val bodyString = response.body().string() // out here to make sure connection is closed in all cases
          response.code() match {
            case Status.OK => \/-(Some(jsonParse(bodyString)))
            case Status.NOT_FOUND => \/-(None)
            case code => -\/(s"SF003: Salesforce returned code $code for Contact read $key $id")
          }
        }
    }

    private def update(id: SFContactId, json: JsValue)(implicit logPrefix: LogPrefix): Future[Unit] = Timing
      .record(metrics, "Update Contact") {
        patch(s"services/data/v54.0/sobjects/Contact/${id.get}", json)
      }
      .flatMap { r =>
        val output = r.body().string()
        r.body().close()
        Monad[Future].unlessM(r.code == 204)(Future.failed(new Exception(s"Bad code for update ${r.code}: $output")))
      }

    def update(id: SFContactId, newFields: Map[String, String])(implicit logPrefix: LogPrefix): Future[Unit] = {
      val fields = newFields map { case (name, value) =>
        name -> Json.toJsFieldJsValueWrapper(value)
      }
      update(id, Json.obj(fields.toList: _*))
    }
  }