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; }
}
}