BrickPile.Core.DefaultBrickPileBootstrapper.OnPagePublish C# (CSharp) Method

OnPagePublish() private method

Called when [page publish].
private OnPagePublish ( string key, IPage currentPage, RavenJObject metadata ) : void
key string The key.
currentPage IPage The current page.
metadata RavenJObject The metadata.
return void
        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();
            }
        }