Commit 37574181 by Antonio Rueda

Implementado endpoint para búsqueda de hoteles por varios criterios

parent a0d63266
package es.ujaen.dae.reservahoteles.rest;
import es.ujaen.dae.reservahoteles.entidades.Hotel;
import es.ujaen.dae.reservahoteles.entidades.Usuario;
import es.ujaen.dae.reservahoteles.excepciones.UsuarioNoRegistrado;
import es.ujaen.dae.reservahoteles.excepciones.UsuarioYaRegistrado;
......@@ -10,6 +11,9 @@ import es.ujaen.dae.reservahoteles.rest.dto.Mapeador;
import es.ujaen.dae.reservahoteles.servicios.ServicioReservas;
import jakarta.annotation.PostConstruct;
import jakarta.validation.ConstraintViolationException;
import java.time.LocalDate;
import java.util.List;
import java.util.Optional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
......@@ -76,5 +80,30 @@ public class ControladorReservas {
servicioReservas.nuevoHotel(direccion, mapeador.entidad(hotel));
return ResponseEntity.status(HttpStatus.CREATED).build();
}
}
@GetMapping("/hoteles")
public ResponseEntity<List<DHotel>> buscarHotel(
@RequestParam String localidad,
@RequestParam(required=false) String nombre,
@RequestParam(required=false) LocalDate desde,
@RequestParam(required=false) LocalDate hasta,
@RequestParam(defaultValue="0") int numHabSimple,
@RequestParam(defaultValue="0") int numHabDoble) {
// Definir fechas límite en caso de omisión
final var desdeFinal = desde != null ? desde : LocalDate.now();
final var hastaFinal = hasta != null ? hasta : LocalDate.MAX;
List<Hotel> hoteles;
if (nombre != null) {
hoteles = servicioReservas.buscarHotel(nombre, localidad).stream()
.filter(h -> servicioReservas.disponible(h, desdeFinal, hastaFinal, numHabSimple, numHabDoble)).toList();
}
else {
hoteles = servicioReservas.buscarHotelesDisponiblesPorLocalidad(localidad, desdeFinal, hastaFinal, numHabSimple, numHabDoble);
}
return ResponseEntity.ok(hoteles.stream().map(h -> mapeador.dto(h)).toList());
}
}
......@@ -100,7 +100,6 @@ public class ServicioReservas {
* @param localidad el nombre total o parcial de la localidad
* @return la lista de hoteles candidatos (sin lista de reservas)
*/
@Transactional
public List<Hotel> buscarHotel(@NotBlank String nombre, @NotBlank String localidad) {
return repositorioHoteles.buscarPorNombreLocalidad(nombre, localidad);
}
......
package es.ujaen.dae.reservahoteles.rest;
import es.ujaen.dae.reservahoteles.entidades.Hotel;
import es.ujaen.dae.reservahoteles.rest.dto.DHotel;
import es.ujaen.dae.reservahoteles.rest.dto.DUsuario;
import jakarta.annotation.PostConstruct;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
......@@ -106,7 +104,7 @@ public class TestControladorReservas {
);
assertThat(respuestaLogin.getStatusCode()).isEqualTo(HttpStatus.OK);
assertThat(respuestaLogin.getBody()).isEqualTo(usuario);
assertThat(respuestaLogin.getBody().email()).isEqualTo(usuario.email());
}
@Test
......@@ -137,9 +135,14 @@ public class TestControladorReservas {
);
assertThat(respuesta.getStatusCode()).isEqualTo(HttpStatus.CREATED);
// List<Hotel> hoteles = servicio.buscarHotel("gran hotel", " almeria");
// assertThat(hoteles).hasSize(1);
// assertThat(hoteles.get(0).id()).isEqualTo(1);
var respuestaConsulta = restTemplate.getForEntity(
"/hoteles?nombre={nombre}&localidad={localidad}",
DHotel[].class,
"gran hotel",
" almeria"
);
assertThat(respuestaConsulta.getStatusCode()).isEqualTo(HttpStatus.OK);
assertThat(respuestaConsulta.getBody()).hasSize(1);
assertThat(respuestaConsulta.getBody()[0].id()).isEqualTo(1);
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment