예제 #1
0
        public AttendantsReadModel When(AttendantsReadModel state, object @event)
        {
            switch (@event)
            {
            case Events.MeetupCreated created:
                state.MeetupId = created.MeetupId;
                break;

            case Events.NumberOfSeatsUpdated seats:
                state.MeetupCapacity = seats.NumberOfSeats;
                break;

            case Events.RSVPAccepted accepted:
                if (state.MeetupCapacity > state.Going.Count)
                {
                    state.Going.Add(accepted.MemberId);
                }
                else
                {
                    state.Waiting.Add(accepted.MemberId);
                }
                break;

            case Events.RSVPDeclined declined:
                state.Going.Remove(declined.MemberId);
                state.NotGoing.Add(declined.MemberId);
                UpdateWaitingList();
                break;
            }

            void UpdateWaitingList()
            {
                if (state.MeetupCapacity > state.Going.Count)
                {
                    var first = state.Waiting.First();
                    state.Going.Add(first);
                    state.Waiting.Remove(first);
                }
            }

            return(state);
        }
예제 #2
0
 public AttendantsReadModel Project(AttendantsReadModel readModel, params object[] events) => events.Aggregate(readModel, When);