diff --git a/java/roomBooking/src/main/java/com/uva/roomBooking/Controllers/HotelController.java b/java/roomBooking/src/main/java/com/uva/roomBooking/Controllers/HotelController.java index 949b175f65224b8ae3399cc8ba14b26c9638b1cc..4739c7343d804c472f691636481e7dd3f7a208d4 100644 --- a/java/roomBooking/src/main/java/com/uva/roomBooking/Controllers/HotelController.java +++ b/java/roomBooking/src/main/java/com/uva/roomBooking/Controllers/HotelController.java @@ -4,6 +4,7 @@ import java.util.List; import java.time.LocalDate; import com.uva.roomBooking.Exceptions.HotelNotFoundException; +import com.uva.roomBooking.Exceptions.InvalidDateRangeException; import com.uva.roomBooking.Models.Hotel; import com.uva.roomBooking.Models.Room; import com.uva.roomBooking.Repositories.HotelRepository; @@ -48,7 +49,8 @@ public class HotelController { // Borrar un hotel junto con sus habitaciones (borrado en cascada) @DeleteMapping("/{id}") public ResponseEntity<Void> deleteHotel(@PathVariable Integer id) { - Hotel target = hotelRepository.findById(id).orElseThrow(() -> new HotelNotFoundException(id)); + Hotel target = hotelRepository.findById(id) + .orElseThrow(() -> new HotelNotFoundException(id)); hotelRepository.delete(target); return new ResponseEntity<>(HttpStatus.NO_CONTENT); } @@ -56,15 +58,14 @@ public class HotelController { // Obtener habitaciones de un hotel según disponibilidad y fechas @GetMapping("/{hotelId}/rooms") public ResponseEntity<List<Room>> getRoomsFromHotel( - @PathVariable(required = true) int hotelId, + @PathVariable int hotelId, @RequestParam(required = false) LocalDate date1, @RequestParam(required = false) LocalDate date2) { List<Room> rooms; if (date1 != null && date2 != null) { if (!date1.isBefore(date2)) { - // TODO cambiar por una excepción adecuada - throw new IllegalArgumentException("date1 should be before than date2"); + throw new InvalidDateRangeException("La fecha de inicio debe ser anterior a la fecha de fin"); } rooms = roomRepository.findAvailableRoomsByHotelAndDates(hotelId, date1, date2); } else { @@ -73,39 +74,21 @@ public class HotelController { return new ResponseEntity<>(rooms, HttpStatus.OK); } - // Actualizar disponibilidad de habitaciones de un hotel - @PatchMapping("/{hotelId}/rooms/") - // TODO incluir tratamiento por id de habitación - public ResponseEntity<List<Room>> updateRoomAvailabilityFromHotel( - @PathVariable int hotelId, @RequestBody List<Room> updatedRooms) { - - List<Room> existingRooms = roomRepository.findAllByHotelId(hotelId); - for (Room updatedRoom : updatedRooms) { - existingRooms.stream() - .filter(room -> room.getId() == updatedRoom.getId()) // Conversión a Integer - .findFirst() - .ifPresent(room -> room.setAvailable(updatedRoom.isAvailable())); - } - roomRepository.saveAll(existingRooms); - return new ResponseEntity<>(existingRooms, HttpStatus.OK); - } + // Actualizar disponibilidad de una habitación específica en un hotel + @PatchMapping("/{hotelId}/rooms/{roomId}") + public ResponseEntity<Room> updateRoomAvailability( + @PathVariable int hotelId, + @PathVariable int roomId, + @RequestBody boolean available) { - // Mi propuesta para el anterior - // // Actualizar disponibilidad de habitaciones de un hotel - // @PatchMapping("/{hotelId}/rooms/{roomId}") - // // TODO incluir tratamiento por id de habitación - // public ResponseEntity<Room> updateRoomAvailabilityFromHotel( - // @PathVariable int hotelId, @PathVariable int roomId, @RequestBody Map<String, - // Boolean> roomPatch) { - // Room target = roomRepository.findByIdAndHotelId(roomId, hotelId) - // .orElseThrow(() -> new IllegalArgumentException("No founds")); - // if (roomPatch.containsKey("available")) { - // throw new InvalidRequestException("no available field in body request"); - // } - // target.setAvailable(roomPatch.get("available")); - // roomRepository.save(target); - // return new ResponseEntity<>(target, HttpStatus.OK); - // } + Room targetRoom = roomRepository.findByIdAndHotelId(roomId, hotelId) + .orElseThrow(() -> new IllegalArgumentException("Habitación no encontrada")); + + targetRoom.setAvailable(available); + roomRepository.save(targetRoom); + + return new ResponseEntity<>(targetRoom, HttpStatus.OK); + } // Obtener los detalles de una habitación específica en un hotel @GetMapping("/{hotelId}/rooms/{roomId}") diff --git a/java/roomBooking/src/main/java/com/uva/roomBooking/Exceptions/GlobalExceptionHandler.java b/java/roomBooking/src/main/java/com/uva/roomBooking/Exceptions/GlobalExceptionHandler.java index ba79c4e18fe2e79a993494598b9631c897efda70..03b21e27ffa7e4e921cc9801187911d9f1be6a52 100644 --- a/java/roomBooking/src/main/java/com/uva/roomBooking/Exceptions/GlobalExceptionHandler.java +++ b/java/roomBooking/src/main/java/com/uva/roomBooking/Exceptions/GlobalExceptionHandler.java @@ -30,6 +30,15 @@ public class GlobalExceptionHandler { return new ResponseEntity<>(body, HttpStatus.BAD_REQUEST); } + @ExceptionHandler(InvalidDateRangeException.class) + public ResponseEntity<Map<String, Object>> handleInvalidDateRange(InvalidDateRangeException ex) { + Map<String, Object> body = new HashMap<>(); + body.put("timestamp", LocalDateTime.now()); + body.put("message", ex.getMessage()); + + return new ResponseEntity<>(body, HttpStatus.BAD_REQUEST); + } + @ExceptionHandler(Exception.class) public ResponseEntity<Map<String, Object>> handleGeneralException(Exception ex) { Map<String, Object> body = new HashMap<>(); diff --git a/java/roomBooking/src/main/java/com/uva/roomBooking/Exceptions/InvalidDateRangeException.java b/java/roomBooking/src/main/java/com/uva/roomBooking/Exceptions/InvalidDateRangeException.java new file mode 100644 index 0000000000000000000000000000000000000000..17a8420453ef402411b61b965d001560a4dd51ce --- /dev/null +++ b/java/roomBooking/src/main/java/com/uva/roomBooking/Exceptions/InvalidDateRangeException.java @@ -0,0 +1,8 @@ +package com.uva.roomBooking.Exceptions; + +public class InvalidDateRangeException extends RuntimeException { + public InvalidDateRangeException(String message) { + super(message); + } +} +