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);
        }
示例#2
0
        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);
        }