public async Task <IActionResult> GetAllByFiltersAsync( [FromQuery] CubicleFiltersDto filters ) { try { var items = await _cubicleService.GetCubiclesByFiltersAsync(filters); return(Ok(items)); } catch (Exception e) { return(HttpExceptionMapper.ToHttpActionResult(e)); } }
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)); }