app/updates/UpdateMessage.scala (125 lines of code) (raw):
package updates
import com.gu.facia.client.models.{
CollectionJson,
CollectionConfigJson,
FrontJson,
TrailMetaData
}
import julienrf.json.derived
import org.joda.time.DateTime
import play.api.libs.json._
import services.ConfigAgent
sealed trait UpdateMessage {
def affectedFronts(configAgent: ConfigAgent): Set[String]
}
/* Config updates */
object CreateFront {
implicit val jsonFormat: Reads[CreateFront] =
Json.format[CreateFront].filter(_.id.matches("""^[a-z0-9\/\-+]*$"""))
}
case class CreateFront(
id: String,
navSection: Option[String],
webTitle: Option[String],
title: Option[String],
imageUrl: Option[String],
imageWidth: Option[Int],
imageHeight: Option[Int],
isImageDisplayed: Option[Boolean],
description: Option[String],
onPageDescription: Option[String],
priority: Option[String],
isHidden: Option[Boolean],
initialCollection: CollectionConfigJson,
group: Option[String]
) extends UpdateMessage {
def affectedFronts(configAgent: ConfigAgent) = Set(id)
}
case class UpdateFront(id: String, front: FrontJson) extends UpdateMessage {
def affectedFronts(configAgent: ConfigAgent) = Set(id)
}
case class CollectionCreate(
frontIds: List[String],
collection: CollectionConfigJson,
collectionId: String
) extends UpdateMessage {
def affectedFronts(configAgent: ConfigAgent) = frontIds.toSet[String]
}
case class CollectionUpdate(
frontIds: List[String],
collection: CollectionConfigJson,
collectionId: String
) extends UpdateMessage {
def affectedFronts(configAgent: ConfigAgent) = frontIds.toSet[String]
}
/* Collection updates */
case class UpdateList(
id: String,
item: String,
position: Option[String],
after: Option[Boolean],
itemMeta: Option[TrailMetaData],
live: Boolean,
draft: Boolean
) extends UpdateMessage {
def affectedFronts(configAgent: ConfigAgent): Set[String] =
configAgent.getConfigsUsingCollectionId(id).toSet[String]
}
object UpdateList {
implicit val format: Format[UpdateList] = Json.format[UpdateList]
}
case class Update(update: UpdateList) extends UpdateMessage {
def affectedFronts(configAgent: ConfigAgent) =
update.affectedFronts(configAgent)
}
case class Remove(remove: UpdateList) extends UpdateMessage {
def affectedFronts(configAgent: ConfigAgent) =
remove.affectedFronts(configAgent)
}
case class UpdateAndRemove(update: UpdateList, remove: UpdateList)
extends UpdateMessage {
def affectedFronts(configAgent: ConfigAgent) =
update.affectedFronts(configAgent) ++ remove.affectedFronts(configAgent)
}
case class DiscardUpdate(id: String) extends UpdateMessage {
def affectedFronts(configAgent: ConfigAgent) =
configAgent.getConfigsUsingCollectionId(id).toSet[String]
}
case class PublishUpdate(id: String) extends UpdateMessage {
def affectedFronts(configAgent: ConfigAgent) =
configAgent.getConfigsUsingCollectionId(id).toSet[String]
}
case class HandlingBreakingNewsUpdate(id: String) extends UpdateMessage {
def affectedFronts(configAgent: ConfigAgent) =
configAgent.getConfigsUsingCollectionId(id).toSet[String]
}
case class HandlingBreakingNewsCollection(id: String) extends UpdateMessage {
def affectedFronts(configAgent: ConfigAgent) =
configAgent.getConfigsUsingCollectionId(id).toSet[String]
}
case class HandlingBreakingNewsTrail(
id: String,
breakingNewsTrail: ClientHydratedTrail
) extends UpdateMessage {
def affectedFronts(configAgent: ConfigAgent) =
configAgent.getConfigsUsingCollectionId(id).toSet[String]
}
case class ArchiveUpdate(id: String) extends UpdateMessage {
def affectedFronts(configAgent: ConfigAgent) =
configAgent.getConfigsUsingCollectionId(id).toSet[String]
}
case class V2CollectionUpdate(id: String, collection: CollectionJson)
extends UpdateMessage {
def affectedFronts(configAgent: ConfigAgent) =
configAgent.getConfigsUsingCollectionId(id).toSet[String]
}
/* Macro - Watch out, this needs to be after the case classes */
object UpdateMessage {
implicit val format: OFormat[UpdateMessage] =
derived.flat.oformat[UpdateMessage]((__ \ "type").format[String])
}
/* Kinesis messages */
case class LogUpdate(update: UpdateMessage, email: String) {
def fronts(configAgent: ConfigAgent): Set[String] =
update.affectedFronts(configAgent)
val dateTime: DateTime = new DateTime()
}
object LogUpdate {
implicit val streamUpdateFormat: Format[LogUpdate] = Json.format[LogUpdate]
}