using GB5Shared.DTO.Framework.Login; using GB5Shared.QueueReader; using GB5Shared.Telemetry; using MMDAL.DTO.Scheduling; using Microsoft.Extensions.Logging; using System.Text.Json; namespace MMSL.Services.Handlers; // Processes a SCHEDULINGRUN queue message by running the full scheduling engine pipeline. // Payload must be a JSON-serialized SchedulingRunTriggerDTO. public sealed class SchedulingRunQueueHandler : IJobQueueHandler { public string MessageType => "SCHEDULINGRUN"; private readonly SchedulingRunProcessingService _processor; private readonly ILogger _logger; public SchedulingRunQueueHandler(SchedulingRunProcessingService processor, ILogger logger) { _processor = processor; _logger = logger; } public async Task HandleAsync(string payload, LoginDTO login, long queueId, CancellationToken ct) { GB5Trace.Step("schedulingrun-queue-process", new { TenantId = login.ClientId }); SchedulingRunTriggerDTO? trigger; try { trigger = JsonSerializer.Deserialize(payload, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); } catch (Exception ex) { _logger.LogError(ex, "SchedulingRunQueueHandler: failed to deserialize payload | TenantId={TenantId}", login.ClientId); throw; } if (trigger is null) throw new InvalidOperationException("SchedulingRunQueueHandler: payload deserialized to null"); _logger.LogInformation( "SchedulingRunQueueHandler: starting scheduling run WorkOUId={WorkOUId} for tenant {TenantId}", trigger.WorkOUId, login.ClientId); await _processor.ProcessAsyncWithLogin(trigger, login, ct).ConfigureAwait(false); } }