using System; using System.Collections.Generic; using System.IO.Compression; using Newtonsoft.Json; using LCU.Library.Internal.FileOperationsModels.Models; using LCU.Library.Internal.FileOperationsModels.Shared; using LCU.Api.Internal.FileOperations.Validations; using LCU.Library.Internal.LCUServiceFactory.Configurations; namespace LCU.Api.Internal.FileOperations.Services.FileActionServices; public class ZipDirectoryService : FileActionService, IFileActionService, IActionService { public ZipDirectoryService(ServicesFactoryConfiguration servicesFactoryConfiguration) : base(servicesFactoryConfiguration) { } public RequestResponse ExecuteAction(QueueRequest queueRequest) { var requestResponse = new RequestResponse(); try { var zipRequest = JsonConvert.DeserializeObject(queueRequest.Request); var requests = BuildDirectoryList(zipRequest); requestResponse = FileValidation.ValidateIfAnyRequest(requests, zipRequest.SourceDirectory, requestResponse); var result = requestResponse.IsSuccessful; foreach (var request in requests) { var temporaryRequestResponse = PerformRequest(request); if (!temporaryRequestResponse.IsSuccessful) { requestResponse.IsSuccessful = temporaryRequestResponse.IsSuccessful; requestResponse.MessageStack.AddRange(temporaryRequestResponse.MessageStack); } } requestResponse.ReturnResponse = zipRequest; return requestResponse; } catch (Exception exception) { return RequestResponseHelper.ExceptionUpdateRequestResponse(requestResponse, queueRequest.FileOperationType, exception.Message); } } public RequestResponse PerformRequest(ZipDirectoryRequest request) { return OperationService.PerformOperation(request, IsRequestValid, ZipDirectory); } private void ZipDirectory(ZipDirectoryRequest request) { try { ZipFile.CreateFromDirectory(request.SourceDirectory, request.ZipDestination); } catch (Exception exception) { throw new Exception($"Exception thrown while trying to ExecuteRequestAction. " + $"Request: {JsonConvert.SerializeObject(request)}" + $"ExceptionMessage: {exception.Message}"); } } public RequestResponse PreQueueValidation(ZipDirectoryRequest originalRequest) { var requestResponse = new RequestResponse(); var requestList = BuildDirectoryList(originalRequest); requestResponse = FileValidation.ValidateIfAnyRequest(requestList, originalRequest.FormattedSourceDirectory, requestResponse); foreach (var request in requestList) { requestResponse = IsRequestValid(request, requestResponse); } return requestResponse; } public List BuildDirectoryList(ZipDirectoryRequest originalRequest) { var nameList = RegexNameHandler.BuildDirectoryList(originalRequest.SourceDirectory, originalRequest.DynamicDirectoryName, originalRequest.FileNameSetting); var requests = new List(); foreach (var name in nameList) { var newRequest = Clone.DeepClone(originalRequest); newRequest.DirectoryName = name; newRequest.SourceDirectory = String.IsNullOrWhiteSpace(newRequest.DirectoryName) ? originalRequest.SourceDirectory : $"{originalRequest.FormattedSourceDirectory}{newRequest.DirectoryName}"; requests.Add(newRequest); } return requests; } public RequestResponse IsRequestValid(ZipDirectoryRequest fileRequest, RequestResponse requestResponse) { requestResponse = DirectoryValidation.ValidateDirectoryExists(fileRequest.SourceDirectory, requestResponse); requestResponse = DirectoryValidation.ValidateDirectoryExists(fileRequest.ZipPath, requestResponse); requestResponse = FileValidation.ValidateFileNotExists(fileRequest.ZipDestination, requestResponse); return requestResponse; } }