packages feed

keiro-dsl-0.15.0.0: test/fixtures/hospital-surge-dispatchid.keiro

language keiro-dsl 4
context hospital-capacity

id  HospitalId  prefix=hosp
id  CommandId   prefix=cmd

process HospitalSurge
  name "hospital-surge"
  input SurgeInput { hospitalId availableIcuBeds:Int redDemand:Int observedAt:Time }
  correlate input.hospitalId via idText
  saga Surge category "hospitalSurge"
  target Hospital
  projections [ ]

  on SurgeInput
    advance NoteSurgeThreshold { hospitalId availableIcuBeds redDemand timerId=timer.id }
    dispatch Hospital@input.hospitalId ActivateSurge { hospitalId commandId=foo.bar }
      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 "hospital-surge-timer:" <> correlationId
    fireAt input.observedAt + 5m
    payload { kind="hospital-surge-follow-up" hospitalId }
    fire dispatch Surge@correlationId MarkSurgeTimerFired { hospitalId timerId }
      fired-event-id uuidv5 "hospital-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 "surge timer exceeded ceiling"

aggregate Surge
  regs
  states Idle

  command NoteSurgeThreshold { hospitalId availableIcuBeds:Int redDemand:Int timerId }
  command MarkSurgeTimerFired { hospitalId timerId }
  event SurgeThresholdNoted = fields(NoteSurgeThreshold)
  event SurgeTimerMarked = fields(MarkSurgeTimerFired)

  Idle -- NoteSurgeThreshold --> emit SurgeThresholdNoted ; goto Idle
  Idle -- MarkSurgeTimerFired --> emit SurgeTimerMarked ; goto Idle

aggregate Hospital
  regs
  states Operational

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

  Operational -- ActivateSurge --> emit SurgeActivated ; goto Operational