c41e5063b7
Removed entire kbx-foundation-v36 directory as it's been replaced by the new KBX Foundation v4 patterns implemented in this session: - Registry-driven screen definitions - Density-aware UI adapter components - Feature module templates (ShadowRun, Models) Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
17 lines
955 B
C#
17 lines
955 B
C#
|
|
namespace KBX.Shared.Workflow;
|
|
|
|
public sealed record WorkflowTransition(string Id, IReadOnlySet<string> From, string To, string? Permission = null, bool ReasonRequired = false);
|
|
|
|
public static class WorkflowGuard
|
|
{
|
|
public static WorkflowTransition RequireTransition(IEnumerable<WorkflowTransition> transitions, string transitionId, string currentState, string? reason = null)
|
|
{
|
|
var transition = transitions.FirstOrDefault(x => string.Equals(x.Id, transitionId, StringComparison.OrdinalIgnoreCase))
|
|
?? throw new InvalidOperationException($"Unknown transition: {transitionId}");
|
|
if (!transition.From.Contains(currentState)) throw new InvalidOperationException($"Transition {transitionId} is not allowed from {currentState}.");
|
|
if (transition.ReasonRequired && string.IsNullOrWhiteSpace(reason)) throw new InvalidOperationException("A reason is required for this transition.");
|
|
return transition;
|
|
}
|
|
}
|