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