using System; using System.Threading.Tasks; using Newtonsoft.Json; using Serilog; using LCU.Library.Internal.ApiResponse.Services; using LCU.Library.Internal.Exceptions; using LCU.Library.Internal.FileOperationsModels.Models; using LCU.Library.Internal.LCUServiceFactory.Services; using LCU.Api.Internal.FileOperations.Services.QueueServices; using LCU.Api.Internal.FileOperations.Services.FileActionServices; using LCU.Api.Internal.FileOperations.Configurations; namespace LCU.Api.Internal.FileOperations.Services; public class FileOperationsService : IFileOperationsService { private readonly IQueueFileOperationsService _queueFileOperationsService; private readonly ApiConfiguration _apiConfiguration; private readonly ILcuServiceFactory _lcuServiceFactory; public FileOperationsService(IQueueFileOperationsService queueFileOperationsService, ApiConfiguration apiConfiguration, ILcuServiceFactory lcuServiceFactory) { _queueFileOperationsService = queueFileOperationsService; _apiConfiguration = apiConfiguration; _lcuServiceFactory = lcuServiceFactory; } public async Task HandleFileOperationsRequest(QueueRequest queueRequest) { var result = PerformFileOperation(queueRequest); if (ShouldPerformFileOperationsAgain(queueRequest, result)) { Log.Information($"Attempting to requeue file operations request. Request: {JsonConvert.SerializeObject(queueRequest)}"); queueRequest.Attempts++; await _queueFileOperationsService.QueueFileOperationsRequest(queueRequest); return; } await QueueReturnResponse.QueueResponse(queueRequest.ReturnResponse, result.IsSuccessful, result.MessageStack); if (!result.IsSuccessful) { var errorMessage = String.Join("; ", result.MessageStack.ToArray()); throw new ServiceException($"File Operation Request was not successful. MessageStack:{errorMessage}"); } } public RequestResponse PerformFileOperation(QueueRequest queueRequest) { var requestResponse = new RequestResponse(); try { ArgumentNullException.ThrowIfNull(queueRequest); var fileActionService = _lcuServiceFactory.GetService(queueRequest.FileOperationType); return fileActionService.ExecuteAction(queueRequest); } catch (Exception exception) { var failureMessage = $"Failed to perform file operations."; Log.Error(exception, failureMessage); var fileOperationType = queueRequest?.FileOperationType; if (fileOperationType == null) { requestResponse.MessageStack.Add($"{failureMessage}. FileOperationType is Null. " + $"ExceptionMessage: {exception.Message}"); return requestResponse; } requestResponse = RequestResponseHelper.ExceptionUpdateRequestResponse(requestResponse, queueRequest.FileOperationType, exception.Message); return requestResponse; } } public bool ShouldPerformFileOperationsAgain(QueueRequest request, RequestResponse requestResponse) { return !requestResponse.IsSuccessful && request.Attempts != null && request.Attempts < _apiConfiguration.AttemptsLimit; } }