using System; namespace GB5Shared.DTO.GOP { // ───────────────────────────────────────────────────────────── // DTOs pushed via GopExecutionHub to connected SignalR clients. // Defined in GB5Shared so both BLL (IGopHubNotifier) and SL // (GopExecutionHub) can reference them without a circular // dependency between FrameworkBLL and FrameworkSL. // ───────────────────────────────────────────────────────────── /// /// Lightweight execution status projection pushed after each /// pipeline step. The UI uses this to update the live status /// panel without polling. Full detail is loaded on demand via /// GET /GOP/GetGopExecutionDetail. /// public sealed class GopExecutionStatusDTO { public int ExecutionId { get; init; } public string FlowCode { get; init; } = string.Empty; public string SnapshotVersion { get; init; } = string.Empty; /// Created | Running | Success | Failed public string Status { get; init; } = string.Empty; public string? CurrentNodeCode { get; init; } public long? TotalDurationMs { get; init; } public DateTime StartedAt { get; init; } public string? ErrorMessage { get; init; } /// Set when Status='PendingApproval' — who the paused step is assigned to. public string? AssignedRole { get; init; } public int? AssignedToUserId { get; init; } } /// /// Pushed when a new dead-letter entry is created for this /// tenant, allowing the UI DLQ badge to update without polling. /// public sealed class GopDLQSummaryDTO { public int DlqId { get; init; } public int ExecutionId { get; init; } public string FlowCode { get; init; } = string.Empty; public string NodeCode { get; init; } = string.Empty; public string ErrorMessage { get; init; } = string.Empty; public DateTime MovedAt { get; init; } } }