Ejemplo n.º 1
0
        /// <summary>
        /// Enrich the stream from store
        /// </summary>
        /// <remarks>
        /// <para/>
        /// Null if stream exists but some of the ancestors do not
        /// </remarks>
        /// <param name="connection">Stream store</param>
        /// <param name="key">Stream key</param>
        /// <param name="serializer">Serializer</param>
        /// <returns>Stream info</returns>
        public static async Task <IStream> GetStream(
            this IEventStoreConnection connection, string key, ISerializer <IEvent> serializer)
        {
            var metadata = await connection.GetStreamMetadataAsync(key);

            var stream = serializer.DecodeStreamMetadata(metadata.StreamMetadata.AsJsonString());

            if (stream == null)
            {
                return(new Stream(key));
            }

            var count = await connection.DeletedCount(key);

            stream.AddDeleted(count);

            var parent = stream.Parent;

            while (parent != null && parent.Version > ExpectedVersion.EmptyStream)
            {
                var parentMetadata = await connection.GetStreamMetadataAsync(parent.Key);

                if (parentMetadata.StreamMetadata == null)
                {
                    return(null);
                }

                count = await connection.DeletedCount(parent.Key);

                parent.AddDeleted(count);

                var grandParent = serializer.DecodeStreamMetadata(parentMetadata.StreamMetadata.AsJsonString())?.Parent;

                parent.Parent = grandParent;
                parent        = grandParent;
            }

            return(stream);
        }