Commit 37574181 by Antonio Rueda

Implementado endpoint para búsqueda de hoteles por varios criterios

parent a0d63266
package es.ujaen.dae.reservahoteles.rest; 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.entidades.Usuario;
import es.ujaen.dae.reservahoteles.excepciones.UsuarioNoRegistrado; import es.ujaen.dae.reservahoteles.excepciones.UsuarioNoRegistrado;
import es.ujaen.dae.reservahoteles.excepciones.UsuarioYaRegistrado; import es.ujaen.dae.reservahoteles.excepciones.UsuarioYaRegistrado;
...@@ -10,6 +11,9 @@ import es.ujaen.dae.reservahoteles.rest.dto.Mapeador; ...@@ -10,6 +11,9 @@ import es.ujaen.dae.reservahoteles.rest.dto.Mapeador;
import es.ujaen.dae.reservahoteles.servicios.ServicioReservas; import es.ujaen.dae.reservahoteles.servicios.ServicioReservas;
import jakarta.annotation.PostConstruct; import jakarta.annotation.PostConstruct;
import jakarta.validation.ConstraintViolationException; 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.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
...@@ -77,4 +81,29 @@ public class ControladorReservas { ...@@ -77,4 +81,29 @@ public class ControladorReservas {
return ResponseEntity.status(HttpStatus.CREATED).build(); 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 { ...@@ -100,7 +100,6 @@ public class ServicioReservas {
* @param localidad el nombre total o parcial de la localidad * @param localidad el nombre total o parcial de la localidad
* @return la lista de hoteles candidatos (sin lista de reservas) * @return la lista de hoteles candidatos (sin lista de reservas)
*/ */
@Transactional
public List<Hotel> buscarHotel(@NotBlank String nombre, @NotBlank String localidad) { public List<Hotel> buscarHotel(@NotBlank String nombre, @NotBlank String localidad) {
return repositorioHoteles.buscarPorNombreLocalidad(nombre, localidad); return repositorioHoteles.buscarPorNombreLocalidad(nombre, localidad);
} }
......
package es.ujaen.dae.reservahoteles.rest; 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.DHotel;
import es.ujaen.dae.reservahoteles.rest.dto.DUsuario; import es.ujaen.dae.reservahoteles.rest.dto.DUsuario;
import jakarta.annotation.PostConstruct; import jakarta.annotation.PostConstruct;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
...@@ -106,7 +104,7 @@ public class TestControladorReservas { ...@@ -106,7 +104,7 @@ public class TestControladorReservas {
); );
assertThat(respuestaLogin.getStatusCode()).isEqualTo(HttpStatus.OK); assertThat(respuestaLogin.getStatusCode()).isEqualTo(HttpStatus.OK);
assertThat(respuestaLogin.getBody()).isEqualTo(usuario); assertThat(respuestaLogin.getBody().email()).isEqualTo(usuario.email());
} }
@Test @Test
...@@ -137,9 +135,14 @@ public class TestControladorReservas { ...@@ -137,9 +135,14 @@ public class TestControladorReservas {
); );
assertThat(respuesta.getStatusCode()).isEqualTo(HttpStatus.CREATED); assertThat(respuesta.getStatusCode()).isEqualTo(HttpStatus.CREATED);
// List<Hotel> hoteles = servicio.buscarHotel("gran hotel", " almeria"); var respuestaConsulta = restTemplate.getForEntity(
"/hoteles?nombre={nombre}&localidad={localidad}",
// assertThat(hoteles).hasSize(1); DHotel[].class,
// assertThat(hoteles.get(0).id()).isEqualTo(1); "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