diff --git a/src/PollinationSDK.Tests/Api/UtilityTests.cs b/src/PollinationSDK.Tests/Api/UtilityTests.cs index e159ef27..04b3ef88 100644 --- a/src/PollinationSDK.Tests/Api/UtilityTests.cs +++ b/src/PollinationSDK.Tests/Api/UtilityTests.cs @@ -28,7 +28,22 @@ public void TestGetLatestVersion() Assert.IsTrue(version != null); } - + [Test] + public void TestDownloadFolder() + { + var api = new ArtifactsApi(); + // var relativeFolderPath = new List { "testSubDir" }; + var relativeFolderPath = null; + var projOwner = "ladybug-tools"; + var projName = "demo-project"; + + + var pathes = Helper.DownloadArtifactFolderAsync(api, projOwner, projName, relativeFolderPath, "").GetAwaiter().GetResult(); + Assert.IsTrue(pathes != null); + Assert.IsTrue(pathes.Count() > 20); + } + + //[Test] //public void DownloadRecipeTest() diff --git a/src/PollinationSDK/Helper/Helper.cs b/src/PollinationSDK/Helper/Helper.cs index bededa3e..48e9f807 100644 --- a/src/PollinationSDK/Helper/Helper.cs +++ b/src/PollinationSDK/Helper/Helper.cs @@ -294,16 +294,26 @@ public static async Task> DownloadAssetsAsync(string p var projOwner = proj[0]; var projName = proj[1]; + // check folder assets + var gp = assets.GroupBy(_ => Path.HasExtension(_.RelativePath)); + var fileAssets = gp.FirstOrDefault(_ => _.Key == true)?.Select(_ => _)?.ToList() ?? new List(); + var folderAssets = gp.FirstOrDefault(_ => _.Key == false)?.Select(_ => _.RelativePath)?.ToList(); + if (folderAssets != null && folderAssets.Any()) + { + var allFiles = await GetAllFilesAsync(api, projOwner, projName, folderAssets, saveAsDir); + var cloudRefs = allFiles.Select(_ => new CloudReferenceAsset(projOwner, projName, _.Key)); + fileAssets.AddRange(cloudRefs); + } // check if cached if (useCached) { - assets = CheckCached(assets, dir).ToList(); + fileAssets = CheckCached(fileAssets, dir).ToList(); } - var total = assets.Count(); + var total = fileAssets.Count(); var completed = 0; - foreach (var asset in assets) + foreach (var asset in fileAssets) { try { @@ -344,6 +354,32 @@ public static async Task> DownloadAssetsAsync(string p } + /// + /// List all FileMeta from all sub-folders if exists + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static async Task> GetAllFilesAsync(ArtifactsApi api, string projOwner, string projName, List relativeFolderPaths, string saveAsDir) + { + var fs = api.ListArtifacts(projOwner, projName, relativeFolderPaths, null, 500).Resources; + var gp = fs.GroupBy(_ => _.FileType == "folder"); + var files = gp.FirstOrDefault(_ => _.Key == false)?.Select(_ => _)?.ToList() ?? new List(); + var folders = gp.FirstOrDefault(_=>_.Key == true)?.Select(_ => _.Key)?.ToList() ?? new List(); + if (folders.Any()) + { + var subItems = await GetAllFilesAsync(api, projOwner, projName, folders, saveAsDir); + files.AddRange(subItems); + } + return files; + + } + /// ///