Skip to content

Instantly share code, notes, and snippets.

@allenmichael
Last active December 22, 2017 20:40
Show Gist options
  • Save allenmichael/1a73d9b56132c3a3414433efedfdfb39 to your computer and use it in GitHub Desktop.
Save allenmichael/1a73d9b56132c3a3414433efedfdfb39 to your computer and use it in GitHub Desktop.
public class BoxFolderTreeBuilder
{
public BoxClient BoxClient { get; set; }
public string RootFolderId { get; set; }
public int MaxDepth { get; set; }
public BoxFolderTreeBuilder(BoxClient boxClient, string rootFolderId = "0", int maxDepth = -1)
{
this.BoxClient = boxClient;
this.RootFolderId = rootFolderId;
this.MaxDepth = maxDepth;
}
public async Task<BoxFolderTree> BuildFlatLists()
{
var tree = new BoxFolderTree
{
RootId = this.RootFolderId,
Files = new List<BoxFolderTreeItem>(),
Folders = new List<BoxFolderTreeFolder>()
};
var rootFolderItems = await this.BoxClient.FoldersManager.GetFolderItemsAsync(this.RootFolderId, limit: 1000, autoPaginate: true);
var rootFolderChildren = new List<BoxFolderTreeFolder>();
foreach (var item in rootFolderItems.Entries)
{
var folderTreeItem = new BoxFolderTreeItem(item);
folderTreeItem.Path = $"{this.RootFolderId}";
if (item.Type == "file")
{
tree.Files.Add(folderTreeItem);
}
else if (item.Type == "folder")
{
var childFolder = new BoxFolderTreeFolder(folderTreeItem);
tree.Folders.Add(new BoxFolderTreeFolder(folderTreeItem));
rootFolderChildren.Add(childFolder);
}
}
tree = await Dive(tree, rootFolderChildren, 1);
return tree;
}
private async Task<BoxFolderTree> Dive(BoxFolderTree tree,
List<BoxFolderTreeFolder> children, int currentDepth)
{
if (InTooDeep(currentDepth))
{
return tree;
}
else
{
currentDepth++;
var additionalChildren = new List<BoxFolderTreeFolder>();
foreach (var child in children)
{
var folderItems = await this.BoxClient.FoldersManager.GetFolderItemsAsync(child.Item.Id, limit: 1000, autoPaginate: true);
var foundFolder = tree.Folders.FindIndex((f) =>
{
return f.Item.Id == child.Item.Id;
});
foreach (var item in folderItems.Entries)
{
if (foundFolder >= 0)
{
tree.Folders[foundFolder].Children.Add(item);
}
var folderTreeItem = new BoxFolderTreeItem(item);
folderTreeItem.Path = $"{child.Path}/{child.Item.Id}";
if (item.Type == "file")
{
tree.Files.Add(folderTreeItem);
}
else if (item.Type == "folder")
{
var childFolder = new BoxFolderTreeFolder(folderTreeItem);
tree.Folders.Add(new BoxFolderTreeFolder(folderTreeItem));
additionalChildren.Add(childFolder);
}
}
}
if (additionalChildren.Count == 0)
{
return tree;
}
else
{
return await Dive(tree, additionalChildren, currentDepth);
}
}
}
private bool InTooDeep(int depthCount)
{
if (this.MaxDepth < 0)
{
return false;
}
else
{
return (depthCount >= this.MaxDepth);
}
}
public class BoxFolderTreeItem
{
[JsonProperty(PropertyName = "item")]
public BoxItem Item { get; set; }
[JsonProperty(PropertyName = "path")]
public string Path { get; set; }
public BoxFolderTreeItem(BoxItem item)
{
Item = item;
}
}
public class BoxFolderTreeFolder : BoxFolderTreeItem
{
public BoxFolderTreeFolder(BoxFolderTreeItem item) : base(item.Item)
{
this.Path = item.Path;
}
[JsonProperty(PropertyName = "children")]
public List<BoxItem> Children { get; set; } = new List<BoxItem>();
}
public class BoxFolderTree
{
[JsonProperty(PropertyName = "rootId")]
public string RootId { get; set; }
[JsonProperty(PropertyName = "files")]
public List<BoxFolderTreeItem> Files { get; set; }
[JsonProperty(PropertyName = "folders")]
public List<BoxFolderTreeFolder> Folders { get; set; }
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment