Example #1
0
        private static List <RoomAvailabilityIntervalDto> GetAvailabilityIntervalsForQuery(
            GetAvailabilityByDateRange query,
            ImmutableList <RoomAvailabilityIntervalDto> occupiedIntervalsForRoom)
        {
            var roomAvailabilityIntervals = new List <RoomAvailabilityIntervalDto>(occupiedIntervalsForRoom);
            var previousEnd = query.StartDateUtc;

            foreach (var occupiedInterval in occupiedIntervalsForRoom)
            {
                if (previousEnd < occupiedInterval.Start)
                {
                    roomAvailabilityIntervals.Add(new RoomAvailabilityIntervalDto
                    {
                        Start      = previousEnd,
                        End        = occupiedInterval.Start,
                        IsOccupied = false,
                    });
                }

                previousEnd = occupiedInterval.End;
            }

            if (previousEnd < query.EndDateUtc)
            {
                roomAvailabilityIntervals.Add(new RoomAvailabilityIntervalDto
                {
                    Start      = previousEnd,
                    End        = query.EndDateUtc,
                    IsOccupied = false
                });
            }

            return(roomAvailabilityIntervals);
        }
Example #2
0
 private async Task <IReadOnlyList <RoomOccupationReadModel> > GetAllRoomOccupationsFor(
     GetAvailabilityByDateRange query)
 {
     return(await _dbReadContext.RunAsync(factory =>
     {
         var roomRepository = factory.CreateRoomRepository();
         return roomRepository.GetOccupationsBetween(query.StartDateUtc, query.EndDateUtc);
     }));
 }
Example #3
0
        public async Task <IReadOnlyList <RoomAvailabilityDto> > ExecuteQueryAsync(
            GetAvailabilityByDateRange query,
            CancellationToken cancellationToken)
        {
            var rooms = await GetAllRooms();

            _roomOccupations = await GetAllRoomOccupationsFor(query);

            return(rooms.Map(room => GetAvailabilityForRoom(query, room)).ToImmutableList());
        }
Example #4
0
        private RoomAvailabilityDto GetAvailabilityForRoom(GetAvailabilityByDateRange query, RoomReadModel room)
        {
            var occupiedIntervalsForRoom = _roomOccupations
                                           .Where(o => o.AggregateId == room.AggregateId)
                                           .Map(occupation => new RoomAvailabilityIntervalDto
            {
                Start      = occupation.StartDate,
                End        = occupation.EndDate,
                IsOccupied = true,
            })
                                           .ToImmutableList();

            var roomAvailabilityIntervals = GetAvailabilityIntervalsForQuery(query, occupiedIntervalsForRoom);

            return(new RoomAvailabilityDto
            {
                RoomId = room.GetIdentity().GetGuid(),
                RoomNumber = room.RoomNumber,
                Details = roomAvailabilityIntervals.OrderBy(r => r.Start).ToList(),
                IsAvailable = roomAvailabilityIntervals.Count == 1 && !roomAvailabilityIntervals.Single().IsOccupied,
            });
        }