Skip to content

Instantly share code, notes, and snippets.

@mickaelw
Created April 12, 2020 16:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mickaelw/3e779ddd192e774988923783edb4ea39 to your computer and use it in GitHub Desktop.
Save mickaelw/3e779ddd192e774988923783edb4ea39 to your computer and use it in GitHub Desktop.
POC Saga
class PhoneNumbersSaga(eventPublisher: EventPublisher) extends EventListener {
private var tracker = new PhoneNumberStateTracker
def handle(phoneNumbers: List[String]): PhoneNumberStateTracker = {
eventPublisher.publish(AllPhoneNumberListed(phoneNumbers))
tracker
}
override def execute(event: Event): Unit = event match {
case apnc: AllPhoneNumbersCounted => tracker = PhoneNumberStateTracker(apnc.total, tracker.totalMatchedPhoneNumbers)
case mpnc: MatchedPhoneNumbersCounted => tracker = PhoneNumberStateTracker(tracker.totalPhoneNumbersCount, mpnc.total)
}
}
case class PhoneNumberStateTracker(totalPhoneNumbersCount: Int = 0, totalMatchedPhoneNumbers: Int = 0)
class TotalPhoneNumbersCounter(eventPublisher: EventPublisher) extends EventListener {
override def execute(event: Event): Unit = event match {
case apnl: AllPhoneNumberListed => eventPublisher.publish(AllPhoneNumbersCounted(apnl.phoneNumbers.length))
case _ =>
}
}
class PhoneNumberFinder(eventPublisher: EventPublisher) extends EventListener {
override def execute(event: Event): Unit = event match {
case apnl: AllPhoneNumberListed => eventPublisher.publish(PhoneNumberMatched(apnl.phoneNumbers.filter(_.startsWith("(377)"))))
case _ =>
}
}
class MatchedPhoneNumberCounter(eventPublisher: EventPublisher) extends EventListener {
override def execute(event: Event): Unit = event match {
case pnm: PhoneNumberMatched => eventPublisher.publish(MatchedPhoneNumbersCounted(pnm.phoneNumberMatched.length))
case _ =>
}
}
case class AllPhoneNumberListed(phoneNumbers: List[String], createdAt: LocalDateTime = LocalDateTime.now()) extends Event {
override val name: String = AllPhoneNumberListed.name
}
object AllPhoneNumberListed {
val name = "AllPhoneNumberListed"
}
case class AllPhoneNumbersCounted(total: Int, createdAt: LocalDateTime = LocalDateTime.now()) extends Event {
override val name: String = "AllPhoneNumbersCounted"
}
object AllPhoneNumbersCounted {
val name = "AllPhoneNumbersCounted"
}
case class PhoneNumberMatched(phoneNumberMatched: List[String], createdAt: LocalDateTime = LocalDateTime.now()) extends Event {
override val name: String = "PhoneNumberMatched"
}
object PhoneNumberMatched {
val name = "PhoneNumberMatched"
}
case class MatchedPhoneNumbersCounted(total: Int,createdAt: LocalDateTime = LocalDateTime.now()) extends Event {
override val name: String = "MatchedPhoneNumbersCounted"
}
object MatchedPhoneNumbersCounted {
val name = "MatchedPhoneNumbersCounted"
}
class ProcessManagerTest extends AnyWordSpec with Matchers with BeforeAndAfterEach {
var phoneNumberExecutive: PhoneNumbersSaga = _
val phoneNumbers: List[String] = List("(250) 839-7238", "(978) 918-2349", "(852) 984-5973", "(587) 711-6327", "(629) 252-8255",
"(839) 508-9619", "(552) 929-1262", "(465) 724-0980", "(377) 487-7659", "(904) 956-1940", "(548) 625-9604", "(876) 292-7936",
"(219) 999-2245", "(304) 676-3186", "(843) 566-0331", "(271) 598-0007", "(690) 962-7373", "(847) 592-9224", "(409) 599-6776",
"(622) 745-9762", "(224) 414-8909", "(847) 751-3825", "(636) 927-0375", "(959) 788-2139", "(626) 772-2022", "(956) 667-4484",
"(576) 456-4131", "(631) 447-6943", "(377) 925-4951", "(632) 613-2484", "(760) 206-1358", "(332) 557-9519", "(564) 496-7593",
"(412) 636-3117", "(234) 531-1641", "(962) 833-1373", "(932) 684-1527", "(557) 566-5129", "(688) 582-2933", "(211) 402-3009",
"(429) 837-9386", "(373) 504-1841", "(933) 700-8717", "(858) 617-0738", "(611) 548-5575", "(358) 634-8586", "(838) 673-2329",
"(389) 586-6491", "(482) 706-4909", "(277) 762-8216")
override protected def beforeEach(): Unit = {
val eventPublisher = InternalEventPublisher(new InMemoryEventStore())
phoneNumberExecutive = new PhoneNumbersSaga(eventPublisher)
eventPublisher.registerHandlers(Map(
AllPhoneNumberListed.name -> Set(new TotalPhoneNumbersCounter(eventPublisher), new PhoneNumberFinder(eventPublisher)),
AllPhoneNumbersCounted.name -> Set(phoneNumberExecutive),
PhoneNumberMatched.name -> Set(new MatchedPhoneNumberCounter(eventPublisher)),
MatchedPhoneNumbersCounted.name -> Set(phoneNumberExecutive)
))
}
"Saga" when {
"Process Manager" should {
"Count total phone numbers" in {
val tracker = phoneNumberExecutive.handle(phoneNumbers)
tracker.totalPhoneNumbersCount should be(50)
}
"Count total matched phone numbers to start with 377" in {
val tracker = phoneNumberExecutive.handle(phoneNumbers)
tracker.totalMatchedPhoneNumbers should be(2)
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment