public async Task <Guid> CreateBookingAsync( Guid userId, Guid roomId, DateTimeOffset startAt, DateTimeOffset endAt, CancellationToken ct) { var user = await _userManager.Users.SingleOrDefaultAsync(u => u.Id == userId, ct); if (user == null) { throw new InvalidOperationException("You must be logged in."); } var room = await _context.Rooms .SingleOrDefaultAsync(r => r.Id == roomId, ct); if (room == null) { throw new ArgumentException("Invalid room id."); } var minimumStay = _dateLogicService.GetMinimumStay(); var total = (int)((endAt - startAt).TotalHours / minimumStay.TotalHours) * room.Rate; var id = Guid.NewGuid(); var newBooknig = _context.Bookings.Add(new BookingEntity { Id = id, CreatedAt = DateTimeOffset.UtcNow, ModifiedAt = DateTimeOffset.UtcNow, StartAt = startAt.ToUniversalTime(), EndAt = endAt.ToUniversalTime(), Room = room, User = user, Total = total }); var created = await _context.SaveChangesAsync(ct); if (created < 1) { throw new InvalidOperationException("Could not create the booking."); } return(id); }
public async Task <Guid> CreateBookingAsync( Guid userId, Guid roomId, DateTimeOffset startAt, DateTimeOffset endAt, CancellationToken cancellationToken) { var room = await _context.Rooms .SingleOrDefaultAsync(r => r.Id == roomId, cancellationToken); if (room == null) { throw new ArgumentException("Invalid room id."); } var minimumStay = _dateLogicService.GetMinimumStay(); // Might be a good idea to move this logic to a class that calculates prices and rates var total = (int)((endAt - startAt).TotalHours / minimumStay.TotalHours) * room.Rate; var id = Guid.NewGuid(); var newBooking = _context.Bookings.Add(new BookingEntity { Id = id, CreatedAt = DateTimeOffset.UtcNow, ModifiedAt = DateTimeOffset.UtcNow, StartAt = startAt.ToUniversalTime(), EndAt = endAt.ToUniversalTime(), Room = room, Total = total }); var created = await _context.SaveChangesAsync(cancellationToken); if (created < 1) { throw new InvalidOperationException("Could not create the booking."); } return(id); }