diff --git a/car/src/main/java/cz/muni/pa165/car/data/model/Car.java b/car/src/main/java/cz/muni/pa165/car/data/model/Car.java index 75d61eed69f2b7274cb105df5fe2a7f16c852360..1d4d9ed2fff499e5b526ff122c9de2632b839ef1 100644 --- a/car/src/main/java/cz/muni/pa165/car/data/model/Car.java +++ b/car/src/main/java/cz/muni/pa165/car/data/model/Car.java @@ -8,7 +8,7 @@ import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.Table; import java.io.Serializable; -import java.util.List; +import java.util.Set; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -30,10 +30,10 @@ public class Car implements Serializable { private Long id; @ElementCollection(targetClass = Long.class, fetch = FetchType.EAGER) - private List<Long> components; + private Set<Long> components; @ElementCollection(targetClass = Long.class, fetch = FetchType.EAGER) - private List<Long> drivers; + private Set<Long> drivers; private Long mainDriverId; diff --git a/car/src/main/java/cz/muni/pa165/car/mapper/CarMapper.java b/car/src/main/java/cz/muni/pa165/car/mapper/CarMapper.java index 44ea6e762f75ad7b8c9d366f46c64dc6441858e8..0349e541db453f6e8d16e9d8043f8a85fb3a4a2f 100644 --- a/car/src/main/java/cz/muni/pa165/car/mapper/CarMapper.java +++ b/car/src/main/java/cz/muni/pa165/car/mapper/CarMapper.java @@ -1,8 +1,14 @@ package cz.muni.pa165.car.mapper; +import static cz.muni.pa165.car.restemplate.DbGetter.getComponentFromDb; + import cz.muni.pa165.car.data.model.Car; import cz.muni.pa165.common_library.dtos.CarRequestDto; import cz.muni.pa165.common_library.dtos.CarResponseDto; +import cz.muni.pa165.common_library.exception.DatabaseException; +import cz.muni.pa165.component.data.model.CarComponent; +import java.util.ArrayList; +import java.util.HashSet; /** * Class for converting Car object and its Data Transfer Objects. @@ -19,8 +25,8 @@ public class CarMapper { return Car.builder() .id(null) - .components(carRequestDto.getComponentIds()) - .drivers(carRequestDto.getDriverIds()) + .components(new HashSet<>(carRequestDto.getComponentIds())) + .drivers(new HashSet<>(carRequestDto.getDriverIds())) .mainDriverId(carRequestDto.getMainDriverId()) .build(); } @@ -35,10 +41,11 @@ public class CarMapper { return CarResponseDto.builder() .id(car.getId()) - .componentIdsNames(car.getComponents()) - .driverIdsNames(car.getDrivers()) + .componentIdsNames(new ArrayList<>(car.getComponents())) + .driverIdsNames(new ArrayList<>(car.getDrivers())) .mainDriverId(car.getMainDriverId()) .build(); } + } diff --git a/car/src/main/java/cz/muni/pa165/car/rest/CarComponentPairController.java b/car/src/main/java/cz/muni/pa165/car/rest/CarComponentPairController.java index 8cbf5a412fee36051c429724beaf427698a88b8f..fda1065405516adde4a0118955571469e1d75a76 100644 --- a/car/src/main/java/cz/muni/pa165/car/rest/CarComponentPairController.java +++ b/car/src/main/java/cz/muni/pa165/car/rest/CarComponentPairController.java @@ -1,5 +1,6 @@ package cz.muni.pa165.car.rest; +import cz.muni.pa165.car.restemplate.DbGetter; import cz.muni.pa165.car.service.CarComponentPairService; import cz.muni.pa165.common_library.dtos.CarComponentDto; import cz.muni.pa165.common_library.dtos.CarRequestDto; @@ -9,6 +10,8 @@ import java.util.List; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.Mapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @@ -71,5 +74,17 @@ public class CarComponentPairController { return ResponseEntity.ok(carComponentService.getAllComponentsOfCar(carId)); } + /** + * Calls service to get all components. + * + * @return List of components. + */ + @Operation(summary = "Get all components from component repo") + @GetMapping(path = "/getcomponents", + produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity<List<CarComponentDto>> getAllCarComponents() { + return ResponseEntity.ok(DbGetter.getAllComponentsFromDb()); + } + } diff --git a/car/src/main/java/cz/muni/pa165/car/restemplate/DbGetter.java b/car/src/main/java/cz/muni/pa165/car/restemplate/DbGetter.java index 3274ed957b8ba8174fae68c3f2e12e8ce424719f..4d4c0f7115ed091733abc690264131eb38025af1 100644 --- a/car/src/main/java/cz/muni/pa165/car/restemplate/DbGetter.java +++ b/car/src/main/java/cz/muni/pa165/car/restemplate/DbGetter.java @@ -1,5 +1,6 @@ package cz.muni.pa165.car.restemplate; +import cz.muni.pa165.common_library.dtos.CarComponentDto; import cz.muni.pa165.component.data.model.CarComponent; import cz.muni.pa165.driver.data.model.Driver; import org.springframework.beans.factory.annotation.Autowired; @@ -7,18 +8,20 @@ import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; +import java.util.Arrays; +import java.util.List; + /** * Class for retrieving data from other modules using RestTemplate. */ @Component public class DbGetter { - @Autowired private static RestTemplate client = new RestTemplate(); private static final String GET_DRIVER_URL = "http://localhost:8083/driver/get/id="; - private static final String GET_COMPONENT_URL = "http://localhost:8084/component?id="; - private static final String GET_ALL_COMPONENTS = "http://localhost:8084/component"; + private static final String GET_COMPONENT_URL = "http://localhost:8084/component/id?componentId="; + private static final String GET_ALL_COMPONENTS = "http://localhost:8084/component/"; /** * Get a driver using RestTemplate client. @@ -44,4 +47,12 @@ public class DbGetter { return response.getBody(); } + public static List<CarComponentDto> getAllComponentsFromDb() { + String url = GET_ALL_COMPONENTS; + var response = client.getForEntity(url, CarComponentDto[].class); + CarComponentDto[] carComponents = response.getBody(); + assert carComponents != null; + return Arrays.stream(carComponents).toList(); + } + } diff --git a/car/src/main/java/cz/muni/pa165/car/service/CarComponentPairServiceImpl.java b/car/src/main/java/cz/muni/pa165/car/service/CarComponentPairServiceImpl.java index f0afe6ccf9ef3677214f516a2c6e32136946a6b8..b7007a67fde7f088299429a6fa32ff5fb7599b3a 100644 --- a/car/src/main/java/cz/muni/pa165/car/service/CarComponentPairServiceImpl.java +++ b/car/src/main/java/cz/muni/pa165/car/service/CarComponentPairServiceImpl.java @@ -2,6 +2,7 @@ package cz.muni.pa165.car.service; import static cz.muni.pa165.car.restemplate.DbGetter.getComponentFromDb; +import cz.muni.pa165.car.data.model.Car; import cz.muni.pa165.car.data.repository.CarRepository; import cz.muni.pa165.car.mapper.CarMapper; import cz.muni.pa165.common_library.dtos.CarComponentDto; @@ -9,6 +10,7 @@ import cz.muni.pa165.common_library.dtos.CarResponseDto; import cz.muni.pa165.common_library.exception.DatabaseException; import cz.muni.pa165.component.data.model.CarComponent; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.Objects; import org.springframework.stereotype.Service; @@ -34,8 +36,13 @@ public class CarComponentPairServiceImpl implements CarComponentPairService { public CarResponseDto addComponent(Long componentId, Long carId) { var car = carRepository.findById(carId).orElseThrow( () -> new DatabaseException("Car not found")); + + if (isComponentInUse(componentId, carId)) { + throw new DatabaseException("Component with id " + componentId + " already in use"); + } var components = car.getComponents(); - components.add(componentId); + CarComponent carComponent = getComponentFromDb(componentId); + components.add(carComponent.getId()); car.setComponents(components); carRepository.save(car); return CarMapper.carConverterToDto(car); @@ -45,7 +52,7 @@ public class CarComponentPairServiceImpl implements CarComponentPairService { public CarResponseDto removeComponent(Long componentId, Long carId) { var car = carRepository.findById(carId).orElseThrow( () -> new DatabaseException("Car not found")); - var components = new ArrayList<Long>(); + var components = new HashSet<Long>(); for (Long id : car.getComponents()) { if (!Objects.equals(id, componentId)) { components.add(id); @@ -76,4 +83,15 @@ public class CarComponentPairServiceImpl implements CarComponentPairService { return componentDtos; } + private boolean isComponentInUse(Long componentId, Long carId) { + var cars = carRepository.findAll(); + + for (Car car : cars) { + if (car.getComponents().stream() + .anyMatch(x -> x.longValue() == componentId && !Objects.equals(car.getId(), carId))) { + return true; + } + } + return false; + } } diff --git a/car/src/main/java/cz/muni/pa165/car/service/CarDriverPairServiceImpl.java b/car/src/main/java/cz/muni/pa165/car/service/CarDriverPairServiceImpl.java index dabba4a173a72b33faefd6aed346f495597243d5..013c4eeceae1d2d5cc1041a4bcd3da364f3118a8 100644 --- a/car/src/main/java/cz/muni/pa165/car/service/CarDriverPairServiceImpl.java +++ b/car/src/main/java/cz/muni/pa165/car/service/CarDriverPairServiceImpl.java @@ -9,6 +9,7 @@ import cz.muni.pa165.common_library.dtos.DriverDto; import cz.muni.pa165.common_library.exception.DatabaseException; import cz.muni.pa165.driver.data.model.Driver; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.Objects; import org.springframework.stereotype.Service; @@ -34,9 +35,12 @@ public class CarDriverPairServiceImpl implements CarDriverPairService { public CarResponseDto assignDriverToCar(Long driverId, Long carId) { var car = carRepository.findById(carId).orElseThrow( () -> new DatabaseException("Car not found")); + var drivers = car.getDrivers(); - drivers.add(driverId); + var savedDriver = getDriverFromDb(driverId); + drivers.add(savedDriver.getId()); car.setDrivers(drivers); + carRepository.save(car); return CarMapper.carConverterToDto(car); } @@ -45,7 +49,7 @@ public class CarDriverPairServiceImpl implements CarDriverPairService { public CarResponseDto unassignDriverFromCar(Long driverId, Long carId) { var car = carRepository.findById(carId).orElseThrow( () -> new DatabaseException("Car not found")); - var drivers = new ArrayList<Long>(); + var drivers = new HashSet<Long>(); for (Long id : car.getDrivers()) { if (!Objects.equals(id, driverId)) { drivers.add(id); @@ -76,7 +80,9 @@ public class CarDriverPairServiceImpl implements CarDriverPairService { public CarResponseDto setMainDriver(Long carId, Long driverId) { var car = carRepository.findById(carId).orElseThrow( () -> new DatabaseException("Car not found")); - car.setMainDriverId(driverId); + + var savedDriver = getDriverFromDb(driverId); + car.setMainDriverId(savedDriver.getId()); carRepository.save(car); return CarMapper.carConverterToDto(car); } diff --git a/car/src/main/java/cz/muni/pa165/car/service/CarServiceImpl.java b/car/src/main/java/cz/muni/pa165/car/service/CarServiceImpl.java index 874dbf4a907219b91a5d232c17e6f5dd64113cd9..38f8d647f3621f3baa6413ab6d99339b8f83d58a 100644 --- a/car/src/main/java/cz/muni/pa165/car/service/CarServiceImpl.java +++ b/car/src/main/java/cz/muni/pa165/car/service/CarServiceImpl.java @@ -3,12 +3,15 @@ package cz.muni.pa165.car.service; import static cz.muni.pa165.car.mapper.CarMapper.carConverterToDto; import static cz.muni.pa165.car.mapper.CarMapper.carDtoConverter; +import cz.muni.pa165.car.data.model.Car; import cz.muni.pa165.car.data.repository.CarRepository; import cz.muni.pa165.car.mapper.CarMapper; +import cz.muni.pa165.car.restemplate.DbGetter; import cz.muni.pa165.common_library.dtos.CarRequestDto; import cz.muni.pa165.common_library.dtos.CarResponseDto; import cz.muni.pa165.common_library.exception.DatabaseException; import java.util.List; +import java.util.Objects; import org.springframework.stereotype.Service; @@ -31,6 +34,14 @@ public class CarServiceImpl implements CarService { @Override public CarResponseDto postCar(CarRequestDto carRequestDto) { + + var componentIds = carRequestDto.getComponentIds(); + for (Long componentId : componentIds) { + if (isComponentInUse(componentId)) { + throw new DatabaseException("Component with id " + componentId + " already in use"); + } + DbGetter.getComponentFromDb(componentId); + } return carConverterToDto(carRepository.save(carDtoConverter(carRequestDto))); } @@ -58,4 +69,15 @@ public class CarServiceImpl implements CarService { return "Car with id = " + carId + " deleted!"; } + private boolean isComponentInUse(Long componentId) { + var cars = carRepository.findAll(); + + for (Car car : cars) { + if (car.getComponents().stream() + .anyMatch(x -> x.longValue() == componentId)) { + return true; + } + } + return false; + } }