using System.Collections.Generic; using System.Data.Common; using System.Threading.Tasks; using GB5Shared.DTO.Framework.Login; using GB5Shared.DTO.GOP; namespace FrameworkDAL.CustomCode.GOP { public interface IGopQueueDAL { // Queue + Header (atomic, returns both IDs) Task<(int QueueId, int ExecutionId)> SubmitToQueue( GopExecutionQueueDTO QueueDTO, GopExecutionHeaderDTO HeaderDTO, LoginDTO LoginDTO); // Queue status Task UpdateQueueStatus(int ClientId, int QueueId, string Status, string? ErrorMessage, LoginDTO LoginDTO); // Execution header Task UpdateExecutionStatus(int ClientId, int ExecutionId, string Status, string? ErrorMessage, long? TotalDurationMs, LoginDTO LoginDTO, string? LastOutputPayloadJson = null); Task UpdateExecutionCurrentNode(int ClientId, int ExecutionId, int NodeId, string NodeCode, LoginDTO LoginDTO); /// Pauses an execution at an Approval-gate node — Status becomes 'PendingApproval'. Task UpdateExecutionApprovalPending(int ClientId, int ExecutionId, int NodeId, string NodeCode, string? LastOutputPayloadJson, string? AssignedRole, int? AssignedToUserId, LoginDTO LoginDTO); /// Resumes a 'PendingApproval' execution by setting Status back to 'Queued' so the worker re-picks it up. Task ResumeExecutionAfterApproval(int ClientId, int ExecutionId, LoginDTO LoginDTO); Task GetExecutionById(int ClientId, int ExecutionId, LoginDTO LoginDTO); Task> GetExecutionsByStatus(int ClientId, string? Status, int Page, int PageSize, LoginDTO LoginDTO); // Node logs Task InsertNodeLog(GopExecutionNodeLogDTO NodeLogDTO, LoginDTO LoginDTO); Task UpdateNodeLog(int ClientId, int NodeLogId, string Status, string? ResponsePayload, int? HttpStatusCode, long DurationMs, string? ErrorCode, string? ErrorMessage, LoginDTO LoginDTO); Task> GetNodeLogsByExecution(int ClientId, int ExecutionId, LoginDTO LoginDTO); // State log Task InsertStateLog(int ClientId, int ExecutionId, string? PreviousStatus, string NewStatus, string? ReasonCode, string ChangedBy, LoginDTO LoginDTO); Task> GetStateLogsByExecution(int ClientId, int ExecutionId, LoginDTO LoginDTO); // Metrics Task InsertExecutionMetrics(GopExecutionMetricsDTO MetricsDTO, LoginDTO LoginDTO); Task InsertNodeMetrics(GopExecutionNodeMetricsDTO NodeMetricsDTO, LoginDTO LoginDTO); // Dead letter Task InsertDeadLetter(GopDeadLetterDTO DlqDTO, LoginDTO LoginDTO); Task> GetDeadLetters(int ClientId, LoginDTO LoginDTO); Task ResolveDeadLetter(int ClientId, int DlqId, string ResolvedBy, LoginDTO LoginDTO); // Remediation Task InsertRemediation(GopRemediationDTO RemediationDTO, LoginDTO LoginDTO); Task UpdateRemediation(int ClientId, int RemediationId, string Status, string ResolutionNotes, string ResolvedBy, LoginDTO LoginDTO); Task> GetOpenRemediations(int ClientId, LoginDTO LoginDTO); // Lock Task AcquireLock(int ClientId, int ExecutionId, string LockedBy, int LockDurationSeconds, LoginDTO LoginDTO); Task ReleaseLock(int ClientId, int ExecutionId, LoginDTO LoginDTO); // Worker polling Task> GetPendingExecutions(int limit, LoginDTO loginDTO); Task ResetExpiredLocks(LoginDTO loginDTO); // Dashboard Task> GetQueueDashboard(int ClientId, LoginDTO LoginDTO); // Source file Task InsertSourceFile(GopSourceFileDTO FileDTO, LoginDTO LoginDTO); Task UpdateSourceFileStatus(int ClientId, int FileId, string Status, int? QueueId, LoginDTO LoginDTO); } }