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));
        }
예제 #3
0
        /// <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;
        }
예제 #4
0
 /// <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)
 {
 }
예제 #5
0
 /// <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());
예제 #6
0
 /// <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);