Example #1
0
        public ActionResult Item(SyndicationFeedPageType currentPage, int?contentId)
        {
            if (!contentId.HasValue)
            {
                return(HttpNotFound("No content Id specified"));
            }

            var contentReference = ContentReference.Parse(contentId.Value.ToString());
            var feedContext      = new SyndicationFeedContext(currentPage);

            var referencedContent = FeedContentResolver.GetContentReferences(feedContext);

            if (!referencedContent.Contains(contentReference))
            {
                return(HttpNotFound("Content Id not exposed in this feed"));
            }

            var contentArea = new ContentArea();
            var item        = new ContentAreaItem {
                ContentLink = contentReference
            };

            contentArea.Items.Add(item);

            var contentItem = ContentLoader.Get <IContent>(contentReference);

            var model = new ContentHolderModel {
                Tag = currentPage.BlockRenderingTag, ContentArea = contentArea, Content = contentItem
            };

            return(View("~/modules/Chief2moro.SyndicationFeeds/Views/Item.cshtml", model));
        }
Example #2
0
        /// <summary>
        /// Gets the content items that are referenced in the passed SyndicationFeedPage.
        /// </summary>
        /// <param name="currentPage">The current page.</param>
        /// <returns></returns>
        public IEnumerable <ContentReference> GetContentReferences(SyndicationFeedContext feedContext)
        {
            var feedPage = feedContext.FeedPageType;

            var dependentContentItems = new List <ContentReference>();

            if (!ContentReference.IsNullOrEmpty(feedPage.PageFolder))
            {
                dependentContentItems.AddRange(GetDescendentsOfType <PageData>(feedPage.PageFolder));
            }

            if (!ContentReference.IsNullOrEmpty(feedPage.BlockFolder))
            {
                dependentContentItems.AddRange(GetDescendentsOfType <BlockData>(feedPage.BlockFolder));
            }

            if (!ContentReference.IsNullOrEmpty(feedPage.MediaFolder))
            {
                dependentContentItems.AddRange(GetDescendentsOfType <MediaData>(feedPage.MediaFolder));
            }

            if (feedPage.ContentItems == null)
            {
                return(dependentContentItems);
            }

            var itemsInContentArea = feedPage.ContentItems.Items.Select(contentItem => contentItem.ContentLink);

            dependentContentItems.AddRange(itemsInContentArea);

            return(dependentContentItems.Distinct());
        }
Example #3
0
 public SyndicationItemFactory(IContentLoader contentLoader, IFeedContentResolver feedContentResolver,
                               IFeedContentFilterer feedFilterer, IItemDescriptionProvider itemDescriptionProvider,
                               IItemModifier itemModifier, SyndicationFeedContext feedContext)
 {
     ContentLoader           = contentLoader;
     FeedContentResolver     = feedContentResolver ?? new FeedContentResolver(ContentLoader);
     FeedFilterer            = feedFilterer ?? new FeedContentFilterer();
     ItemDescriptionProvider = itemDescriptionProvider ?? new ItemDescriptionProvider();
     ItemModifier            = itemModifier ?? new ItemNullModifier();
     FeedContext             = feedContext;
 }
Example #4
0
        public ActionResult Index(SyndicationFeedPageType currentPage, string categories)
        {
            var parsedCategories = ParseCategories(categories);
            var feedContext      = new SyndicationFeedContext(currentPage, parsedCategories.ToList());

            var siteUrl    = SiteDefinition.Current.SiteUrl.ToString().TrimEnd('/');
            var currentUri = new Uri(siteUrl + UrlResolver.Current.GetUrl(currentPage.ContentLink));

            var syndicationFactory = new SyndicationItemFactory(ContentLoader, FeedContentResolver, FeedFilterer, ItemDescriptionProvider, ItemModifier, feedContext);

            var items = GetFromCacheOrFactory(syndicationFactory, currentPage, parsedCategories);

            var feed = new SyndicationFeed
            {
                Items       = items,
                Id          = siteUrl + UrlResolver.Current.GetUrl(ContentReference.StartPage),
                Title       = new TextSyndicationContent(currentPage.PageName),
                Description = new TextSyndicationContent(currentPage.Description),
                Language    = currentPage.LanguageBranch,
                Generator   = "http://nuget.episerver.com/en/OtherPages/Package/?packageId=Chief2moro.SyndicationFeeds"
            };

            feed.Links.Add(new SyndicationLink()
            {
                Uri = currentUri, RelationshipType = "self"
            });

            if (currentPage.Category != null)
            {
                var categoryRepository = ServiceLocator.Current.GetInstance <CategoryRepository>();
                foreach (var category in currentPage.Category)
                {
                    feed.Categories.Add(new SyndicationCategory(categoryRepository.Get(category).Description));
                }
            }

            if (feed.Items.Any())
            {
                feed.LastUpdatedTime = feed.Items.Max(m => m.LastUpdatedTime);
            }

            if (currentPage.FeedFormat == FeedFormat.Atom)
            {
                return(new AtomActionResult(feed));
            }

            return(new RssActionResult(feed));
        }
Example #5
0
        public virtual IEnumerable <IContent> FilterSyndicationContent(IEnumerable <IContent> syndicationContentItems, SyndicationFeedContext feedContext)
        {
            //filter editor set excluded types
            var feedPage = feedContext.FeedPageType;

            var excludedAllTypes = ParseExcludedIds(feedPage.ExcludedContentTypes);
            var filteredItems    = syndicationContentItems.Where(c => !excludedAllTypes.Contains(c.ContentTypeID)).ToList();

            //filter by category
            if (feedContext.CategoriesFilter != null)
            {
                if (!feedContext.CategoriesFilter.IsEmpty)
                {
                    filteredItems = filteredItems
                                    .Where(c => c is ICategorizable)
                                    .Where(c => ((ICategorizable)c).Category.MemberOfAll(feedContext.CategoriesFilter)).ToList();
                }
            }

            //block types are alkways removed by filter for visitor. We want to see them and respect access rights
            var currentlyFiltered = new IContent[filteredItems.Count];

            filteredItems.CopyTo(currentlyFiltered);

            //filter by published, access and template
            var published = ServiceLocator.Current.GetInstance <IPublishedStateAssessor>();
            var access    = (IContentFilter) new FilterAccess();
            var template  = (IContentFilter) new FilterTemplate();

            foreach (var filteredItem in currentlyFiltered)
            {
                var shouldFilter = false;

                shouldFilter = access.ShouldFilter(filteredItem);
                shouldFilter = shouldFilter || !published.IsPublished(filteredItem);

                if (!(filteredItem is BlockData))
                {
                    shouldFilter = shouldFilter || template.ShouldFilter(filteredItem);
                }


                if (shouldFilter)
                {
                    filteredItems.Remove(filteredItem);
                }
            }

            return(filteredItems);
        }