public void FeedItemTo(FeedItemId fromFeedItemId, IFeedConsumer feedConsumer) { var feedId = fromFeedItemId.ToLong(); var id = (feedId - 1L) * _feed.MessagesPerFeedItem + 1; _entryReader .ReadNext(id.ToString(), _feed.MessagesPerFeedItem) .AndThen(entries => { var textEntries = entries.ToList(); feedConsumer.ConsumeFeedItem(ToFeedItem(fromFeedItemId, textEntries.Cast <TextEntry>().ToList())); return(textEntries); }); }
/// <summary> /// Get a new <see cref="FeedItem"/> from converted <paramref name="entries"/>. /// </summary> /// <param name="feedItemId">The <see cref="FeedItemTo"/> of the current item</param> /// <param name="entries">The list of <see cref="TextEntry"/> to convert</param> /// <returns><see cref="FeedItem"/></returns> private FeedItem ToFeedItem(FeedItemId feedItemId, List <TextEntry> entries) { var messages = new List <FeedMessage>(entries.Count); foreach (var entry in entries) { var body = FeedMessageBody.With(entry.EntryData); var message = FeedMessage.With(entry.Id, body, entry.TypeName, entry.TypeVersion); messages.Add(message); } if (_feed.MessagesPerFeedItem == entries.Count) { return(FeedItem.ArchivedFeedItemWith(feedItemId, feedItemId.Next(), feedItemId.Previous(), messages)); } return(FeedItem.CurrentFeedWith(feedItemId, feedItemId.Previous(), messages)); }
/// <summary> /// Construct my state with identities, messages, and archive indicator. /// </summary> /// <param name="id">The <see cref="FeedItemId"/> identity</param> /// <param name="nextId">The <see cref="FeedItemId"/> identity of the next FeedItem, if known</param> /// <param name="previousId">The identity of the previous feed, if any</param> /// <param name="messages">The <see cref="List{T}"/> of messages</param> /// <param name="archived">The boolean indicator that this feed is considered archived or not</param> /// <exception cref="ArgumentNullException">If any of the arguments is null</exception> private FeedItem(FeedItemId id, FeedItemId nextId, FeedItemId previousId, List <FeedMessage> messages, bool archived) { if (id == null) { throw new ArgumentNullException(nameof(id)); } if (nextId == null) { throw new ArgumentNullException(nameof(nextId)); } if (previousId == null) { throw new ArgumentNullException(nameof(previousId)); } Id = id; NextId = nextId; PreviousId = previousId; Messages = messages; Archived = archived; }
/// <summary> /// Construct my state with identities, messages, and <code>false</code> archive indicator /// </summary> /// <param name="id">The <see cref="FeedItemId"/> identity</param> /// <param name="previousFeedId">The identity of the previous feed, if any</param> /// <param name="messages">The <see cref="List{T}"/> of messages</param> private FeedItem(FeedItemId id, FeedItemId previousFeedId, List <FeedMessage> messages) : this(id, FeedItemId.Unknown, previousFeedId, messages, false) { }
/// <summary> /// Gets the new <see cref="FeedItem"/> that is considered current/head, with /// <paramref name="id"/>, a <paramref name="previousId"/>, and <paramref name="messages"/>. /// </summary> /// <param name="id">The <see cref="FeedItemId"/> identity</param> /// <param name="previousId">The identity of the previous feed, if any</param> /// <param name="messages">The <see cref="List{T}"/> of messages</param> /// <returns><see cref="FeedItem"/></returns> public static FeedItem CurrentFeedWith(FeedItemId id, FeedItemId previousId, IEnumerable <FeedMessage> messages) => new FeedItem(id, previousId, messages.ToList());
/// <summary> /// Gets the new <see cref="FeedItem"/> that is considered current/head, with /// <paramref name="id"/>, a <paramref name="previousId"/>, and <paramref name="messages"/>. /// </summary> /// <param name="id">The <see cref="FeedItemId"/> identity</param> /// <param name="nextId">The <see cref="FeedItemId"/> identity of the next FeedItem, if known</param> /// <param name="previousId">The identity of the previous feed, if any</param> /// <param name="messages">The <see cref="List{T}"/> of messages</param> /// <returns><see cref="FeedItem"/></returns> public static FeedItem ArchivedFeedItemWith(FeedItemId id, FeedItemId nextId, FeedItemId previousId, IEnumerable <FeedMessage> messages) => new FeedItem(id, nextId, previousId, messages.ToList(), true);