private async Task <IFolder> _GetWorkflowFolder(Workflow workflow, FolderType type, bool suppressLogging = false) { IFolder folder; string typeName = Enum.GetName(typeof(FolderType), type); if (type == FolderType.Archive) { IFolder sourceFolder = await _GetWorkflowFolder(workflow, FolderType.Source, true); folder = await sourceFolder.CreateOrGetFolder($"{_ArchiveFolderName}_{workflow.Id}"); } else if (type == FolderType.Failed) { IFolder sourceFolder = await _GetWorkflowFolder(workflow, FolderType.Source, true); folder = await sourceFolder.CreateOrGetFolder($"{_FailedFolderName}_{workflow.Id}"); } else if (type == FolderType.Staging) { IFolder sourceFolder = await _GetWorkflowFolder(workflow, FolderType.Source, true); folder = await sourceFolder.CreateOrGetFolder($"{_ProcessingFolderName}_{workflow.Id}"); } else if ((type == FolderType.Source && workflow.Direction == WorkflowDirection.Inbound) || (type == FolderType.Destination && workflow.Direction == WorkflowDirection.Outbound)) { Server server = workflow.Server; FtpClient ftpClient = new FtpClient(server.Host, server.Port, server.Username, server.Password); if (_log.IsEnabled(LogLevel.Trace)) { _log.LogTrace("Using {FtpUsername} / {FtpPassword} to connect to {FtpHost}:{FtpPort}.", server.Username, server.Password, server.Host, server.Port); } else { _log.LogDebug("Using {FtpUsername} to connect to {FtpHost}:{FtpPort}. Enable trace-level logging to see password.", server.Username, server.Host, server.Port); } folder = new FtpFolder(ftpClient, PathUtil.CombineFragments(server.Path, workflow.RemotePath)); } else { folder = new LocalFolder(workflow.LocalPath); } if (!suppressLogging) { _log.LogDebug(string.Concat(typeName, " Folder: {", typeName, "folderName}"), folder.FullName); } return(folder); }