using System; using System.Threading.Tasks; using System.Threading; using Newtonsoft.Json; using Serilog; using MassTransit; using LCU.Library.Internal.LcuMassTransitModels; using LCU.Library.Internal.Exceptions; using LCU.Library.Internal.FileOperationsModels.Models; using LCU.Library.Internal.ApiResponse.Models; namespace LCU.Api.Internal.FileOperations.Services.QueueServices; public class QueueFileOperationsService : IQueueFileOperationsService { private readonly ISendEndpoint _sendEndpoint; private readonly ReceiveEndpointConfiguration _receiveEndpointConfiguration; public QueueFileOperationsService(IBusControl busControl, ReceiveEndpointConfiguration receiveEndpointConfiguration) { _receiveEndpointConfiguration = receiveEndpointConfiguration; _sendEndpoint = busControl.GetSendEndpoint(_receiveEndpointConfiguration.ReceiveEndpointUri).Result; } public async Task QueueFileOperations(TRequest originalRequest, FileOperationType operationType) where TRequest : ReturnResponse { try { QueueRequest queueRequest = new QueueRequest() { ReturnResponse = originalRequest, FileOperationType = operationType, Request = JsonConvert.SerializeObject(originalRequest), Attempts = 0, QueueTimeStamp = DateTime.Now }; await QueueFileOperationsRequest(queueRequest); } catch (Exception ex) { Log.Error(ex, $"Failed to Queue File Operations. FileOperationType: {operationType.ToString()}"); throw new ServiceException($"Failed to Queue File Operation Request. FileOperationType: {operationType.ToString()}"); } } public async Task QueueFileOperationsRequest(QueueRequest queueRequest) { try { var cancellationTokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(30)); await _sendEndpoint.Send(queueRequest, cancellationTokenSource.Token); } catch (TaskCanceledException exception) { Log.Error(exception, $"Failed to Queue File Operation Request. FileOperationType: {queueRequest.FileOperationType}"); throw new ServiceException(exception.Message); } catch (Exception exception) { Log.Error(exception, $"Failed to Queue File Operation Request. FileOperationType: {queueRequest.FileOperationType}"); throw new ServiceException($"Failed to Queue File Operation Request. FileOperationType: {queueRequest.FileOperationType}"); } } }