public void BookRoom(HotelRoomBookingModel bookingDetails)
        {
            bookingDetails = bookingDetails ?? throw new HotelBookingInvalidDetailesException();

            var room = _dbContext.HotelRooms
                       .Include(r => r.Reservations)
                       .FirstOrDefault(r => r.Id == bookingDetails.RoomId)
                       ?? throw new HotelRoomNotFoundException();

            if (bookingDetails.Guests > room.MaxGuests)
            {
                throw new HotelRoomGuestsExceededException();
            }

            // correction for dates containing time
            bookingDetails.Range.Start = bookingDetails.Range.Start.Date;
            bookingDetails.Range.End   = bookingDetails.Range.End.Date;

            if (!IsRoomAvailable(room, bookingDetails.Range))
            {
                throw new HotelRoomUnavailableException();
            }

            room.Reservations.Add(new HotelRoomReservation
            {
                UserId      = bookingDetails.UserId,
                StartTime   = bookingDetails.Range.Start,
                EndTime     = bookingDetails.Range.End,
                GuestsCount = bookingDetails.Guests
            });
            _dbContext.SaveChanges();
        }
        public IActionResult BookRoom(HotelRoomBookingModel bookingDetails)
        {
            var userIdClaim = User.FindFirst(ClaimTypes.NameIdentifier)?.Value;

            if (!int.TryParse(userIdClaim, out var userId))
            {
                throw new InvalidClaimException();
            }

            bookingDetails.UserId = userId;

            _hotelService.BookRoom(bookingDetails);

            return(Ok());
        }