public AttendeesListReadModel Project(AttendeesListReadModel readModel, params object[] events) { foreach (var ev in events) { readModel = When(readModel, ev); } return(readModel); }
private AttendeesListReadModel When(AttendeesListReadModel readModel, object ev) { switch (ev) { case Events.MeetupCreated created: readModel.Id = created.MeetupId; break; case Events.NumberOfSeatsUpdated seats: readModel.MeetupCapacity = seats.NumberOfSeats; break; case Events.RSVPAccepted accepted: if (readModel.MeetupFull) { readModel.WaitingList.Add(accepted.MemberId); } else { readModel.MembersGoing.Add(accepted.MemberId); } break; case Events.RSVPDeclined declined: readModel.MembersNotGoing.Add(declined.MemberId); if (readModel.MembersGoing.Contains(declined.MemberId)) { if (readModel.WaitingList.Count() > 0) { var memberWaiting = readModel.WaitingList.First(); readModel.MembersGoing.Add(memberWaiting); readModel.WaitingList.Remove(memberWaiting); } readModel.MembersGoing.Remove(declined.MemberId); } break; } return(readModel); }