Skip to content

Commit 529ad05

Browse files
committed
Supporting #withTagger() of typed persistence.
1 parent 9427c33 commit 529ad05

File tree

4 files changed

+41
-2
lines changed

4 files changed

+41
-2
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package org.nullvector
2+
3+
import akka.persistence.journal.Tagged
4+
import reactivemongo.api.bson.BSONDocument
5+
6+
import scala.reflect.ClassTag
7+
8+
class TaggedEventAdapter[E](adapter: EventAdapter[E], tags: Set[String])
9+
(implicit ev: ClassTag[E]) extends EventAdapter[E] {
10+
11+
override val manifest: String = adapter.manifest
12+
13+
override def tags(payload: E): Set[String] = tags
14+
15+
override def payloadToBson(payload: E): BSONDocument = payload match {
16+
case Tagged(realPayload, _) => adapter.toBson(realPayload)
17+
case _ => adapter.payloadToBson(payload)
18+
}
19+
20+
override def bsonToPayload(doc: BSONDocument): E = adapter.bsonToPayload(doc)
21+
22+
}
23+

build.sbt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ publishLocal := {}
1212
lazy val commonSettings = Seq(
1313
name := "akka-reactivemongo-plugin",
1414
organization := "null-vector",
15-
version := s"1.5.0",
15+
version := s"1.5.1",
1616
scalaVersion := scala213,
1717
crossScalaVersions := supportedScalaVersions,
1818
scalacOptions := Seq(

core/src/main/scala/org/nullvector/typed/ReactiveMongoEventSerializer.scala

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@ import akka.Done
44
import akka.actor.typed.scaladsl.{Behaviors, Routers}
55
import akka.actor.typed._
66
import akka.persistence.PersistentRepr
7+
import akka.persistence.journal.Tagged
78
import akka.util.Timeout
89
import org.nullvector.logging.LoggerPerClassAware
910
import org.nullvector.typed.ReactiveMongoEventSerializer.SerializerBehavior
10-
import org.nullvector.{AdapterKey, EventAdapter, Fields, BsonEventAdapter, ReactiveMongoPlugin}
11+
import org.nullvector.{AdapterKey, BsonEventAdapter, EventAdapter, Fields, ReactiveMongoPlugin, TaggedEventAdapter}
1112
import reactivemongo.api.bson.BSONDocument
1213

1314
import scala.collection.concurrent._
@@ -110,6 +111,11 @@ object ReactiveMongoEventSerializer extends ExtensionId[ReactiveMongoEventSerial
110111
def adapterByPayload(persistentRepr: PersistentRepr): Try[EventAdapter[_]] = {
111112
persistentRepr.payload match {
112113
case _: BSONDocument => Success(BsonEventAdapter)
114+
case Tagged(payload, tags) =>
115+
adaptersByType.get(AdapterKey(payload.getClass))
116+
.fold[Try[EventAdapter[_]]](failureByPayload(persistentRepr))(adapter =>
117+
Success(new TaggedEventAdapter(adapter, tags)))
118+
113119
case payload =>
114120
adaptersByType.get(AdapterKey(payload.getClass))
115121
.fold[Try[EventAdapter[_]]](failureByPayload(persistentRepr))(Success(_))

core/src/test/scala/org/nullvector/typed/EventAdapterSerializerSpec.scala

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package org.nullvector.typed
33
import akka.actor.typed.ActorSystem
44
import akka.actor.typed.scaladsl.Behaviors
55
import akka.persistence.PersistentRepr
6+
import akka.persistence.journal.Tagged
67
import org.nullvector.EventAdapterFactory
78
import org.nullvector.typed.ReactiveMongoEventSerializer.Registry
89
import org.scalatest.Matchers.{a, convertToAnyShouldWrapper, thrownBy}
@@ -40,6 +41,15 @@ class EventAdapterSerializerSpec extends FlatSpec {
4041
deserialized.head._2 shouldBe Set("TwoEventTag")
4142
}
4243

44+
it should " serialize with tagger" in {
45+
val serializer = ReactiveMongoEventSerializer(system)
46+
val taggedEvent = Tagged(TwoEvent("TwoEventNameWithTagger"), Set("TagFromTagged"))
47+
val repr = PersistentRepr(taggedEvent, manifest = "TwoManifest")
48+
val future = serializer.serialize(Seq(repr))
49+
val deserialized = Await.result(future, 1.second)
50+
deserialized.head._1.payload shouldBe BSONDocument("name" -> "TwoEventNameWithTagger")
51+
deserialized.head._2 shouldBe Set("TagFromTagged")
52+
}
4353

4454
case class OneEvent(name: String)
4555

0 commit comments

Comments
 (0)