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); }
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)); }