using FrameworkBLL.DataSync; using Microsoft.AspNetCore.SignalR; namespace FrameworkSL.Hubs.DataSync { /// /// Adapts IDataSyncHubContext (BLL interface) to the strongly-typed IHubContext. /// Registered as Scoped in Program.cs so SignalR infrastructure is injected correctly. /// public class DataSyncHubContext : IDataSyncHubContext { private readonly IHubContext _hub; public DataSyncHubContext(IHubContext hub) { _hub = hub; } public async Task PushProgressAsync(int runId, string tableName, int chunkNumber, int rowsInChunk, int totalRowsSoFar, CancellationToken ct) { var group = DataSyncHub.RunGroup(runId); await _hub.Clients.Group(group).ReceiveProgress(new SyncProgressDTO( RunId: runId, TableName: tableName, ChunkNumber: chunkNumber, RowsInChunk: rowsInChunk, TotalRowsSoFar: totalRowsSoFar, Status: "Running")).ConfigureAwait(false); } public async Task PushRunCompletedAsync(int runId, int syncJobId, byte status, int totalRows, int insertedRows, int updatedRows, int deletedRows, int skippedRows, string? errorDetail, DateTime startedAt, CancellationToken ct) { var group = DataSyncHub.RunGroup(runId); await _hub.Clients.Group(group).ReceiveRunCompleted(new SyncRunSummaryDTO( RunId: runId, SyncJobId: syncJobId, Status: status, TotalRows: totalRows, InsertedRows: insertedRows, UpdatedRows: updatedRows, DeletedRows: deletedRows, SkippedRows: skippedRows, ErrorDetail: errorDetail, StartedAt: startedAt, EndedAt: DateTime.UtcNow)).ConfigureAwait(false); } public async Task PushErrorAsync(int runId, string message, CancellationToken ct) { var group = DataSyncHub.RunGroup(runId); await _hub.Clients.Group(group).ReceiveError(runId, message).ConfigureAwait(false); } } }