using System; using System.IO; using LCU.Api.Internal.FileOperations.Validations; using LCU.Library.Internal.FileOperationsModels.Enums; using LCU.Library.Internal.FileOperationsModels.Models; using LCU.Library.Internal.FileOperationsModels.Models.Requests; using LCU.Library.Internal.FileOperationsModels.Shared; using LCU.Library.Internal.LCUServiceFactory.Configurations; using Newtonsoft.Json; namespace LCU.Api.Internal.FileOperations.Services.FileActionServices; public class ValidateFileSizeInRangeService : FileActionService, IFileActionService, IActionService { private readonly IFileSizeService _fileSizeService; public ValidateFileSizeInRangeService(IFileSizeService fileSizeService, ServicesFactoryConfiguration servicesFactoryConfiguration) : base(servicesFactoryConfiguration) { _fileSizeService = fileSizeService; } public RequestResponse ExecuteAction(QueueRequest queueRequest) { var requestResponse = new RequestResponse(); try { var fileRequest = JsonConvert.DeserializeObject(queueRequest.Request); var requests = DynamicNameBuilder.BuildListOfRequests(fileRequest); requestResponse = FileValidation.ValidateIfAnyRequest(requests, fileRequest.FileSourceRequest.Source, requestResponse); foreach (var request in requests) { var temporaryRequestResponse = PerformRequest(request); if (temporaryRequestResponse.IsSuccessful) { continue; } requestResponse.MessageStack.AddRange(temporaryRequestResponse.MessageStack); requestResponse.IsSuccessful = false; } requestResponse.ReturnResponse = fileRequest; return requestResponse; } catch (Exception exception) { return RequestResponseHelper.ExceptionUpdateRequestResponse(requestResponse, queueRequest.FileOperationType, exception.Message); } } public RequestResponse PerformRequest(ValidateFileSizeInRangeRequest request) { var requestResponse = new RequestResponse(); return ValidateFileSizeInRange(request.FileSourceRequest.Source, request.StartFileSizeRange, request.EndFileSizeRange, request.FileSizeType, requestResponse); } public RequestResponse PreQueueValidation(ValidateFileSizeInRangeRequest originalRequest) { var requestResponse = new RequestResponse(); try { var requestList = DynamicNameBuilder.BuildListOfRequests(originalRequest); requestResponse = FileValidation.ValidateIfAnyRequest(requestList, originalRequest.FileSourceRequest.SourcePath, requestResponse); foreach (var request in requestList) { requestResponse = IsRequestValid(request, requestResponse); } return requestResponse; } catch (Exception exception) { requestResponse.IsSuccessful = false; requestResponse.MessageStack.Add(exception.Message); return requestResponse; } } public RequestResponse IsRequestValid(ValidateFileSizeInRangeRequest request, RequestResponse requestResponse) { requestResponse = FileValidation.ValidateFileExists(request.FileSourceRequest.Source, requestResponse); return requestResponse; } private RequestResponse ValidateFileSizeInRange(string path, decimal min, decimal max, FileSizeTypes fileSizeType, RequestResponse requestResponse) { decimal fileLengthInBytes = new FileInfo(path).Length; var fileLength = _fileSizeService.ConvertFileSize(fileLengthInBytes, fileSizeType); if (fileLength < min || fileLength > max) { requestResponse.IsSuccessful = false; requestResponse.MessageStack.Add($"File size is not in range at path {path}"); } return requestResponse; } }