internal void OnPagePublish(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.Replace("/draft", "")
};
}
else
{
TrieNode[] nodes = trie.RootNode.Flatten(n => n.Children).ToArray();
TrieNode parentNode = currentPage.Parent != null
? nodes.SingleOrDefault(n => n.PageId.CompareToIgnoreDraftId(currentPage.Parent.Id))
: null;
TrieNode currentNode = nodes.SingleOrDefault(n => n.PageId.CompareToIgnoreDraftId(key));
if (currentNode != null)
{
if (parentNode != null)
{
currentPage.Metadata.Slug = Slug.CreateSlug(currentPage);
currentPage.Metadata.Url = currentPage.Metadata.Slug.Insert(0,
VirtualPathUtility.AppendTrailingSlash(parentNode.Url ?? ""));
// the currentPage has been moved so we are moving the node and rewrites the url for all child pages and the current node
if (parentNode.ParentId != currentPage.Parent.Id)
{
trie.MoveTo(parentNode, currentNode);
IEnumerable<string> ids = currentNode.Flatten(x => x.Children).Select(x => x.PageId);
IPage[] pages = session.Load<IPage>(ids);
pages.ForEach(p => { p.Metadata.Url = trie.Get(p.Id).Url; });
}
currentNode.Url = currentPage.Metadata.Url;
}
}
else if (parentNode != null)
{
if (parentNode.Children.All(n => n.PageId != key.Replace("/draft", "")))
{
currentPage.Metadata.Slug = Slug.CreateSlug(currentPage);
currentPage.Metadata.Url = currentPage.Metadata.Slug.Insert(0,
VirtualPathUtility.AppendTrailingSlash(parentNode.Url ?? ""));
parentNode.Children.Add(new TrieNode
{
PageId = key.Replace("/draft", ""),
ParentId = parentNode.PageId,
Url = currentPage.Metadata.Url
});
}
}
}
// Clean up any existing draft for this page
if (session.Advanced.DocumentStore.Exists(key + "/draft"))
{
var draft = session.Load<IPage>(key + "/draft");
session.Delete(draft);
}
session.SaveChanges();
}
}