/
SseEncoder.scala
38 lines (25 loc) · 1.14 KB
/
SseEncoder.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package ch.epfl.bluebrain.nexus.delta.sdk.sse
import ch.epfl.bluebrain.nexus.delta.kernel.utils.ClassUtils
import ch.epfl.bluebrain.nexus.delta.sdk.sse.SseEncoder.SseData
import ch.epfl.bluebrain.nexus.delta.sourcing.event.Event
import ch.epfl.bluebrain.nexus.delta.sourcing.event.Event.ScopedEvent
import ch.epfl.bluebrain.nexus.delta.sourcing.model.{EntityType, Label, ProjectRef}
import io.circe.{Decoder, Encoder, JsonObject}
import scala.reflect.ClassTag
abstract class SseEncoder[E <: Event](implicit c: ClassTag[E]) {
def databaseDecoder: Decoder[E]
def entityType: EntityType
def handlesScopedEvent: Boolean = classOf[ScopedEvent].isAssignableFrom(c.runtimeClass)
def selectors: Set[Label]
def sseEncoder: Encoder.AsObject[E]
def toSse: Decoder[SseData] = databaseDecoder.map { event =>
val data = sseEncoder.encodeObject(event)
event match {
case e: ScopedEvent => SseData(ClassUtils.simpleName(e), Some(e.project), data)
case e => SseData(ClassUtils.simpleName(e), None, data)
}
}
}
object SseEncoder {
final case class SseData(tpe: String, project: Option[ProjectRef], data: JsonObject)
}