internal void OnPageSave(string key, IPage currentPage, RavenJObject metadata)
{
using (IDocumentSession session = DocumentStore.OpenSession())
{
var trie = session.Load<Trie>(TrieId);
if (trie.RootNode == null)
{
trie.RootNode = new TrieNode
{
PageId = key
};
}
else
{
TrieNode[] nodes = trie.RootNode.Flatten(n => n.Children).ToArray();
TrieNode parent = currentPage.Parent != null
? nodes.SingleOrDefault(
n =>
String.Equals(n.PageId, currentPage.Parent.Id, StringComparison.CurrentCultureIgnoreCase))
: null;
if (parent != null)
{
currentPage.Metadata.Slug = Slug.CreateSlug(currentPage);
currentPage.Metadata.Url = currentPage.Metadata.Slug.Insert(0,
VirtualPathUtility.AppendTrailingSlash(parent.Url ?? ""));
if (parent.Children.All(n => n.PageId != key.Replace("/draft", "")))
{
parent.Children.Add(new TrieNode
{
PageId = key.Replace("/draft", ""),
ParentId = parent.PageId,
Url = currentPage.Metadata.Url
});
}
}
}
session.SaveChanges();
}
}