From 018556d332723a4a00d7de154be082737c202998 Mon Sep 17 00:00:00 2001
From: Oto Stanko <493068@fi.muni.cz>
Date: Mon, 1 May 2023 15:21:33 +0200
Subject: [PATCH] Added error messages to carComponent-car pair service

---
 .../muni/pa165/car/config/PersistingCars.java |  6 +++-
 .../muni/pa165/car/restemplate/DbGetter.java  | 32 +++++++++++++------
 .../service/CarComponentPairServiceImpl.java  | 24 +++++++++++---
 .../pa165/car/service/CarServiceTests.java    |  2 +-
 .../component/service/ComponentService.java   |  3 ++
 5 files changed, 50 insertions(+), 17 deletions(-)

diff --git a/car/src/main/java/cz/muni/pa165/car/config/PersistingCars.java b/car/src/main/java/cz/muni/pa165/car/config/PersistingCars.java
index f624bf1f..fdcc50b4 100644
--- a/car/src/main/java/cz/muni/pa165/car/config/PersistingCars.java
+++ b/car/src/main/java/cz/muni/pa165/car/config/PersistingCars.java
@@ -60,7 +60,11 @@ public class PersistingCars {
   }
 
   private Optional<Long> getRandomComponentId() {
-    List<CarComponentResponseDto> allComponents = dbGetter.getAllComponentsFromDb();
+    var response = dbGetter.getAllComponentsFromDb();
+    if (response.isEmpty()) {
+      return Optional.empty();
+    }
+    List<CarComponentResponseDto> allComponents = response.get();
     if (allComponents.size() != 0) {
       Random random = new Random();
       int index =  random.ints(0,
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 d417c46a..6edaeabc 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
@@ -4,8 +4,10 @@ import cz.muni.pa165.common_library.dtos.CarComponentResponseDto;
 import cz.muni.pa165.common_library.dtos.DriverInsightDto;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Optional;
 import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestClientException;
 import org.springframework.web.client.RestTemplate;
 
 /**
@@ -38,11 +40,16 @@ public class DbGetter {
    * @param id component id
    * @return Component object
    */
-  public CarComponentResponseDto getComponentFromDb(Long id) {
+  public Optional<CarComponentResponseDto> getComponentFromDb(Long id) {
     String url = GET_COMPONENT_URL + id;
-    ResponseEntity<CarComponentResponseDto> response =
-        client.getForEntity(url, CarComponentResponseDto.class);
-    return response.getBody();
+    ResponseEntity<CarComponentResponseDto> response;
+    try {
+      response = client.getForEntity(url, CarComponentResponseDto.class);
+    } catch (RestClientException e) {
+      e.printStackTrace();
+      return Optional.empty();
+    }
+    return Optional.ofNullable(response.getBody());
   }
 
   /**
@@ -50,13 +57,18 @@ public class DbGetter {
    *
    * @return List of all car components in database.
    */
-  public List<CarComponentResponseDto> getAllComponentsFromDb() {
+  public Optional<List<CarComponentResponseDto>> getAllComponentsFromDb() {
     String url = GET_ALL_COMPONENTS;
-    var response =
-        client.getForEntity(url, CarComponentResponseDto[].class);
-    CarComponentResponseDto[] carComponents = response.getBody();
-    assert carComponents != null;
-    return Arrays.stream(carComponents).toList();
+    CarComponentResponseDto[] carComponents;
+    try {
+      var response =
+          client.getForEntity(url, CarComponentResponseDto[].class);
+      carComponents = response.getBody();
+    } catch (RestClientException e) {
+      e.printStackTrace();
+      return Optional.empty();
+    }
+    return Optional.of(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 bbe3fa2c..ce6ae529 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
@@ -46,7 +46,11 @@ public class CarComponentPairServiceImpl implements CarComponentPairService {
       throw new DatabaseException("Component with id " + componentId + " already in use");
     }
     var components = car.getComponents();
-    CarComponentResponseDto carComponent = dbGetter.getComponentFromDb(componentId);
+    var response = dbGetter.getComponentFromDb(componentId);
+    if (response.isEmpty()) {
+      throw new DatabaseException("Component with id " + componentId + " could not be fetched");
+    }
+    CarComponentResponseDto carComponent = response.get();
     components.add(carComponent.getId());
     car.setComponents(components);
     carRepository.save(car);
@@ -75,7 +79,11 @@ public class CarComponentPairServiceImpl implements CarComponentPairService {
         () -> new DatabaseException("Car not found"));
     var componentDtos = new ArrayList<CarComponentResponseDto>();
     for (Long id : car.getComponents()) {
-      CarComponentResponseDto carComponent = dbGetter.getComponentFromDb(id);
+      var response = dbGetter.getComponentFromDb(id);
+      if (response.isEmpty()) {
+        throw new DatabaseException("Components could not be fetched from database");
+      }
+      CarComponentResponseDto carComponent = response.get();
       componentDtos.add(
           new CarComponentResponseDto(
               carComponent.getId(),
@@ -95,7 +103,8 @@ public class CarComponentPairServiceImpl implements CarComponentPairService {
     // get all the components of a given car
     var carComponents = getAllComponentsOfCar(carId);
     if (carComponents == null) {
-      return new ArrayList<>();
+      throw new DatabaseException("Car with id " + carId
+          + " does not have any components assigned");
     }
     // check if the given component is in the car
     boolean found = false;
@@ -106,10 +115,15 @@ public class CarComponentPairServiceImpl implements CarComponentPairService {
       }
     }
     if (!found) {
-      return new ArrayList<>();
+      throw new DatabaseException("Car with id " + carId + " does not have component with id "
+      + componentId + " assigned to it");
     }
     // get all the components from DB
-    List<CarComponentResponseDto> allComponents = dbGetter.getAllComponentsFromDb();
+    var response = dbGetter.getAllComponentsFromDb();
+    if (response.isEmpty()) {
+      throw new DatabaseException("Components could not be fetched from database");
+    }
+    List<CarComponentResponseDto> allComponents = response.get();
     CarComponentResponseDto requestedComponent = null;
     // check if the component is in the DB
     for (CarComponentResponseDto carComponent : allComponents) {
diff --git a/car/src/test/java/cz/muni/pa165/car/service/CarServiceTests.java b/car/src/test/java/cz/muni/pa165/car/service/CarServiceTests.java
index 0c085a41..19f90fc6 100644
--- a/car/src/test/java/cz/muni/pa165/car/service/CarServiceTests.java
+++ b/car/src/test/java/cz/muni/pa165/car/service/CarServiceTests.java
@@ -93,7 +93,7 @@ class CarServiceTests {
     CarComponentResponseDto carComponentDto = CarComponentResponseDto.builder().build();
 
     given(dbGetter.getDriverFromDb(anyLong())).willReturn(driverInsightDto);
-    given(dbGetter.getComponentFromDb(anyLong())).willReturn(carComponentDto);
+    given(dbGetter.getComponentFromDb(anyLong())).willReturn(Optional.ofNullable(carComponentDto));
 
     String response = mockMvc.perform(post("/car/")
             .contentType(MediaType.APPLICATION_JSON)
diff --git a/component/src/main/java/cz/muni/pa165/component/service/ComponentService.java b/component/src/main/java/cz/muni/pa165/component/service/ComponentService.java
index e098ae44..0b97e369 100644
--- a/component/src/main/java/cz/muni/pa165/component/service/ComponentService.java
+++ b/component/src/main/java/cz/muni/pa165/component/service/ComponentService.java
@@ -66,6 +66,9 @@ public class ComponentService implements ComponentServiceInterface {
    */
   @Transactional
   public String deleteById(Long carComponentId) {
+    componentRepository.findById(carComponentId).orElseThrow(
+        () -> new DatabaseException("Car component with id: "
+            + carComponentId + " is not in the database."));
     componentRepository.deleteById(carComponentId);
     return "Car component with id: " + carComponentId + "was successfully deleted";
   }
-- 
GitLab