public BookingsCommandService(IAggregateStore store, IsRoomAvailable isRoomAvailable, ConvertCurrency convertCurrency) : base(store) { OnNew <BookingCommands.Book>( (booking, cmd) => booking.BookRoom( new BookingId(cmd.BookingId), cmd.GuestId, new RoomId(cmd.RoomId), new StayPeriod(cmd.From, cmd.To), new Money(cmd.Price, cmd.Currency), cmd.BookedBy, cmd.BookedAt, isRoomAvailable ) ); OnExisting <BookingCommands.RecordPayment>( cmd => new BookingId(cmd.BookingId), (booking, cmd) => booking.RecordPayment( new Money(cmd.Amount, cmd.Currency), convertCurrency, cmd.PaidBy, cmd.PaidAt ) ); OnExisting <BookingCommands.ApplyDiscount>( cmd => new BookingId(cmd.BookingId), (booking, cmd) => booking.ApplyDiscount( new Money(cmd.Amount, cmd.Currency), convertCurrency ) ); }
public async Task BookRoom( BookingId bookingId, string guestId, RoomId roomId, StayPeriod period, Money price, string bookedBy, DateTimeOffset bookedAt, IsRoomAvailable isRoomAvailable ) { EnsureDoesntExist(); await EnsureRoomAvailable(roomId, period, isRoomAvailable); Apply( new RoomBooked( bookingId.Value, roomId.Value, guestId, period.CheckIn, period.CheckOut, price.Amount, price.Currency, bookedBy, bookedAt ) ); }
static async Task EnsureRoomAvailable(RoomId roomId, StayPeriod period, IsRoomAvailable isRoomAvailable) { var roomAvailable = await isRoomAvailable(roomId, period); if (!roomAvailable) { throw new DomainException("Room not available"); } }
public Block Do() { foreach (var theClass in _block.Classes) { var isRoomFreeForClass = new IsRoomAvailable(_room, theClass).IsValid(); if (isRoomFreeForClass) { new ClassRoomChanger(_classRepository, theClass, _room) .Do(); } } return(_block); }