Skip to content
Snippets Groups Projects
Commit f3a552fe authored by hugcubi's avatar hugcubi
Browse files

Cambiada estructura de paquetes e incluído método HotelService

parent de09a3bd
No related branches found
No related tags found
2 merge requests!36Develop,!32Dev/service hotels
Showing
with 214 additions and 11 deletions
......@@ -9,7 +9,7 @@ import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import com.uva.monolith.filter.JwtAuthenticationFilter;
import com.uva.monolith.services.hotels.models.external.users.UserRol;
import com.uva.monolith.models.external.users.UserRol;
@Configuration
@EnableWebSecurity
......
......
package com.uva.monolith.services.hotels.controllers;
package com.uva.monolith.controllers;
import java.util.List;
import java.util.Map;
......@@ -16,149 +16,76 @@ import com.uva.monolith.api.ManagerAPI;
import com.uva.monolith.exceptions.HotelNotFoundException;
import com.uva.monolith.exceptions.InvalidDateRangeException;
import com.uva.monolith.exceptions.InvalidRequestException;
import com.uva.monolith.services.hotels.models.Hotel;
import com.uva.monolith.services.hotels.models.Room;
import com.uva.monolith.services.hotels.repositories.HotelRepository;
import com.uva.monolith.services.hotels.repositories.RoomRepository;
import com.uva.monolith.models.Hotel;
import com.uva.monolith.models.Room;
import com.uva.monolith.repositories.HotelRepository;
import com.uva.monolith.repositories.RoomRepository;
import com.uva.monolith.services.HotelService;
@RestController
@RequestMapping("hotels")
@CrossOrigin(origins = "*")
public class HotelController {
@Autowired
private HotelRepository hotelRepository;
@Autowired
private RoomRepository roomRepository;
@Autowired
private BookingAPI bookingAPI;
@Autowired
private ManagerAPI managerAPI;
private HotelService hotelService;
// Obtener todos los hoteles
@GetMapping
public List<Hotel> getAllHotels(
@RequestParam(required = false) Integer managerId,
@RequestParam(required = false) LocalDate start,
@RequestParam(required = false) LocalDate end) {
List<Hotel> hotels = (managerId != null)
? hotelRepository.findAllByManagerId(managerId)
: hotelRepository.findAll();
if (start != null && end != null) {
// Filtramos para los hoteles que
// tengan habitaciones disponibles para ese rango de fechas
Set<Integer> notAvailableRoomsId = bookingAPI.getNotAvailableRooms(start, end);
hotels = hotels.stream().map(h -> {
if (h.getRooms().size() == 0)
return h;
List<Room> rooms = h.getRooms().stream()
.filter(r -> notAvailableRoomsId.contains(r.getId())).toList();
h.setRooms(rooms);
return h;
}).filter(h -> h.getRooms().size() >= 0).toList();
}
return hotels;
return hotelService.getAllHotels(managerId, start, end);
}
// Añadir un hotel con sus habitaciones
@PostMapping
public ResponseEntity<?> addHotel(@RequestBody Hotel hotel) {
try {
boolean exist = managerAPI.existsManagerById(hotel.getManagerId());
String message = "No existe el manager con id " + String.valueOf(hotel.getManagerId());
if (!exist) {
return new ResponseEntity<>(message, HttpStatus.BAD_REQUEST);
}
Hotel savedHotel = hotelRepository.save(hotel);
Hotel savedHotel = hotelService.addHotel(hotel);
return new ResponseEntity<>(savedHotel, HttpStatus.CREATED);
} catch (Exception e) {
e.printStackTrace(System.err);
throw e;
}
}
// Obtener un hotel por su ID
@GetMapping("/{id}")
public Hotel getHotelById(@PathVariable int id) {
return hotelRepository.findById(id)
.orElseThrow(() -> new HotelNotFoundException(id));
return hotelService.getHotelById(id);
}
// Borrar hoteles administrados por un manager concreto
@DeleteMapping
public ResponseEntity<?> deleteHotelsByManagerId(
@RequestParam(required = true) Integer managerId) {
List<Hotel> hotels = hotelRepository.findAllByManagerId(managerId);
if (hotels.isEmpty()) {
return new ResponseEntity<>("No hay hoteles para el manager con id " + managerId, HttpStatus.BAD_REQUEST);
}
bookingAPI.deleteAllByManagerId(managerId);
hotelRepository.deleteAll(hotels);
List<Hotel> hotels = hotelService.deleteHotelsByManagerId(managerId);
return new ResponseEntity<>(hotels, HttpStatus.OK);
}
// Borrar un hotel junto con sus habitaciones (borrado en cascada)
@DeleteMapping("/{id}")
@Transactional
public ResponseEntity<Void> deleteHotel(@PathVariable Integer id) {
Hotel target = hotelRepository.findById(id)
.orElseThrow(() -> new HotelNotFoundException(id));
bookingAPI.deleteAllByHotelId(id);
hotelRepository.delete(target);
hotelService.deleteHotel(id);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
// Obtener habitaciones de un hotel según disponibilidad y fechas
@GetMapping("/{hotelId}/rooms")
public ResponseEntity<List<Room>> getRoomsFromHotel(
@PathVariable int hotelId,
@RequestParam(required = false) LocalDate start,
@RequestParam(required = false) LocalDate end) {
List<Room> rooms;
boolean dateMode = start != null && end != null;
if (dateMode) {
if (!start.isBefore(end)) {
throw new InvalidDateRangeException("La fecha de inicio debe ser anterior a la fecha de fin");
}
}
rooms = roomRepository.findAllByHotelId(hotelId);
if (dateMode) {
// Consultar el set de ids ocupados del id
Set<Integer> notAvailableRoomsId = bookingAPI.getNotAvailableRooms(hotelId, start, end);
rooms = rooms.stream()
.filter(r -> notAvailableRoomsId.contains(r.getId())).toList();
}
List<Room> rooms = hotelService.getRoomsFromHotel(hotelId, start, end);
return new ResponseEntity<>(rooms, 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 Map<String, Boolean> body) {
if (!body.containsKey("available")) {
throw new InvalidRequestException("El campo 'available' es obligatorio");
}
Room targetRoom = roomRepository.findByIdAndHotelId(roomId, hotelId)
.orElseThrow(() -> new IllegalArgumentException("Habitación no encontrada"));
targetRoom.setAvailable(body.get("available"));
roomRepository.save(targetRoom);
return new ResponseEntity<>(targetRoom, HttpStatus.OK);
Room updatedRoom = hotelService.updateRoomAvailability(hotelId, roomId, body.get("available"));
return new ResponseEntity<>(updatedRoom, HttpStatus.OK);
}
// Obtener los detalles de una habitación específica en un hotel
@GetMapping("/{hotelId}/rooms/{roomId}")
public Room getRoomByIdFromHotel(
@PathVariable int hotelId, @PathVariable int roomId) {
return roomRepository.findByIdAndHotelId(roomId, hotelId)
.orElseThrow(() -> new HotelNotFoundException(hotelId));
return hotelService.getRoomByIdFromHotel(hotelId, roomId);
}
}
......@@ -4,7 +4,7 @@ import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.uva.monolith.services.hotels.models.external.users.UserRol;
import com.uva.monolith.models.external.users.UserRol;
import com.auth0.jwt.exceptions.JWTVerificationException;
import org.springframework.beans.factory.annotation.Value;
......
......
......@@ -7,7 +7,7 @@ import org.springframework.http.client.ClientHttpResponse;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.stereotype.Component;
import com.uva.monolith.services.hotels.models.external.users.UserRol;
import com.uva.monolith.models.external.users.UserRol;
import com.uva.monolith.utils.JwtUtil;
import java.io.IOException;
......
......
package com.uva.monolith.services.hotels.models;
package com.uva.monolith.models;
import com.fasterxml.jackson.annotation.JsonIgnore;
......
......
package com.uva.monolith.services.hotels.models;
package com.uva.monolith.models;
import java.util.List;
......
......
package com.uva.monolith.services.hotels.models;
package com.uva.monolith.models;
import com.fasterxml.jackson.annotation.JsonIgnore;
......
......
package com.uva.monolith.services.hotels.models;
package com.uva.monolith.models;
public enum RoomType {
SINGLE,
......
......
package com.uva.monolith.services.hotels.models.external.users;
package com.uva.monolith.models.external.users;
public enum UserRol {
ADMIN, CLIENT, HOTEL_ADMIN
......
......
package com.uva.monolith.services.hotels.repositories;
package com.uva.monolith.repositories;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import com.uva.monolith.services.hotels.models.Hotel;
import com.uva.monolith.models.Hotel;
public interface HotelRepository extends JpaRepository<Hotel, Integer> {
List<Hotel> findAllByManagerId(Integer managerId);
......
......
package com.uva.monolith.services.hotels.repositories;
package com.uva.monolith.repositories;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import com.uva.monolith.services.hotels.models.Room;
import com.uva.monolith.models.Room;
import java.time.LocalDate;
import java.util.List;
......
......
package com.uva.monolith.services;
import java.time.LocalDate;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.uva.monolith.api.BookingAPI;
import com.uva.monolith.api.ManagerAPI;
import com.uva.monolith.exceptions.HotelNotFoundException;
import com.uva.monolith.exceptions.InvalidDateRangeException;
import com.uva.monolith.exceptions.InvalidRequestException;
import com.uva.monolith.models.Hotel;
import com.uva.monolith.models.Room;
import com.uva.monolith.repositories.HotelRepository;
import com.uva.monolith.repositories.RoomRepository;
@Service
public class HotelService {
@Autowired
private HotelRepository hotelRepository;
@Autowired
private RoomRepository roomRepository;
@Autowired
private BookingAPI bookingAPI;
@Autowired
private ManagerAPI managerAPI;
public List<Hotel> getAllHotels(Integer managerId, LocalDate start, LocalDate end) {
List<Hotel> hotels = (managerId != null)
? hotelRepository.findAllByManagerId(managerId)
: hotelRepository.findAll();
if (start != null && end != null) {
if (!start.isBefore(end)) {
throw new InvalidDateRangeException("La fecha de inicio debe ser anterior a la fecha de fin");
}
Set<Integer> notAvailableRoomsId = bookingAPI.getNotAvailableRooms(start, end);
hotels = hotels.stream().map(h -> {
List<Room> rooms = h.getRooms().stream()
.filter(r -> notAvailableRoomsId.contains(r.getId()))
.toList();
h.setRooms(rooms);
return h;
}).filter(h -> !h.getRooms().isEmpty()).toList();
}
return hotels;
}
public Hotel addHotel(Hotel hotel) {
boolean exist = managerAPI.existsManagerById(hotel.getManagerId());
if (!exist) {
throw new InvalidRequestException("No existe el manager con id " + hotel.getManagerId());
}
return hotelRepository.save(hotel);
}
public Hotel getHotelById(int id) {
return hotelRepository.findById(id)
.orElseThrow(() -> new HotelNotFoundException(id));
}
public List<Hotel> deleteHotelsByManagerId(int managerId) {
List<Hotel> hotels = hotelRepository.findAllByManagerId(managerId);
if (hotels.isEmpty()) {
throw new InvalidRequestException("No hay hoteles para el manager con id " + managerId);
}
bookingAPI.deleteAllByManagerId(managerId);
hotelRepository.deleteAll(hotels);
return hotels;
}
public void deleteHotel(int id) {
Hotel target = hotelRepository.findById(id)
.orElseThrow(() -> new HotelNotFoundException(id));
bookingAPI.deleteAllByHotelId(id);
hotelRepository.delete(target);
}
public List<Room> getRoomsFromHotel(int hotelId, LocalDate start, LocalDate end) {
List<Room> rooms = roomRepository.findAllByHotelId(hotelId);
if (start != null && end != null) {
if (!start.isBefore(end)) {
throw new InvalidDateRangeException("La fecha de inicio debe ser anterior a la fecha de fin");
}
Set<Integer> notAvailableRoomsId = bookingAPI.getNotAvailableRooms(hotelId, start, end);
rooms = rooms.stream()
.filter(r -> !notAvailableRoomsId.contains(r.getId()))
.toList();
}
return rooms;
}
public Room updateRoomAvailability(int hotelId, int roomId, boolean available) {
Room targetRoom = roomRepository.findByIdAndHotelId(roomId, hotelId)
.orElseThrow(() -> new InvalidRequestException("Habitación no encontrada"));
targetRoom.setAvailable(available);
return roomRepository.save(targetRoom);
}
public Room getRoomByIdFromHotel(int hotelId, int roomId) {
return roomRepository.findByIdAndHotelId(roomId, hotelId)
.orElseThrow(() -> new HotelNotFoundException(hotelId));
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment