app/util/NotifyingAtomPublisher.scala (42 lines of code) (raw):

package util import com.amazonaws.services.sns.AmazonSNS import com.amazonaws.services.sns.model.PublishRequest import com.gu.atom.publish.AtomPublisher import com.gu.contentatom.thrift.{ContentAtomEvent, EventType} import org.joda.time.{DateTime, DateTimeZone} import play.api.libs.json.{Json, Writes} import play.api.libs.json.JodaWrites._ import play.api.libs.json.JodaReads._ import scala.util.Try class NotifyingAtomPublisher(isLive: Boolean, topicArn: String, underlying: AtomPublisher, sns: AmazonSNS) extends AtomPublisher { override def publishAtomEvent(event: ContentAtomEvent): Try[Unit] = { underlying.publishAtomEvent(event).flatMap { _ => val notification = SimpleContentUpdate.fromEvent(event, isLive) val json = Json.stringify(Json.toJson(notification)) val request = new PublishRequest(topicArn, json, "atom-update") Try(sns.publish(request)) } } } case class SimpleContentUpdate( id: String, whatChanged: String, eventTime: DateTime, revision: Option[Long], isLive: Boolean, isMigration: Boolean = false, isProdmon: Boolean, isExpired: Boolean ) object SimpleContentUpdate { implicit val writes: Writes[SimpleContentUpdate] = Json.writes[SimpleContentUpdate] def fromEvent(event: ContentAtomEvent, isLive: Boolean): SimpleContentUpdate = SimpleContentUpdate( id = s"${event.atom.atomType.toString}/${event.atom.id}", whatChanged = if(event.eventType == EventType.Takedown) { "takeDown" } else { "update" }, eventTime = new DateTime(event.eventCreationTime, DateTimeZone.UTC), revision = Some(event.atom.contentChangeDetails.revision), isLive, isMigration = false, isProdmon = false, isExpired = false ) }