-
Notifications
You must be signed in to change notification settings - Fork 12
Expand file tree
/
Copy pathBookingEventSerializer.scala
More file actions
88 lines (73 loc) · 3.26 KB
/
Copy pathBookingEventSerializer.scala
File metadata and controls
88 lines (73 loc) · 3.26 KB
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package ru.pavkin.booking.booking.serialization
import aecor.data.Enriched
import aecor.journal.postgres.PostgresEventJournal
import aecor.journal.postgres.PostgresEventJournal.Serializer.TypeHint
import cats.data.NonEmptyList
import enumeratum.EnumEntry
import ru.pavkin.booking.booking.entity._
import ru.pavkin.booking.booking.protobuf.msg
import enumeratum._
import cats.syntax.either._
import scala.collection.immutable
object BookingEventSerializer
extends PostgresEventJournal.Serializer[Enriched[EventMetadata, BookingEvent]] {
sealed trait Hint extends EnumEntry
object Hint extends Enum[Hint] {
case object AA extends Hint
case object AB extends Hint
case object AC extends Hint
case object AD extends Hint
case object AE extends Hint
case object AF extends Hint
case object AG extends Hint
def values: immutable.IndexedSeq[Hint] = findValues
}
import Hint._
def serialize(a: Enriched[EventMetadata, BookingEvent]): (TypeHint, Array[Byte]) = a match {
case Enriched(m, BookingPlaced(clientId, concertId, seats)) =>
AA.entryName -> msg.BookingPlaced(clientId, concertId, seats.toList, m.timestamp).toByteArray
case Enriched(m, BookingConfirmed(tickets, expiresAt)) =>
AB.entryName -> msg.BookingConfirmed(tickets.toList, expiresAt, m.timestamp).toByteArray
case Enriched(m, BookingDenied(reason)) =>
AC.entryName -> msg.BookingDenied(reason, m.timestamp).toByteArray
case Enriched(m, BookingCancelled(reason)) =>
AD.entryName -> msg.BookingCancelled(reason, m.timestamp).toByteArray
case Enriched(m, BookingExpired) =>
AE.entryName -> msg.BookingExpired(m.timestamp).toByteArray
case Enriched(m, BookingPaid(paymentId)) =>
AF.entryName -> msg.BookingPaid(paymentId, m.timestamp).toByteArray
case Enriched(m, BookingSettled) =>
AG.entryName -> msg.BookingSettled(m.timestamp).toByteArray
}
def deserialize(typeHint: TypeHint,
bytes: Array[Byte]): Either[Throwable, Enriched[EventMetadata, BookingEvent]] =
Either.catchNonFatal(Hint.withName(typeHint) match {
case Hint.AA =>
val raw = msg.BookingPlaced.parseFrom(bytes)
Enriched(
EventMetadata(raw.timestamp),
BookingPlaced(raw.clientId, raw.concertId, NonEmptyList.fromListUnsafe(raw.seats.toList))
)
case Hint.AB =>
val raw = msg.BookingConfirmed.parseFrom(bytes)
Enriched(
EventMetadata(raw.timestamp),
BookingConfirmed(NonEmptyList.fromListUnsafe(raw.tickets.toList), raw.expiresAt)
)
case Hint.AC =>
val raw = msg.BookingDenied.parseFrom(bytes)
Enriched(EventMetadata(raw.timestamp), BookingDenied(raw.reason))
case Hint.AD =>
val raw = msg.BookingCancelled.parseFrom(bytes)
Enriched(EventMetadata(raw.timestamp), BookingCancelled(raw.reason))
case Hint.AE =>
val raw = msg.BookingExpired.parseFrom(bytes)
Enriched(EventMetadata(raw.timestamp), BookingExpired)
case Hint.AF =>
val raw = msg.BookingPaid.parseFrom(bytes)
Enriched(EventMetadata(raw.timestamp), BookingPaid(raw.paymentId))
case Hint.AG =>
val raw = msg.BookingSettled.parseFrom(bytes)
Enriched(EventMetadata(raw.timestamp), BookingSettled)
})
}