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())); }
public void MembersJoinedAt(string[] names, int day, string location) { var @event = new MembersJoined { Day = day, Members = names, Location = location }; _events.Add(@event); }
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)); } } }
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)); } } }
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); }
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(); } }
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); }
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(); } }
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(); } }
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)); } } }
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); } }
public void Apply(MembersJoined joined) { _members.Fill(joined.Members); }
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 }
public static MemberJoined[] From(MembersJoined @event) { return(@event.Members.Select(x => new MemberJoined(@event.Day, @event.Location, x)).ToArray()); }
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); } }