public NodeEntity GetSubNode(NodeEntity parentFolder, string subFolderName, TypeEnum nodeType, out bool haveCreated, bool cached = true, string subFolderPassword = "******") { var key = $"{parentFolder.Key}.{subFolderName}"; haveCreated = false; if (cached && _cache.ContainsKey(key)) { ConsolePrinter.Write(ConsoleColor.Green, $"Loaded {nodeType} : {subFolderName} (cached)"); return(_cache[key]); } var subFolder = parentFolder.GetChildrenAsync(type: nodeType).Result?.FirstOrDefault(f => string.Equals(f.Name, subFolderName, StringComparison.CurrentCultureIgnoreCase)); if (subFolder != null) { subFolder.Key = key; if (!_cache.ContainsKey(key)) { _cache.Add(key, subFolder); } else { _cache[key] = subFolder; } ConsolePrinter.Write(ConsoleColor.Green, $"Loaded {nodeType} : {subFolderName}"); return(subFolder); } ConsolePrinter.Write(ConsoleColor.DarkYellow, $"Creating {nodeType} : {subFolderName}"); //we need to create it subFolder = new NodeEntity(_oauthToken) { Type = nodeType, Description = subFolderName, Name = subFolderName, UrlName = subFolderName, Keywords = new[] { subFolderName }, Parent = parentFolder, Privacy = subFolderPassword == "NONE" ? PrivacyEnum.Public : PrivacyEnum.Unlisted, SecurityType = subFolderPassword == "NONE" ? SecurityTypeEnum.None : SecurityTypeEnum.Password, Password = subFolderPassword == "NONE" ? null : subFolderPassword, PasswordHint = subFolderPassword == "NONE" ? null : "It's on your sales reciept", Key = key }; subFolder.CreateAsync(parentFolder).Wait(); haveCreated = true; //Read it back in so we got all properties subFolder = parentFolder.GetChildrenAsync(type: nodeType).Result?.FirstOrDefault(f => string.Equals(f.Name, subFolderName, StringComparison.CurrentCultureIgnoreCase)); subFolder.Key = key; _cache.Add(key, subFolder); return(subFolder); }