using Newtonsoft.Json; using Serilog; using System.Linq; using System.Collections.Generic; using System; using WinSCP; using LCU.Api.Internal.FTPLib.Models; using LCU.Api.Internal.FTP.Helpers; namespace LCU.Api.Internal.FTP.Services.FtpOpertionServices; public class WinScpSftpUploadFileService : IWinScpSftpUploadFileService { IFileOperationsService _fileOperationsService; public WinScpSftpUploadFileService(IFileOperationsService fileOperationsService) { _fileOperationsService = fileOperationsService; } public FtpRequestResponse ExecuteAction(QueueRequest queueRequest) { var ftpRequestResponse = new FtpRequestResponse(); try { ArgumentNullException.ThrowIfNull(queueRequest); var request = JsonConvert.DeserializeObject(queueRequest.Request); ArgumentNullException.ThrowIfNull(request); ftpRequestResponse.ReturnResponse = request; ftpRequestResponse = TransferFiles(request, ftpRequestResponse); } catch (Exception exception) { ftpRequestResponse.IsSuccessful = false; ftpRequestResponse.MessageStack.Add(exception.Message); } return ftpRequestResponse; } private FtpRequestResponse TransferFiles(SftpUploadFileRequest winScpUploadFileRequest, FtpRequestResponse ftpRequestResponse) { try { var filesInDirectory = _fileOperationsService.GetListOfFilesInDirectory(winScpUploadFileRequest).Result; if (!filesInDirectory.Any()) { ftpRequestResponse.MessageStack.Add($"No files available to be uploaded. " + $"RegexFileName: {winScpUploadFileRequest.LocalFileName}. " + $"Succeed On Empty?: {winScpUploadFileRequest.SucceedOnEmpty}"); ftpRequestResponse.IsSuccessful = winScpUploadFileRequest.SucceedOnEmpty; return ftpRequestResponse; } var sessionOptions = WinScpSessionOptionsHelper.CreateSessionOptions(winScpUploadFileRequest.SessionInformation); WinScpFile(sessionOptions, winScpUploadFileRequest.FinalLocalFilePath, winScpUploadFileRequest.FinalRemoteFilePath, filesInDirectory, winScpUploadFileRequest.ResumeSupportStateOn); } catch (Exception exception) { ftpRequestResponse.MessageStack.Add($"Failed to upload file with WinSCP. " + $"Host: {winScpUploadFileRequest.SessionInformation.HostName}, " + $"File: {winScpUploadFileRequest.FinalLocalFilePath}" + $"ExceptionMessage: {exception.Message}"); ftpRequestResponse.IsSuccessful = false; } return ftpRequestResponse; } private void WinScpFile(SessionOptions sessionOptions, string filePath, string RemotePath, List localFileNames, bool supportStateOn) { using (var session = new Session()) { session.Open(sessionOptions); var transferOptions = new TransferOptions { TransferMode = TransferMode.Binary, PreserveTimestamp = false }; if(!supportStateOn) { transferOptions.ResumeSupport.State = TransferResumeSupportState.Off; } var addedSlash = filePath.EndsWith(@"\") ? "" : @"\"; foreach (string fileName in localFileNames) { var localfilePath = $"{filePath}{addedSlash}{fileName}"; var transferResult = session.PutFiles(localfilePath, RemotePath, false, transferOptions); transferResult.Check(); foreach (TransferEventArgs transfer in transferResult.Transfers) { Log.Debug($"Upload of {transfer.FileName} succeeded"); } } } } }