using AsbCloudApp.Data; using AsbCloudInfrastructure.Background; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.SignalR; using System.Linq; using System.Threading; using System.Threading.Tasks; namespace AsbCloudWebApi.SignalR { // SignalR manual: // https://docs.microsoft.com/ru-ru/aspnet/core/signalr/introduction?view=aspnetcore-5.0 [Authorize] public class ReportsHub : BaseHub { private readonly BackgroundWorker backgroundWorker; public ReportsHub(BackgroundWorker backgroundWorker) { this.backgroundWorker = backgroundWorker; } public override async Task AddToGroup(string groupName) { await base.AddToGroup(groupName); var workId = groupName.Replace("Report_", ""); var work = backgroundWorker.WorkStore.RunOnceQueue.FirstOrDefault(work => work.Id == workId); var progress = new ReportProgressDto() { Operation = "Ожидает начала в очереди.", Progress = 0f, }; var state = work?.CurrentState; if (state is not null) { progress = new ReportProgressDto { Operation = state.State, Progress = (float)state.Progress, }; } await Clients.Group(groupName).SendAsync( nameof(IReportHubClient.GetReportProgress), progress, CancellationToken.None ); } } }