keiro-dsl-0.15.0.0: test/fixtures/hospital-surge-handle.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 }
on-appended AckOk ; on-duplicate AckOk ; on-failed DeadLetter "surge dispatch changed"
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