Files
monorepo/LCU.API.Internal.FTP/LCU.Api.Internal.FTP/Services/FtpOpertionServices/WinScpSftpUploadFileService.cs
T
2026-03-24 15:28:37 -05:00

94 lines
3.9 KiB
C#

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<SftpUploadFileRequest>(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<string> 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");
}
}
}
}
}