87 lines
3.4 KiB
C#
87 lines
3.4 KiB
C#
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<IFileActionService> _lcuServiceFactory;
|
|
|
|
public FileOperationsService(IQueueFileOperationsService queueFileOperationsService,
|
|
ApiConfiguration apiConfiguration,
|
|
ILcuServiceFactory<IFileActionService> 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;
|
|
}
|
|
} |