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