Example #1
0
        public IList <TagBE> GetTagsForPage(PageBE page)
        {
            // retrieve tags associated with a specified page id
            var tags = _session.Tags_GetByPageId(page.ID);

            // populate the defined to and related pages information
            var ids = new List <uint>();

            foreach (var tag in tags)
            {
                if (TagType.DEFINE == tag.Type)
                {
                    tag.DefinedTo = page;
                }
                ids.Add(tag.Id);
            }

            var relatedPageMap = ids.Count > 0 ? _session.Tags_GetRelatedPageIds(ids) : new Dictionary <uint, IEnumerable <ulong> >();
            var pageMap        = _session.Pages_GetByIds(relatedPageMap.SelectMany(x => x.Value).Distinct()).ToDictionary(x => x.ID);

            foreach (var tag in tags)
            {
                if ((TagType.DEFINE != tag.Type) && (TagType.TEXT != tag.Type))
                {
                    continue;
                }
                IEnumerable <ulong> relatedPageIds;
                relatedPageMap.TryGetValue(tag.Id, out relatedPageIds);
                if (null == relatedPageIds)
                {
                    continue;
                }
                var filtered     = PermissionsBL.FilterDisallowed(_user, relatedPageIds, false, Permissions.BROWSE);
                var relatedPages = (from pageId in filtered
                                    where pageMap.ContainsKey(pageId)
                                    select pageMap[pageId]).ToArray();
                if (TagType.DEFINE == tag.Type)
                {
                    tag.RelatedPages = relatedPages;
                }
                else if ((TagType.TEXT == tag.Type) && (0 < relatedPages.Length))
                {
                    tag.DefinedTo = relatedPages[0];
                }
            }
            return(tags);
        }