Ejemplo n.º 1
0
        public static FeedElement ToStreamEventBackwardFeed(ClientMessage.ReadStreamEventsBackwardCompleted msg,
                                                            Uri requestedUrl, EmbedLevel embedContent, bool headOfStream)
        {
            Ensure.NotNull(msg, "msg");

            string escapedStreamId = Uri.EscapeDataString(msg.EventStreamId);
            var    self            = HostName.Combine(requestedUrl, "/streams/{0}", escapedStreamId);
            var    feed            = new FeedElement();

            feed.SetTitle(string.Format("Event stream '{0}'", msg.EventStreamId));
            feed.StreamId = msg.EventStreamId;
            feed.SetId(self);
            feed.SetUpdated(msg.Events.Length > 0 && msg.Events[0].Event != null
                                ? msg.Events[0].Event.TimeStamp
                                : DateTime.MinValue.ToUniversalTime());
            feed.SetAuthor(AtomSpecs.Author);
            feed.SetHeadOfStream(headOfStream);             //TODO AN: remove this ?
            feed.SetSelfUrl(self);
            //TODO AN: remove this ?
            if (headOfStream)             //NOTE: etag workaround - to be fixed with better http handling model
            {
                feed.SetETag(Configure.GetPositionETag(msg.LastEventNumber, ContentType.AtomJson));
            }

            var prevEventNumber = Math.Min(msg.FromEventNumber, msg.LastEventNumber) + 1;
            var nextEventNumber = msg.FromEventNumber - msg.MaxCount;

            feed.AddLink("self", self);
            feed.AddLink("first",
                         HostName.Combine(requestedUrl, "/streams/{0}/head/backward/{1}", escapedStreamId, msg.MaxCount));
            if (!msg.IsEndOfStream)
            {
                if (nextEventNumber < 0)
                {
                    throw new Exception(string.Format("nextEventNumber is negative: {0} while IsEndOfStream",
                                                      nextEventNumber));
                }
                feed.AddLink("last",
                             HostName.Combine(requestedUrl, "/streams/{0}/{1}/forward/{2}", escapedStreamId, 0, msg.MaxCount));
                feed.AddLink("next",
                             HostName.Combine(requestedUrl, "/streams/{0}/{1}/backward/{2}", escapedStreamId, nextEventNumber,
                                              msg.MaxCount));
            }

            feed.AddLink("previous",
                         HostName.Combine(requestedUrl, "/streams/{0}/{1}/forward/{2}", escapedStreamId, prevEventNumber,
                                          msg.MaxCount));
            feed.AddLink("metadata", HostName.Combine(requestedUrl, "/streams/{0}/metadata", escapedStreamId));
            for (int i = 0; i < msg.Events.Length; ++i)
            {
                feed.AddEntry(ToEntry(msg.Events[i], requestedUrl, embedContent));
            }

            return(feed);
        }