app/story_packages/tools/FaciaApiIO.scala (26 lines of code) (raw):
package story_packages.tools
import com.gu.facia.client.models.CollectionJson
import com.gu.pandomainauth.model.User
import play.api.libs.json.{JsValue, _}
import story_packages.services.{FrontsApi, Logging, S3FrontsApi}
import scala.concurrent.Future
import scala.util.Try
trait FaciaApiRead {
def getCollectionJson(id: String): Future[Option[CollectionJson]]
}
trait FaciaApiWrite {
def putCollectionJson(id: String, collectionJson: CollectionJson): CollectionJson
def archive(id: String, collectionJson: CollectionJson, update: JsValue, identity: User): Unit
}
class FaciaApiIO(val frontsApi: FrontsApi, val s3FrontsApi: S3FrontsApi) extends FaciaApiRead with FaciaApiWrite with Logging {
def getCollectionJson(id: String): Future[Option[CollectionJson]] = frontsApi.amazonClient.collection(id)
def putCollectionJson(id: String, collectionJson: CollectionJson): CollectionJson = {
Try(s3FrontsApi.putCollectionJson(id, Json.prettyPrint(Json.toJson(collectionJson))))
collectionJson
}
def archive(id: String, collectionJson: CollectionJson, update: JsValue, identity: User): Unit = {
Json.toJson(collectionJson).transform[JsObject](Reads.JsObjectReads) match {
case JsSuccess(result, _) =>
s3FrontsApi.archive(id, Json.prettyPrint(result + ("diff", update)), identity)
case JsError(errors) => Logger.warn(s"Could not archive $id: $errors")}}
}