using Newtonsoft.Json; using Serilog; using System; using System.Collections.Generic; using System.Net.Http; using System.Text; using System.Threading.Tasks; using LCU.Library.Internal.FileOperationsModels.Models; using LCU.Api.Internal.FTP.Configuration; using LCU.Api.Internal.FTPLib.Models; using LCU.Library.Internal.Exceptions; using System.Linq; namespace LCU.Api.Internal.FTP.Services.FtpOpertionServices; public class FileOperationsService : IFileOperationsService { private readonly IHttpClientFactory _httpFactory; private readonly FtpApiConfiguration _ftpApiConfiguration; public FileOperationsService(IHttpClientFactory httpFactory, FtpApiConfiguration ftpApiConfiguration) { _httpFactory = httpFactory; _ftpApiConfiguration = ftpApiConfiguration; } public async Task> GetListOfFilesInDirectory(SftpUploadFileRequest uploadRequest) { List files = new List(); try { var shouldBuildDynamicFileRequest = uploadRequest?.DynamicNameSetting?.RegexSettings != null && uploadRequest.DynamicNameSetting.RegexSettings.Any(); if (shouldBuildDynamicFileRequest) { files = await BuildDynamicFileRequest(uploadRequest); } else { files = await ValidateFileExists(uploadRequest); } } catch (Exception ex) { Log.Error(ex, "Error Generating File List"); } return files; } public async Task> BuildDynamicFileRequest(SftpUploadFileRequest uploadRequest) { List files = new List(); try { var dynamicFileRequest = new DynamicFileListRequest() { Filename = uploadRequest.FinalLocalFileName, DynamicFileSettings = uploadRequest.DynamicNameSetting, Path = uploadRequest.FinalLocalFilePath.EndsWith("\\") ? uploadRequest.FinalLocalFilePath : $"{uploadRequest.FinalLocalFilePath}\\" }; var encodedContent = JsonConvert.SerializeObject(dynamicFileRequest); var content = new StringContent(encodedContent, Encoding.UTF8, "application/json"); var client = _httpFactory.CreateClient(); HttpResponseMessage response = await client.PostAsync(_ftpApiConfiguration.Apis.FileOperationApi.BuildDynamicFileRequest, content); if (!response.IsSuccessStatusCode) { throw new ServiceException($"StatusCode:{response.StatusCode}, " + $"Content: {response.Content.ReadAsStringAsync().Result}"); } var jsonString = await response.Content.ReadAsStringAsync(); files = JsonConvert.DeserializeObject>(jsonString); } catch (Exception ex) { Log.Error(ex, "Error Building Dynamic File List"); } return files; } public async Task> ValidateFileExists(SftpUploadFileRequest uploadRequest) { List files = new List(); try { var path = uploadRequest.FinalLocalFilePath.EndsWith("\\") ? uploadRequest.FinalLocalFilePath : $"{uploadRequest.FinalLocalFilePath}\\"; var finalFilePath = $"{path}{uploadRequest.FinalLocalFileName}"; var encodedContent = JsonConvert.SerializeObject(finalFilePath); var content = new StringContent(encodedContent, Encoding.UTF8, "application/json"); var client = _httpFactory.CreateClient(); HttpResponseMessage response = await client.PostAsync(_ftpApiConfiguration.Apis.FileOperationApi.ValidateFileExists, content); if (!response.IsSuccessStatusCode) { throw new ServiceException($"StatusCode:{response.StatusCode}, " + $"Content: {response.Content.ReadAsStringAsync().Result}"); } var jsonString = await response.Content.ReadAsStringAsync(); var result = JsonConvert.DeserializeObject(jsonString); if (result) { files.Add(uploadRequest.FinalLocalFileName); } } catch (Exception ex) { Log.Error(ex, "Error Validating if File Exist"); } return files; } }