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: _*))
}
}