예제 #1
0
        /// <summary>
        /// Gets the feed items.
        /// </summary>
        /// <param name="feed">The feed.</param>
        /// <returns>Feed items to save.</returns>
        public static RssItemCRUDModel[] GetFeedItems(RssFeedCRUDModel feed)
        {
            List <RssItemCRUDModel> result = new List <RssItemCRUDModel>();

            var connectionAction = RepositoryFactory.Action <IRssFeedConnection>();

            // get items from remote url
            var items = connectionAction.GetFeedUrlItems(feed.Url);

            foreach (var rssItemRawData in items)
            {
                // if no author regex or author regex match
                if (string.IsNullOrEmpty(feed.AuthorRegex) ||
                    Regex.IsMatch(rssItemRawData.Author, feed.AuthorRegex, RegexOptions.Singleline))
                {
                    var item = new RssItemCRUDModel
                    {
                        FeedItemId = rssItemRawData.Id,
                        Url        = rssItemRawData.Url,
                        Published  = rssItemRawData.Published,
                        Author     = rssItemRawData.Author,
                        Title      = AntiXss.GetSafeHtmlFragment(rssItemRawData.Title),
                        FeedId     = feed.Id
                    };

                    string content = rssItemRawData.Text;

                    // if display full content, then get content url
                    if (feed.GetDirectContent)
                    {
                        try
                        {
                            content = connectionAction.GetArticle(item.Url);
                        }
                        catch (Exception ex)
                        {
                            LogManager.GetCurrentClassLogger().ErrorException(
                                string.Format("Unable to get article content for feed '{0}' for item url '{1}'. \nException: {2}", feed.Name, item.Url),
                                ex);
                        }
                    }
                    // apply content regex
                    if (!string.IsNullOrEmpty(feed.ContentParseRegex))
                    {
                        var match = Regex.Match(content, feed.ContentParseRegex, RegexOptions.Singleline);
                        if (match.Success && match.Groups.Count > 0)
                        {
                            content = match.Groups[1].Value;
                        }
                        item.Text = AntiXss.GetSafeHtmlFragment(content);
                    }

                    item.Text        = AntiXss.GetSafeHtmlFragment(content);
                    item.Description = content.RemoveTags().Shorten(ModelConstants.DescriptionMaxLenghtConst);

                    result.Add(item);
                }
            }
            return(result.ToArray());
        }
예제 #2
0
        /// <summary>
        /// Deletes the specified item.
        /// </summary>
        /// <param name="item">The item.</param>
        public void Delete(RssItemCRUDModel item)
        {
            var dbItem = SessionFactory <RssItem> .IndexQuery <RssItemSortIndex>()
                         .Where(rssItem => rssItem.FeedItemId == item.FeedItemId)
                         .FirstOrDefault();

            if (dbItem != null)
            {
                dbItem.Hidden = true;
                SessionFactory <RssItem> .Store(dbItem);
            }
        }
예제 #3
0
        public void Test_delete()
        {
            using (RepositoryFactory.StartUnitOfWork())
            {
                var item = new RssItemCRUDModel()
                {
                    FeedItemId  = "new",
                    Title       = "title_new",
                    Text        = "Text_new",
                    Description = "DescriptionNew",
                    Author      = "twit_usernew",
                    Url         = "url_new",
                    FeedId      = _feed.Id,
                    Published   = DateTime.Now
                };

                var action = RepositoryFactory.Action <IRssItemAction>();

                using (var tran = RepositoryFactory.StartTransaction())
                {
                    item = action.Save(item);
                    tran.Commit();
                }

                WaitForIndexing();

                Assert.IsNotNull(SessionFactory <RssItem> .Queryable.FirstOrDefault(rssItem => rssItem.FeedItemId == item.FeedItemId));

                using (var tran = RepositoryFactory.StartTransaction())
                {
                    action.Delete(item);
                    tran.Commit();
                }

                WaitForIndexing();

                var items = action.GetAll().ToArray();
                Assert.AreEqual(2, items.Count());
                Assert.IsFalse(items.Any(rssItem => rssItem.FeedItemId == item.FeedItemId));
            }
        }
예제 #4
0
        /// <summary>
        /// Saves the specified item.
        /// </summary>
        /// <param name="item">The item.</param>
        /// <returns>Saved item.</returns>
        public RssItemCRUDModel Save(RssItemCRUDModel item)
        {
            var dbItem = SessionFactory <RssItem> .IndexQuery <RssItemSortIndex>()
                         .Where(rssItem => rssItem.FeedItemId == item.FeedItemId).FirstOrDefault();


            if (dbItem == null)
            {
                var feed = SessionFactory <RssFeed> .Load(item.FeedId);

                dbItem = new RssItem
                {
                    Id = Guid.NewGuid(),
                    AreCommentAllowed = false,
                    RssFeed           = feed,
                };
            }

            dbItem.CreatedDate = item.Published;
            dbItem.PublishDate = item.Published;
            dbItem.Modified    = item.Published;
            dbItem.Text        = item.Text;
            dbItem.Description = item.Description;
            dbItem.Author      = item.Author;
            dbItem.Title       = item.Title;
            dbItem.Url         = item.Url;
            dbItem.FeedItemId  = item.FeedItemId;

            if (dbItem.Id == Guid.Empty)
            {
                SessionFactory <RssItem> .Store(dbItem);
            }
            else
            {
                SessionFactory <RssItem> .Store(dbItem);
            }
            return(item);
        }
예제 #5
0
        /// <summary>
        /// Indexes the rss item.
        /// </summary>
        /// <param name="transaction">The transaction.</param>
        /// <param name="rssItem">The RSS item.</param>
        public void IndexRssItem(ITransaction transaction, RssItemCRUDModel rssItem)
        {
            SearchUpdateContext tranContext = transaction.TransactionContext as SearchUpdateContext;

            if (tranContext == null)
            {
                throw new Exception("SearchUpdateContext not part of ITransaction!");
            }

            Document doc = new Document();

            doc.Add(new Field(SearchResult.IdField, rssItem.FeedItemId, Field.Store.YES, Field.Index.NOT_ANALYZED));
            doc.Add(new Field(SearchResult.TypeField, SearchResult.RssItemType, Field.Store.YES, Field.Index.NOT_ANALYZED));
            doc.Add(new Field("Title", rssItem.Title, Field.Store.YES, Field.Index.ANALYZED));
            doc.Add(new Field("Text", rssItem.Text, Field.Store.NO, Field.Index.ANALYZED));
            doc.Add(new Field("Published", DateTools.DateToString(rssItem.Published, DateTools.Resolution.SECOND), Field.Store.NO, Field.Index.NOT_ANALYZED));
            doc.Add(new Field("Date", DateTools.DateToString(rssItem.Published, DateTools.Resolution.SECOND), Field.Store.NO, Field.Index.NOT_ANALYZED));
            doc.Add(new Field("User", rssItem.Author, Field.Store.NO, Field.Index.ANALYZED));

            doc.SetBoost(3F);

            tranContext.IndexWriter.AddDocument(doc);
        }
예제 #6
0
        public void Test_save()
        {
            using (RepositoryFactory.StartUnitOfWork())
            {
                var item = new RssItemCRUDModel()
                {
                    FeedItemId  = "new",
                    Title       = "title_new",
                    Text        = "Text_new",
                    Description = "DescriptionNew",
                    Author      = "twit_usernew",
                    Url         = "url_new",
                    FeedId      = _feed.Id,
                    Published   = DateTime.Now
                };

                var action = RepositoryFactory.Action <IRssItemAction>();

                using (var tran = RepositoryFactory.StartTransaction())
                {
                    item = action.Save(item);
                    tran.Commit();
                }

                WaitForIndexing();

                var storedItem = SessionFactory <RssItem> .Queryable.First(rssItem => rssItem.FeedItemId == item.FeedItemId);

                Assert.AreEqual(item.FeedItemId, storedItem.FeedItemId);
                Assert.AreEqual(item.FeedId, storedItem.RssFeed.Id);
                Assert.AreEqual(item.Title, storedItem.Title);
                Assert.AreEqual(item.Text, storedItem.Text);
                Assert.AreEqual(item.Description, storedItem.Description);
                Assert.AreEqual(item.Published, storedItem.CreatedDate);
                Assert.AreEqual(item.Published, storedItem.Modified);
                Assert.AreEqual(item.Published, storedItem.PublishDate);
                Assert.AreEqual(item.Author, storedItem.Author);
                Assert.AreEqual(item.Url, storedItem.Url);
                Assert.AreEqual(false, storedItem.Hidden);
                Assert.AreEqual(false, storedItem.AreCommentAllowed);

                item = new RssItemCRUDModel()
                {
                    FeedItemId  = "change",
                    Title       = "title_change",
                    Text        = "Text_change",
                    Description = "Descriptionchange",
                    Author      = "twit_userchange",
                    Url         = "url_change",
                    FeedId      = _feed.Id,
                    Published   = DateTime.Now
                };

                using (var tran = RepositoryFactory.StartTransaction())
                {
                    item = action.Save(item);
                    tran.Commit();
                }

                WaitForIndexing();

                storedItem = SessionFactory <RssItem> .Queryable.First(rssItem => rssItem.FeedItemId == item.FeedItemId);

                Assert.AreEqual(item.FeedItemId, storedItem.FeedItemId);
                Assert.AreEqual(item.FeedId, storedItem.RssFeed.Id);
                Assert.AreEqual(item.Title, storedItem.Title);
                Assert.AreEqual(item.Text, storedItem.Text);
                Assert.AreEqual(item.Description, storedItem.Description);
                Assert.AreEqual(item.Published, storedItem.CreatedDate);
                Assert.AreEqual(item.Published, storedItem.Modified);
                Assert.AreEqual(item.Published, storedItem.PublishDate);
                Assert.AreEqual(item.Author, storedItem.Author);
                Assert.AreEqual(item.Url, storedItem.Url);
                Assert.AreEqual(false, storedItem.Hidden);
                Assert.AreEqual(false, storedItem.AreCommentAllowed);
            }
            using (RepositoryFactory.StartUnitOfWork())
            {
                var storedItem = SessionFactory <RssItem> .Queryable.First(rssItem => rssItem.FeedItemId == "change");

                var id = storedItem.RssFeed.Id;
            }
        }