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