app/event/BakeEvent.scala (56 lines of code) (raw):
package event
import java.util.UUID
import models.{BakeLog, AmiId, BakeId}
import play.api.libs.EventSource.{EventIdExtractor, EventDataExtractor}
import play.api.libs.json.{JsNumber, JsString, JsObject}
sealed abstract class BakeEvent(
val bakeId: BakeId,
val eventId: String = UUID.randomUUID().toString
)
object BakeEvent {
case class Log(override val bakeId: BakeId, bakeLog: BakeLog)
extends BakeEvent(bakeId)
case class AmiCreated(override val bakeId: BakeId, amiId: AmiId)
extends BakeEvent(bakeId)
case class PackerProcessExited(override val bakeId: BakeId, exitCode: Int)
extends BakeEvent(bakeId)
def unapply(event: BakeEvent): Option[BakeId] = Some(event.bakeId)
implicit val eventIdExtractor: EventIdExtractor[BakeEvent] =
EventIdExtractor[BakeEvent](e => Some(e.eventId))
implicit val eventDataExtractor: EventDataExtractor[BakeEvent] =
EventDataExtractor[BakeEvent]({ event =>
val json = event match {
case Log(_, log) =>
JsObject(
Seq(
"eventType" -> JsString("log"),
"timestamp" -> JsString(
log.timestamp.toString("YYYY-MM-dd HH:mm:ss")
),
"log" -> JsObject(
Seq(
"level" -> JsString(log.logLevel),
"number" -> JsNumber(log.logNumber),
"messageHtml" -> JsString(log.messageHtml.toString)
)
)
)
)
case AmiCreated(_, amiId) =>
JsObject(
Seq(
"eventType" -> JsString("ami-created"),
"amiId" -> JsString(amiId.value)
)
)
case PackerProcessExited(_, exitCode) =>
JsObject(
Seq(
"eventType" -> JsString("packer-process-exited"),
"exitCode" -> JsNumber(exitCode)
)
)
}
json.toString()
})
}