Last active
December 22, 2017 20:40
-
-
Save allenmichael/1a73d9b56132c3a3414433efedfdfb39 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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