packages feed

keiro-dsl-0.17.0.0: test/fixtures/process-timers-identity-changed.keiro

language keiro-dsl 6
context process-timers

id IncidentId prefix=inc

process IncidentTimers
  name "incident-timers"
  reactions version 2
  input IncidentReported { incidentId:IncidentId raisedAt:Time detail:Text }
  input ResponderAcked { incidentId:IncidentId }
  correlate input.incidentId via idText
  saga IncidentSaga category "incidentTimers"
  target Incident
  projections [ ]

  on IncidentReported
    advance RecordIncident { incidentId }
    schedule escalation fireAt input.raisedAt + 5m { incidentId detail }
    schedule reminder once fireAt input.raisedAt + 60m { incidentId }

  on ResponderAcked
    cancel reminder

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

  timers max-attempts 5 dead-letter "incident timer exceeded ceiling"

  timer escalation
    id uuidv5 "incident-escalation-timer-v2:" <> correlationId
    payload { kind="escalation" incidentId:IncidentId detail:Text }
    fire dispatch Incident@correlationId EscalateIncident { incidentId }
      fired-event-id uuidv5 "incident-escalation-fired:" <> correlationId
      on-ok Fired ; on-reject Fired ; on-ambiguous Retry ; on-error Retry ; not-mine Retry
    decode unknown-status => Cancelled

  timer reminder
    id uuidv5 "incident-reminder-timer:" <> correlationId
    payload { kind="reminder" incidentId:IncidentId }
    fire dispatch Incident@correlationId RemindIncident { incidentId }
      fired-event-id uuidv5 "incident-reminder-fired:" <> correlationId
      on-ok Fired ; on-reject Fired ; on-ambiguous Retry ; on-error Retry ; not-mine Retry
    decode unknown-status => Cancelled

aggregate IncidentSaga
  regs
  states Open
  command RecordIncident { incidentId }
  event IncidentRecorded = fields(RecordIncident)
  Open -- RecordIncident --> emit IncidentRecorded ; goto Open

aggregate Incident
  regs
  states Open EscalatedState
  command EscalateIncident { incidentId }
  command RemindIncident { incidentId }
  event IncidentEscalated = fields(EscalateIncident)
  event IncidentReminded = fields(RemindIncident)
  Open -- EscalateIncident --> emit IncidentEscalated ; goto EscalatedState
  Open -- RemindIncident --> emit IncidentReminded ; goto Open