diff --git a/20230809-LS.csproj b/20230809-LS.csproj new file mode 100644 index 0000000..7547697 --- /dev/null +++ b/20230809-LS.csproj @@ -0,0 +1,11 @@ + + + + Exe + net7.0 + _20230809_LS + enable + enable + + + diff --git a/20230809-LS.csproj b/20230809-LS.csproj new file mode 100644 index 0000000..7547697 --- /dev/null +++ b/20230809-LS.csproj @@ -0,0 +1,11 @@ + + + + Exe + net7.0 + _20230809_LS + enable + enable + + + diff --git a/DinnerEvents.cs b/DinnerEvents.cs new file mode 100644 index 0000000..e2dec30 --- /dev/null +++ b/DinnerEvents.cs @@ -0,0 +1,7 @@ +namespace Dinner; + +interface IEvent { } + +record DinnerPlanned(Guid DinnerId) : IEvent; +record DinnerSeatReserved(Guid DinnerId, Guid GuestId) : IEvent; +record DinnerHosted(Guid DinnerId, IEnumerable Reservations) : IEvent; \ No newline at end of file diff --git a/20230809-LS.csproj b/20230809-LS.csproj new file mode 100644 index 0000000..7547697 --- /dev/null +++ b/20230809-LS.csproj @@ -0,0 +1,11 @@ + + + + Exe + net7.0 + _20230809_LS + enable + enable + + + diff --git a/DinnerEvents.cs b/DinnerEvents.cs new file mode 100644 index 0000000..e2dec30 --- /dev/null +++ b/DinnerEvents.cs @@ -0,0 +1,7 @@ +namespace Dinner; + +interface IEvent { } + +record DinnerPlanned(Guid DinnerId) : IEvent; +record DinnerSeatReserved(Guid DinnerId, Guid GuestId) : IEvent; +record DinnerHosted(Guid DinnerId, IEnumerable Reservations) : IEvent; \ No newline at end of file diff --git a/Program.cs b/Program.cs new file mode 100644 index 0000000..507262d --- /dev/null +++ b/Program.cs @@ -0,0 +1,83 @@ +namespace Dinner; + +class Dinner +{ + private readonly uint _availableSeats; + private readonly DateTime _scheduled; + private readonly List _reservations; + private readonly List _events = new(); + private readonly Guid _dinnerId; + + private Dinner(Guid dinnerId, uint availableSeats, DateTime scheduled) + { + _dinnerId = dinnerId; + _availableSeats = availableSeats; + _scheduled = scheduled; + _reservations = new List(); + + _events.Add(new DinnerPlanned(_dinnerId)); + } + + public static Dinner PlanDinner(Guid dinnerId, uint availableSeats, DateTime scheduled) + { + if (availableSeats == 0) + { + throw new InvalidOperationException("Must have at least one seat at a dinner."); + } + + return new Dinner(dinnerId, availableSeats, scheduled); + } + + public bool ReserveSeat(Guest guest) + { + if (_reservations.Count <= _availableSeats) + { + _reservations.Add(new Reservation(Guid.NewGuid(), guest)); + _events.Add(new DinnerSeatReserved(_dinnerId, guest.GuestId)); + + return true; + } + + return false; + } + + public void CancelReservation(Guest guest) + { + var reservation = _reservations.SingleOrDefault(x => x.Guest.Equals(guest)); + if (reservation == null) + { + throw new InvalidOperationException("Guest does not have a reservation."); + } + + _reservations.Remove(reservation); + } + + public void ConfirmReservation(Guest guest) + { + var reservation = _reservations.SingleOrDefault(x => x.Guest.Equals(guest)); + if (reservation == null) + { + throw new InvalidOperationException("Guest does not have a reservation."); + } + + reservation.Confirm(); + } + + public void StartDinner() + { + var confirmedReservations = _reservations.Where(x => x.IsConfirmed); + _events.Add(new DinnerHosted(_dinnerId, confirmedReservations)); + } +} + +record Reservation(Guid ReservationId, Guest Guest) +{ + public bool IsConfirmed { get; private set; } + + public void Confirm() + { + IsConfirmed = true; + } +} + +record Guest(Guid GuestId, string Name); \ No newline at end of file