Skip to content

feat(workflow): add WorkflowEventDispatcher + AddEscalatedWorkflows#20

Open
mpge wants to merge 1 commit intofeat/workflow-runnerfrom
feat/workflow-listener
Open

feat(workflow): add WorkflowEventDispatcher + AddEscalatedWorkflows#20
mpge wants to merge 1 commit intofeat/workflow-runnerfrom
feat/workflow-listener

Conversation

@mpge
Copy link
Copy Markdown
Member

@mpge mpge commented Apr 24, 2026

Summary

Final piece of the workflow stack for .NET. Adds a decorator IEscalatedEventDispatcher that, for every event dispatched by Escalated services:

  1. Forwards to the host's inner dispatcher (so host subscribers see every event in original order)
  2. Resolves the event to a canonical workflow trigger name
  3. Kicks WorkflowRunnerService.RunForEventAsync for matching triggers

Event → trigger mapping

Matches WorkflowEngine.TRIGGER_EVENTS:

Event Trigger
TicketCreatedEvent ticket.created
TicketUpdatedEvent ticket.updated
TicketStatusChangedEvent / TicketResolvedEvent / TicketClosedEvent ticket.status_changed
TicketReopenedEvent ticket.reopened
TicketAssignedEvent ticket.assigned
TicketPriorityChangedEvent ticket.priority_changed
DepartmentChangedEvent ticket.department_changed
TagAddedEvent / TagRemovedEvent ticket.tagged
ReplyCreatedEvent reply.created
SlaBreachedEvent sla.breached
SlaWarningEvent sla.warning

Runner failures are caught + ILogger.LogError'd so a misbehaving workflow never blocks the event that fired it.

Opt-in

Host apps wire this in once during Program.cs:

services.AddEscalated().AddEscalatedWorkflows();

AddEscalatedWorkflows() is idempotent — calling it twice doesn't double-wrap.

Complete chain

TicketService mutation
  → IEscalatedEventDispatcher.DispatchAsync
  → WorkflowEventDispatcher decorator
  → WorkflowRunnerService.RunForEventAsync
  → WorkflowEngine (conditions) + WorkflowExecutorService (actions)
  → WorkflowLog audit row

Dependencies

Test plan

  • 17 xUnit tests covering event → trigger mapping (via [Theory]), inner-dispatcher forwarding, runner kick, unknown-event isolation, end-to-end workflow log creation against in-memory EF Core
  • CI green (won't trigger against stacked base until rebased)

…xtension

Final piece of the workflow stack for .NET. Adds a decorator
IEscalatedEventDispatcher that, for every dispatched event:
  1. Forwards to the host's inner dispatcher (so host subscribers see
     every event in original order)
  2. Resolves the event to a canonical workflow trigger name
  3. Kicks WorkflowRunnerService.RunForEventAsync for matching triggers

Event → trigger mapping (matches WorkflowEngine.TRIGGER_EVENTS):
  TicketCreatedEvent            → ticket.created
  TicketUpdatedEvent            → ticket.updated
  TicketStatusChangedEvent,     → ticket.status_changed
    TicketResolvedEvent,
    TicketClosedEvent
  TicketReopenedEvent           → ticket.reopened
  TicketAssignedEvent           → ticket.assigned
  TicketPriorityChangedEvent    → ticket.priority_changed
  DepartmentChangedEvent        → ticket.department_changed
  TagAddedEvent / TagRemoved    → ticket.tagged
  ReplyCreatedEvent             → reply.created
  SlaBreachedEvent              → sla.breached
  SlaWarningEvent               → sla.warning

Runner failures are caught + ILogger-logged so a misbehaving workflow
never blocks the event that fired it.

Host apps opt in with:
  services.AddEscalated().AddEscalatedWorkflows();

With this commit the chain is complete end-to-end:
  TicketService mutation → IEscalatedEventDispatcher.DispatchAsync →
  WorkflowEventDispatcher decorator → WorkflowRunnerService →
  WorkflowEngine (conditions) + WorkflowExecutorService (actions) →
  WorkflowLog audit row
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant