using IceImportDAL.DTO.IceImportPipeline; namespace IceImportBLL.IceImportRunNotifier; // Abstraction over the SignalR hub push (IceImportRunHub lives in IceImportSL — BLL must stay free // of ASP.NET/SignalR types per CLAUDE.md). Concrete implementation: // IceImportSL/Implementations/IceImportRunNotifier.cs, wrapping // IHubContext. Registered as a singleton in // IceImportModule.Register() — mirrors AutomationBLL.Run.IAutomationRunNotifier / // AutomationSL.Hubs.AutomationRunNotifier exactly. // // Every method must never throw — a push failure is non-fatal to the underlying run; implementations // log and swallow (same contract as IAutomationRunNotifier's doc comment). public interface IIceImportRunNotifier { Task NotifyProgressAsync(long runId, string stage, int processedRows, int totalRows, CancellationToken ct = default); Task NotifyRowErrorAsync(long runId, IceImportFieldErrorDTO error, CancellationToken ct = default); Task NotifyLogAppendedAsync(long runId, string logLevel, string message, CancellationToken ct = default); Task NotifyCompletedAsync( long runId, string status, int rowTotalCount, int successCount, int failedCount, string? errorMessage, CancellationToken ct = default); }