using System; using System.Threading; using System.Threading.Tasks; using FrameworkBLL.SchedulerTaskGenerator; using GB5Shared.DTO.JobEngine; using Microsoft.AspNetCore.SignalR; using Microsoft.Extensions.Logging; namespace FrameworkSL.Hubs.JobEngine { // ============================================================ // JobEngineHubNotifier — SL implementation of IJobEngineHubNotifier. // Wraps IHubContext so FrameworkBLL // (the Quartz executor and ActionProcessorWorker) can push real-time // status updates without referencing any ASP.NET types directly. // Mirrors FrameworkSL/Hubs/GOP/GopHubNotifier.cs. // // Registration: // services.AddSingleton(); // (Singleton is safe: IHubContext is registered as Singleton and is thread-safe.) // ============================================================ public class JobEngineHubNotifier : IJobEngineHubNotifier { private readonly IHubContext _HubContext; private readonly ILogger _Logger; public JobEngineHubNotifier( IHubContext hubContext, ILogger logger) { _HubContext = hubContext; _Logger = logger; } public async Task PushJobStarted(int tenantId, JobStartedDTO status, CancellationToken ct = default) { try { await _HubContext.Clients .Group(JobEngineHub.TenantGroup(tenantId)) .ReceiveJobStarted(status); } catch (Exception ex) { _Logger.LogWarning(ex, "JobEngineHubNotifier: failed to push JobStarted for JobExecutionId={JobExecutionId}", status.JobExecutionId); } } public async Task PushJobDispatched(int tenantId, JobDispatchedDTO status, CancellationToken ct = default) { try { await _HubContext.Clients .Group(JobEngineHub.TenantGroup(tenantId)) .ReceiveJobDispatched(status); } catch (Exception ex) { _Logger.LogWarning(ex, "JobEngineHubNotifier: failed to push JobDispatched for JobExecutionId={JobExecutionId}", status.JobExecutionId); } } public async Task PushJobCompleted(int tenantId, JobCompletedDTO status, CancellationToken ct = default) { try { await _HubContext.Clients .Group(JobEngineHub.TenantGroup(tenantId)) .ReceiveJobCompleted(status); } catch (Exception ex) { _Logger.LogWarning(ex, "JobEngineHubNotifier: failed to push JobCompleted for JobExecutionId={JobExecutionId}", status.JobExecutionId); } } public async Task PushJobFailed(int tenantId, JobFailedDTO status, CancellationToken ct = default) { try { await _HubContext.Clients .Group(JobEngineHub.TenantGroup(tenantId)) .ReceiveJobFailed(status); } catch (Exception ex) { _Logger.LogWarning(ex, "JobEngineHubNotifier: failed to push JobFailed for JobExecutionId={JobExecutionId}", status.JobExecutionId); } } } }