using System.Collections.Generic; using System.Threading; using LCU.Api.Internal.Dispatcher.Configurations; using LCU.Api.Internal.MaidBotLib.Models; using LCU.Library.Internal.DispatcherModels.Models.Requests; using MassTransit; using Newtonsoft.Json; using ApiResponse = LCU.Library.Internal.ApiResponse.Models; namespace LCU.Api.Internal.Dispatcher.Services.QueueServices { public class QueueSendErroredJobAlertService : IQueueSendErroredJobAlertService { private readonly ISendEndpoint _sendEndpoint; private readonly ReceiveEndpointConfigurations _queueReceiveEndpointsConfiguration; public QueueSendErroredJobAlertService(IBusControl busControl, ReceiveEndpointConfigurations queueReceiveEndpointConfigurations) { _queueReceiveEndpointsConfiguration = queueReceiveEndpointConfigurations; _sendEndpoint = busControl.GetSendEndpoint(_queueReceiveEndpointsConfiguration.SendErroredJobAlertReceiveEndpoint.ReceiveEndpointUri).Result; } public async Task QueueSendErroredJobAlert(BatchedErroredJobAlertRequest request) { try { ArgumentNullException.ThrowIfNull(request); var cancellationTokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(30)); await _sendEndpoint.Send(request, cancellationTokenSource.Token); } catch (Exception exception) { var workItemIds = string.Join(",", request.ErroredJobAlertRequests .Where(x => x.CurrentWorkItem != null) .Select(x => x.CurrentWorkItem.WorkItemId)); Log.ForContext(Enum.GetName(typeof(PropertyEnum), PropertyEnum.Group), Enum.GetName(typeof(GroupEnum), GroupEnum.ITDevelopment)) .Fatal(exception, $"Failed to queue send errored job alert workitem requests. WorkItemIds: {workItemIds}"); throw new ServiceException($"Failed to queue send errored job alert workitem requests. WorkItemIds: {workItemIds}"); } } public async Task QueueSendErroredJobAlert(Job job, WorkItem workItem) { var request = new ErroredJobAlertRequest() { CurrentJob = job, CurrentWorkItem = workItem }; var requestList = new List() { request }; var batchedRequest = new BatchedErroredJobAlertRequest() { ErroredJobAlertRequests = requestList }; await QueueSendErroredJobAlert(batchedRequest); } } }