-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathSideEffectsScenario.cs
More file actions
81 lines (64 loc) · 3.08 KB
/
Copy pathSideEffectsScenario.cs
File metadata and controls
81 lines (64 loc) · 3.08 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
using ModularityKit.Mutator.Abstractions.Context;
using ModularityKit.Mutator.Abstractions.Effects;
using ModularityKit.Mutator.Abstractions.Engine;
using System.Text.Json;
using WorkflowApprovals.Contracts;
using WorkflowApprovals.Mutations;
using WorkflowApprovals.State;
namespace WorkflowApprovals.Scenarios;
internal static class SideEffectsScenario
{
internal static async Task Run(IMutationEngine engine)
{
Console.WriteLine("\n=== Side Effects Scenario ===");
SideEffectDataContractRegistry.Register<WorkflowStartedSideEffectData>();
SideEffectDataContractRegistry.Register<WorkflowRejectedSideEffectData>();
var state = new ApprovalWorkflowState();
var startContext = MutationContext.System("Start side effect demo", correlationId: "workflow-side-effects");
var start = new StartApprovalMutation("initiator", ["SecurityReview", "FinanceReview"], startContext);
var startResult = await engine.ExecuteAsync(start, state);
if (!startResult.IsSuccess || startResult.NewState == null)
{
Console.WriteLine("✗ Failed to start workflow.");
return;
}
PrintSideEffects("Start workflow", startResult.SideEffects);
state = startResult.NewState;
var rejectContext = MutationContext.User("security.lead", reason: "Reject risky request");
var reject = new RejectWorkflowMutation("security.lead", rejectContext);
var rejectResult = await engine.ExecuteAsync(reject, state);
if (!rejectResult.IsSuccess || rejectResult.NewState == null)
{
Console.WriteLine("✗ Failed to reject workflow.");
return;
}
PrintSideEffects("Reject workflow", rejectResult.SideEffects);
}
private static void PrintSideEffects(string operation, IReadOnlyList<SideEffect> sideEffects)
{
Console.WriteLine($"{operation} side effects:");
foreach (var effect in sideEffects)
{
Console.WriteLine(
$" {effect.Type} | severity={effect.Severity} | requiresAction={effect.RequiresAction}");
Console.WriteLine($" {effect.Description}");
var roundtrip = JsonSerializer.Deserialize<SideEffect>(JsonSerializer.Serialize(effect));
if (roundtrip?.TryGetData<WorkflowStartedSideEffectData>(out var started) == true)
{
Console.WriteLine(
$" contract={roundtrip.DataContractType}@v{roundtrip.DataContractVersion} | initiator={started!.Initiator} | workflowId={started.WorkflowId}");
continue;
}
if (roundtrip?.TryGetData<WorkflowRejectedSideEffectData>(out var rejected) == true)
{
Console.WriteLine(
$" contract={roundtrip.DataContractType}@v{roundtrip.DataContractVersion} | rejector={rejected!.Rejector} | state={rejected.State}");
continue;
}
if (roundtrip?.Data is not null)
{
Console.WriteLine($" data={roundtrip.Data}");
}
}
}
}