Exemplo n.º 1
0
        public async Task <IEnumerable <Cubicle> > FindAllByFilters(CubicleFilters filters)
        {
            var alreadyReserved = _context
                                  .Cubicles
                                  .AsNoTracking()
                                  .Include(r => r.Reservations)
                                  .Where(x => x.CampusId == filters.CampusId && x.TotalSeats == filters.TotalSeats)
                                  .Where(x => x.Reservations.Any(r =>
                                                                 filters.StartTime >= r.StartTime && filters.StartTime <r.EndTime ||
                                                                                                                        filters.EndTime> r.StartTime && filters.EndTime <= r.EndTime
                                                                 ));

            var allCubicles = _context
                              .Cubicles
                              .AsNoTracking()
                              .Where(x => x.CampusId == filters.CampusId && x.TotalSeats == filters.TotalSeats);

            var result = await allCubicles
                         .AsNoTracking()
                         .Where(c => !alreadyReserved.Contains(c))
                         .ToListAsync();

            return(result);
        }
Exemplo n.º 2
0
        public async Task <IEnumerable <GetCubicleDto> > GetCubiclesByFiltersAsync(CubicleFiltersDto filtersDto)
        {
            // Validar que el id del campo sea correcto
            var campus = await _campusRepository.GetOneByIdAsync(filtersDto.CampusId);

            if (campus == null)
            {
                throw new NotFoundException($"Campus with id {filtersDto.CampusId} was not found");
            }

            // TODO: Posible validación de pabellón


            // Validando la busqueda no se pueda hacer los domingos
            if (filtersDto.StartTime.DayOfWeek == DayOfWeek.Sunday)
            {
                throw new BadRequestException("You cannot make a reservation on Sunday");
            }


            // Validando que la Hora de busqueda sea correcta
            //	if (filtersDto.StartTime.Minute != 0 || filtersDto.StartTime.Second != 0)
            //	throw new BadRequestException("Reservation StartTime cannot has Minutes or Seconds");


            // Validando que la hora de busqueda se encuentre en el rango [7-23]
            if (filtersDto.StartTime.Hour < 7 || filtersDto.StartTime.Hour >= 23)
            {
                throw new BadRequestException($"The provided hour {filtersDto.StartTime.Hour} is invalid");
            }


            // Validando que el dia de la reserva sea hoy o mañana
            var startTimeDay = filtersDto.StartTime.Day;

            if (startTimeDay != DateTime.Today.Day && startTimeDay != DateTime.Today.AddDays(1).Day)
            {
                throw new BadRequestException("Start time day must be today or tomorrow");
            }


            // Validando que la hora de inicio no sea anterior a la hora actual
            if (filtersDto.StartTime.Hour < DateTime.Now.Hour)
            {
                throw new BadRequestException("Start time cannot be before actual time");
            }


            // TODO: Validar que la maxima hora de fin sea 24 horas más que la hora actual


            // Validando que las horas de reserva se encuentren en el rango [1-2]
            if (filtersDto.ReservationHours <= 0 || filtersDto.ReservationHours > 2)
            {
                throw new BadRequestException("ReservationHours must be 1 or 2");
            }

            var endTime = filtersDto.StartTime.AddHours(filtersDto.ReservationHours);
            var filters = new CubicleFilters
            {
                CampusId   = filtersDto.CampusId,
                PavilionId = filtersDto.PavilionId,
                StartTime  = filtersDto.StartTime,
                EndTime    = endTime,
                TotalSeats = filtersDto.TotalSeats
            };

            var cubicles = await _cubicleRepository.FindAllByFilters(filters);

            return(cubicles.Select(GetCubicleDto.FromCubicle));
        }