From b0d743cf70b76dd7e68640cb3e0eca6a71b26cce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Diana=20Gul=C4=8D=C3=ADkov=C3=A1?= <xgulcik@fi.muni.cz> Date: Sun, 16 Apr 2023 13:43:26 +0200 Subject: [PATCH] small fixes --- .../cz/muni/pa165/car/data/model/Car.java | 6 ++--- .../cz/muni/pa165/car/mapper/CarMapper.java | 15 +++++++++---- .../muni/pa165/car/restemplate/DbGetter.java | 3 +-- .../service/CarComponentPairServiceImpl.java | 22 +++++++++++++++++-- .../car/service/CarDriverPairServiceImpl.java | 12 +++++++--- .../pa165/car/service/CarServiceImpl.java | 22 +++++++++++++++++++ 6 files changed, 66 insertions(+), 14 deletions(-) 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 75d61eed..1d4d9ed2 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 44ea6e76..0349e541 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/restemplate/DbGetter.java b/car/src/main/java/cz/muni/pa165/car/restemplate/DbGetter.java index 61a43c0b..3dda980a 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 @@ -13,11 +13,10 @@ import org.springframework.web.client.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_COMPONENT_URL = "http://localhost:8084/component/id?componentId="; /** * Get a driver using RestTemplate client. 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 f0afe6cc..522d89b4 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 dabba4a1..013c4eec 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 874dbf4a..e9f3d01d 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; + } } -- GitLab