Ejemplo n.º 1
0
        public async Task <IActionResult> AddMember(string name, string location, Guid questId)
        {
            var @event = new MembersJoined(location, new string[] { name });

            await SaveEvent(questId, @event);

            return(Ok(@event.ToString()));
        }
Ejemplo n.º 2
0
        public void MembersJoinedAt(string[] names, int day, string location)
        {
            var @event = new MembersJoined {
                Day = day, Members = names, Location = location
            };

            _events.Add(@event);
        }
Ejemplo n.º 3
0
        public async Task correctly_correlates_by_stream()
        {
            var streams = new List <EventStream>();
            var logger  = new RecordingLogger();

            using (var session = theStore.LightweightSession())
            {
                session.Logger = logger;

                for (int i = 0; i < 20; i++)
                {
                    var joined = new MembersJoined
                    {
                        Day      = i,
                        Location = Guid.NewGuid().ToString(),
                        Members  = new string[] { Guid.NewGuid().ToString() }
                    };

                    var departed = new MembersDeparted {
                        Day = i, Location = Guid.NewGuid().ToString(), Members = new[] { Guid.NewGuid().ToString() }
                    };

                    var reached = new ArrivedAtLocation {
                        Day = i, Location = Guid.NewGuid().ToString()
                    };

                    session.Events.Append(Guid.NewGuid(), joined, departed, reached);
                }

                await session.SaveChangesAsync().ConfigureAwait(false);

                streams.AddRange(logger.LastCommit.GetStreams());
            }

            var types = new Type[]
            {
                typeof(MembersJoined), typeof(MembersDeparted), typeof(ArrivedAtLocation)
            };

            var settings = new DaemonSettings
            {
                LeadingEdgeBuffer = 0.Seconds()
            };

            using (var data = new Fetcher(theStore, settings, new AsyncOptions(), Substitute.For <IDaemonLogger>(), new StubErrorHandler(), types))
            {
                var page = await data.FetchNextPage(0).ConfigureAwait(false);

                foreach (var stream in page.Streams)
                {
                    var existing = streams.Single(x => x.Id == stream.Id);

                    existing.Events.Select(x => x.Id)
                    .ShouldHaveTheSameElementsAs(stream.Events.Select(x => x.Id));
                }
            }
        }
Ejemplo n.º 4
0
        public async Task correctly_correlates_by_stream()
        {
            var streams = new List <EventStream>();

            using (var session = theStore.LightweightSession())
            {
                for (int i = 0; i < 20; i++)
                {
                    var joined = new MembersJoined
                    {
                        Day      = i,
                        Location = Guid.NewGuid().ToString(),
                        Members  = new string[] { Guid.NewGuid().ToString() }
                    };

                    var departed = new MembersDeparted {
                        Day = i, Location = Guid.NewGuid().ToString(), Members = new[] { Guid.NewGuid().ToString() }
                    };

                    var reached = new ArrivedAtLocation {
                        Day = i, Location = Guid.NewGuid().ToString()
                    };

                    session.Events.Append(Guid.NewGuid(), joined, departed, reached);
                }

                await session.SaveChangesAsync().ConfigureAwait(false);

                streams.AddRange(session.LastCommit.GetStreams());
            }



            var events = theStore.Schema.Events.As <EventGraph>();

            theOptions.EventTypeNames = new[]
            {
                events.EventMappingFor <MembersJoined>().EventTypeName,
                events.EventMappingFor <MembersDeparted>().EventTypeName,
                events.EventMappingFor <ArrivedAtLocation>().EventTypeName
            };

            using (var data = new StagedEventData(theOptions, new ConnectionSource(), events, new JilSerializer()))
            {
                var page = await data.FetchNextPage(0).ConfigureAwait(false);

                foreach (var stream in page.Streams)
                {
                    var existing = streams.Single(x => x.Id == stream.Id);

                    existing.Events.Select(x => x.Id)
                    .ShouldHaveTheSameElementsAs(stream.Events.Select(x => x.Id));
                }
            }
        }
Ejemplo n.º 5
0
        public void can_build_aggregation_step_for_an_apply_method()
        {
            Expression<Action<QuestParty, MembersJoined>> apply = (p, j) => p.Apply(j);


            var joined = ReflectionHelper.GetMethod<QuestParty>(x => x.Apply(new MembersJoined()));

            var joinedStep = new AggregationStep<QuestParty, MembersJoined>(joined);

            var party = new QuestParty();
            var joinedEvent = new MembersJoined {Members = new []{"Wolverine", "Cyclops", "Nightcrawler"}};

            joinedStep.Apply(party, joinedEvent);

            party.Members.ShouldHaveTheSameElementsAs(joinedEvent.Members);
        }
Ejemplo n.º 6
0
        public async Task filters_by_event_type_name()
        {
            using (var session = theStore.OpenSession())
            {
                for (int i = 0; i < 20; i++)
                {
                    var joined = new MembersJoined
                    {
                        Day      = i,
                        Location = Guid.NewGuid().ToString(),
                        Members  = new string[] { Guid.NewGuid().ToString() }
                    };

                    var departed = new MembersDeparted {
                        Day = i, Location = Guid.NewGuid().ToString(), Members = new[] { Guid.NewGuid().ToString() }
                    };

                    var reached = new ArrivedAtLocation {
                        Day = i, Location = Guid.NewGuid().ToString()
                    };

                    session.Events.Append(Guid.NewGuid(), joined, departed, reached);
                }

                await session.SaveChangesAsync().ConfigureAwait(false);
            }

            var events = theStore.Schema.Events.As <EventGraph>();

            theOptions.EventTypeNames = new[]
            {
                events.EventMappingFor <MembersDeparted>().EventTypeName,
                events.EventMappingFor <ArrivedAtLocation>().EventTypeName
            };

            using (var data = new StagedEventData(theOptions, new ConnectionSource(), events, new JilSerializer()))
            {
                var page = await data.FetchNextPage(0).ConfigureAwait(false);

                var all = page.Streams.SelectMany(x => x.Events).ToArray();

                all.OfType <Event <MembersJoined> >().Any().ShouldBeFalse();
                all.OfType <Event <MembersDeparted> >().Any().ShouldBeTrue();
                all.OfType <Event <ArrivedAtLocation> >().Any().ShouldBeTrue();
            }
        }
Ejemplo n.º 7
0
        public void can_build_aggregation_step_for_an_event_apply_method()
        {
            Expression <Action <QuestPartyWithEvents, MembersJoined> > apply = (p, j) => p.Apply(new Event <MembersJoined>(j));

            var joined = ReflectionHelper.GetMethod <QuestPartyWithEvents>(x => x.Apply(new Event <MembersJoined>(new MembersJoined())));

            var joinedStep = new EventAggregationStep <QuestPartyWithEvents, MembersJoined>(joined);

            var party       = new QuestPartyWithEvents();
            var joinedEvent = new MembersJoined {
                Members = new[] { "Wolverine", "Cyclops", "Nightcrawler" }
            };

            joinedStep.Apply(party, new Event <MembersJoined>(joinedEvent));

            party.Members.ShouldHaveTheSameElementsAs(joinedEvent.Members);
        }
Ejemplo n.º 8
0
        public async Task filters_by_event_type_name()
        {
            using (var session = theStore.OpenSession())
            {
                for (int i = 0; i < 20; i++)
                {
                    var joined = new MembersJoined
                    {
                        Day      = i,
                        Location = Guid.NewGuid().ToString(),
                        Members  = new string[] { Guid.NewGuid().ToString() }
                    };

                    var departed = new MembersDeparted {
                        Day = i, Location = Guid.NewGuid().ToString(), Members = new[] { Guid.NewGuid().ToString() }
                    };

                    var reached = new ArrivedAtLocation {
                        Day = i, Location = Guid.NewGuid().ToString()
                    };

                    session.Events.Append(Guid.NewGuid(), joined, departed, reached);
                }

                await session.SaveChangesAsync().ConfigureAwait(false);
            }

            var settings = new DaemonSettings
            {
                LeadingEdgeBuffer = 0.Seconds()
            };

            using (var data = new Fetcher(theStore, settings, new AsyncOptions(), Substitute.For <IDaemonLogger>(), new StubErrorHandler(), new Type[] { typeof(MembersDeparted), typeof(ArrivedAtLocation) }))
            {
                var page = await data.FetchNextPage(0).ConfigureAwait(false);

                var all = page.Streams.SelectMany(x => x.Events).ToArray();

                all.OfType <Event <MembersJoined> >().Any().ShouldBeFalse();
                all.OfType <Event <MembersDeparted> >().Any().ShouldBeTrue();
                all.OfType <Event <ArrivedAtLocation> >().Any().ShouldBeTrue();
            }
        }
Ejemplo n.º 9
0
        public async Task filters_by_event_type_name()
        {
            using (var session = theStore.OpenSession())
            {
                for (int i = 0; i < 20; i++)
                {
                    var joined = new MembersJoined
                    {
                        Day = i,
                        Location = Guid.NewGuid().ToString(),
                        Members = new string[] { Guid.NewGuid().ToString() }
                    };

                    var departed = new MembersDeparted { Day = i, Location = Guid.NewGuid().ToString(), Members = new[] { Guid.NewGuid().ToString() } };

                    var reached = new ArrivedAtLocation { Day = i, Location = Guid.NewGuid().ToString() };

                    session.Events.Append(Guid.NewGuid(), joined, departed, reached);
                }

                await session.SaveChangesAsync().ConfigureAwait(false);
            }

            var settings = new DaemonSettings
            {
                LeadingEdgeBuffer = 0.Seconds()
            };

            using (var data = new Fetcher(theStore, settings, new AsyncOptions(), Substitute.For<IDaemonLogger>(), new StubErrorHandler(), new Type[] {typeof(MembersDeparted), typeof(ArrivedAtLocation)}))
            {
                var page = await data.FetchNextPage(0).ConfigureAwait(false);

                var all = page.Streams.SelectMany(x => x.Events).ToArray();

                all.OfType<Event<MembersJoined>>().Any().ShouldBeFalse();
                all.OfType<Event<MembersDeparted>>().Any().ShouldBeTrue();
                all.OfType<Event<ArrivedAtLocation>>().Any().ShouldBeTrue();
            }

        }
Ejemplo n.º 10
0
        public async Task correctly_correlates_by_stream()
        {
            var streams = new List<EventStream>();
            var logger = new RecordingLogger();

            using (var session = theStore.LightweightSession())
            {
                session.Logger = logger;

                for (int i = 0; i < 20; i++)
                {
                    var joined = new MembersJoined
                    {
                        Day = i,
                        Location = Guid.NewGuid().ToString(),
                        Members = new string[] { Guid.NewGuid().ToString() }
                    };

                    var departed = new MembersDeparted { Day = i, Location = Guid.NewGuid().ToString(), Members = new[] { Guid.NewGuid().ToString() } };

                    var reached = new ArrivedAtLocation { Day = i, Location = Guid.NewGuid().ToString() };

                    session.Events.Append(Guid.NewGuid(), joined, departed, reached);
                }

                await session.SaveChangesAsync().ConfigureAwait(false);

                streams.AddRange(logger.LastCommit.GetStreams());
            }

            var types = new Type[]
            {
                typeof(MembersJoined), typeof(MembersDeparted), typeof(ArrivedAtLocation)
            };

            var settings = new DaemonSettings
            {
                LeadingEdgeBuffer = 0.Seconds()
            };
            using (var data = new Fetcher(theStore, settings, new AsyncOptions(), Substitute.For<IDaemonLogger>(), new StubErrorHandler(), types))
            {
                var page = await data.FetchNextPage(0).ConfigureAwait(false);

                foreach (var stream in page.Streams)
                {
                    var existing = streams.Single(x => x.Id == stream.Id);

                    existing.Events.Select(x => x.Id)
                        .ShouldHaveTheSameElementsAs(stream.Events.Select(x => x.Id));
                }
            }

        }
Ejemplo n.º 11
0
        public async Task capture_events()
        {
            #region sample_event-store-quickstart
            var store = DocumentStore.For(_ =>
            {
                _.Connection(ConnectionSource.ConnectionString);
                _.Projections.SelfAggregate <QuestParty>();
            });

            var questId = Guid.NewGuid();

            using (var session = store.OpenSession())
            {
                var started = new QuestStarted {
                    Name = "Destroy the One Ring"
                };
                var joined1 = new MembersJoined(1, "Hobbiton", "Frodo", "Sam");

                // Start a brand new stream and commit the new events as
                // part of a transaction
                session.Events.StartStream <Quest>(questId, started, joined1);

                // Append more events to the same stream
                var joined2 = new MembersJoined(3, "Buckland", "Merry", "Pippen");
                var joined3 = new MembersJoined(10, "Bree", "Aragorn");
                var arrived = new ArrivedAtLocation {
                    Day = 15, Location = "Rivendell"
                };
                session.Events.Append(questId, joined2, joined3, arrived);

                // Save the pending changes to db
                await session.SaveChangesAsync();
            }
            #endregion


            #region sample_event-store-start-stream-with-explicit-type
            using (var session = store.OpenSession())
            {
                var started = new QuestStarted {
                    Name = "Destroy the One Ring"
                };
                var joined1 = new MembersJoined(1, "Hobbiton", "Frodo", "Sam");

                // Start a brand new stream and commit the new events as
                // part of a transaction
                session.Events.StartStream(typeof(Quest), questId, started, joined1);
                await session.SaveChangesAsync();
            }
            #endregion

            #region sample_event-store-start-stream-with-no-type
            using (var session = store.OpenSession())
            {
                var started = new QuestStarted {
                    Name = "Destroy the One Ring"
                };
                var joined1 = new MembersJoined(1, "Hobbiton", "Frodo", "Sam");

                // Start a brand new stream and commit the new events as
                // part of a transaction
                // no stream type will be stored in database
                session.Events.StartStream(questId, started, joined1);
                await session.SaveChangesAsync();
            }
            #endregion

            #region sample_events-fetching-stream
            using (var session = store.OpenSession())
            {
                var events = await session.Events.FetchStreamAsync(questId);

                events.Each(evt =>
                {
                    Console.WriteLine($"{evt.Version}.) {evt.Data}");
                });
            }
            #endregion

            #region sample_events-aggregate-on-the-fly
            using (var session = store.OpenSession())
            {
                // questId is the id of the stream
                var party = session.Events.AggregateStream <QuestParty>(questId);
                Console.WriteLine(party);

                var party_at_version_3 = await session.Events
                                         .AggregateStreamAsync <QuestParty>(questId, 3);

                var party_yesterday = await session.Events
                                      .AggregateStreamAsync <QuestParty>(questId, timestamp : DateTime.UtcNow.AddDays(-1));
            }
            #endregion

            using (var session = store.OpenSession())
            {
                var party = session.Load <QuestParty>(questId);
                Console.WriteLine(party);
            }
        }
Ejemplo n.º 12
0
 public void Apply(MembersJoined joined)
 {
     _members.Fill(joined.Members);
 }
Ejemplo n.º 13
0
        public void SampleCopyAndTransformStream()
        {
            // SAMPLE: scenario-copyandtransformstream-setup
            var started = new QuestStarted {
                Name = "Find the Orb"
            };
            var joined = new MembersJoined {
                Day = 2, Location = "Faldor's Farm", Members = new[] { "Garion", "Polgara", "Belgarath" }
            };
            var slayed1 = new MonsterSlayed {
                Name = "Troll"
            };
            var slayed2 = new MonsterSlayed {
                Name = "Dragon"
            };

            using (var session = theStore.OpenSession())
            {
                session.Events.StartStream <Quest>(started.Name, started, joined, slayed1, slayed2);
                session.SaveChanges();
            }
            // ENDSAMPLE

            // SAMPLE: scenario-copyandtransformstream-transform
            using (var session = theStore.OpenSession())
            {
                var events = session.Events.FetchStream(started.Name);

                var transformedEvents = events.SelectMany(x =>
                {
                    switch (x.Data)
                    {
                    case MonsterSlayed monster:
                        {
                            // Trolls we remove from our transformed stream
                            return(monster.Name.Equals("Troll") ? new object[] { } : new[] { monster });
                        }

                    case MembersJoined members:
                        {
                            // MembersJoined events we transform into a series of events
                            return(MemberJoined.From(members));
                        }
                    }

                    return(new[] { x.Data });
                }).Where(x => x != null).ToArray();

                var moveTo = $"{started.Name} without Trolls";
                // We copy the transformed events to a new stream
                session.Events.StartStream <Quest>(moveTo, transformedEvents);
                // And additionally mark the old stream as moved. Furthermore, we assert on the new expected stream version to guard against any racing updates
                session.Events.Append(started.Name, events.Count + 1, new StreamMovedTo
                {
                    To = moveTo
                });

                // Transactionally update the streams.
                session.SaveChanges();
            }
            // ENDSAMPLE
        }
Ejemplo n.º 14
0
 public static MemberJoined[] From(MembersJoined @event)
 {
     return(@event.Members.Select(x => new MemberJoined(@event.Day, @event.Location, x)).ToArray());
 }
Ejemplo n.º 15
0
        public void capture_events()
        {
// SAMPLE: event-store-quickstart
            var store = DocumentStore.For(_ =>
            {
                _.Connection(ConnectionSource.ConnectionString);
                _.Events.InlineProjections.AggregateStreamsWith <QuestParty>();
            });

            var questId = Guid.NewGuid();

            using (var session = store.OpenSession())
            {
                var started = new QuestStarted {
                    Name = "Destroy the One Ring"
                };
                var joined1 = new MembersJoined(1, "Hobbiton", "Frodo", "Sam");

                // Start a brand new stream and commit the new events as
                // part of a transaction
                session.Events.StartStream <Quest>(questId, started, joined1);
                session.SaveChanges();

                // Append more events to the same stream
                var joined2 = new MembersJoined(3, "Buckland", "Merry", "Pippen");
                var joined3 = new MembersJoined(10, "Bree", "Aragorn");
                var arrived = new ArrivedAtLocation {
                    Day = 15, Location = "Rivendell"
                };
                session.Events.Append(questId, joined2, joined3, arrived);
                session.SaveChanges();
            }
// ENDSAMPLE

// SAMPLE: events-fetching-stream
            using (var session = store.OpenSession())
            {
                var events = session.Events.FetchStream(questId);
                events.Each(evt =>
                {
                    Console.WriteLine($"{evt.Version}.) {evt.Data}");
                });
            }
// ENDSAMPLE

// SAMPLE: events-aggregate-on-the-fly
            using (var session = store.OpenSession())
            {
                // questId is the id of the stream
                var party = session.Events.AggregateStream <QuestParty>(questId);
                Console.WriteLine(party);

                var party_at_version_3 = session.Events
                                         .AggregateStream <QuestParty>(questId, 3);


                var party_yesterday = session.Events
                                      .AggregateStream <QuestParty>(questId, timestamp: DateTime.UtcNow.AddDays(-1));
            }
// ENDSAMPLE


            using (var session = store.OpenSession())
            {
                var party = session.Load <QuestParty>(questId);
                Console.WriteLine(party);
            }
        }
Ejemplo n.º 16
0
 public void Apply(MembersJoined joined)
 {
     _members.Fill(joined.Members);
 }