packages feed

keiro-dsl-0.15.0.0: test/fixtures/surge-service.keiro

language keiro-dsl 4
context surge-demo

id HospitalId prefix=hosp

process SurgeFlow
  name "surge-demo"
  input SurgeInput { hospitalId observedAt:Time }
  correlate input.hospitalId via idText
  saga Surge category "surge"
  target Hospital
  projections [ surge ]

  on SurgeInput
    advance NoteSurgeThreshold { hospitalId }
    dispatch Hospital@input.hospitalId ActivateSurge { hospitalId }
      on-appended AckOk ; on-duplicate AckOk ; on-failed Retry
    schedule surgeFollowUp

  dispatch-id strategy=uuidv5 from=(name, correlationId, sourceEventId, emitIndex)
  rejected => halt
  poison => halt

  timer surgeFollowUp
    id uuidv5 "surge-timer:" <> correlationId
    fireAt input.observedAt + 5m
    payload { kind="surge-follow-up" }
    fire dispatch Surge@correlationId MarkSurgeTimerFired { hospitalId }
      fired-event-id uuidv5 "surge-fired:" <> correlationId
      on-ok Fired ; on-reject Fired ; on-ambiguous Retry ; on-error Retry ; not-mine Retry
    decode unknown-status => Cancelled
    max-attempts 5 dead-letter "ceiling"

aggregate Surge
  regs
  states Watching Noted Fired!

  command NoteSurgeThreshold { hospitalId }
  command MarkSurgeTimerFired { hospitalId }
  event SurgeThresholdNoted = fields(NoteSurgeThreshold)
  event SurgeTimerFired = fields(MarkSurgeTimerFired)

  Watching -- NoteSurgeThreshold --> emit SurgeThresholdNoted ; goto Noted
  Noted -- MarkSurgeTimerFired --> emit SurgeTimerFired ; goto Fired

  wire kind=ctorName fields=camelCase schemaVersion=1
  projection surge key=hospitalId
    status-map { SurgeThresholdNoted=>noted SurgeTimerFired=>fired }

aggregate Hospital
  regs
  states Idle Surging!

  command ActivateSurge { hospitalId }
  event SurgeActivated = fields(ActivateSurge)

  Idle -- ActivateSurge --> emit SurgeActivated ; goto Surging

  wire kind=ctorName fields=camelCase schemaVersion=1
  projection hospital key=hospitalId
    status-map { SurgeActivated=>surging }