/// <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()); }
/// <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); } }
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)); } }
/// <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); }
/// <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); }
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; } }