From ad139d5b1cf6e384b2e4efb4f6ec8c2db3a25216 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Martin=20Slov=C3=ADk?= <xslovik@fi.muni.cz>
Date: Wed, 5 Apr 2023 23:00:45 +0200
Subject: [PATCH] Implementing Airplane update

---
 .../core/facade/airplane/AirplaneFacade.java  |  2 ++
 .../facade/airplane/AirplaneFacadeImpl.java   | 36 +++++++++++++------
 .../pa165/core/rest/AirplaneController.java   |  6 ++--
 .../service/airplane/AirplaneService.java     |  1 +
 .../service/airplane/AirplaneServiceImpl.java | 12 +++++++
 5 files changed, 43 insertions(+), 14 deletions(-)

diff --git a/core/src/main/java/cz/muni/fi/pa165/core/facade/airplane/AirplaneFacade.java b/core/src/main/java/cz/muni/fi/pa165/core/facade/airplane/AirplaneFacade.java
index 09a4492..f260b24 100644
--- a/core/src/main/java/cz/muni/fi/pa165/core/facade/airplane/AirplaneFacade.java
+++ b/core/src/main/java/cz/muni/fi/pa165/core/facade/airplane/AirplaneFacade.java
@@ -25,4 +25,6 @@ public interface AirplaneFacade<K> {
     AirplaneDto assignAirplaneType(Long airplaneId, Long airplaneTypeId);
 
     void deleteAirplaneTypeAssignment(Long airplaneId, Long airplaneTypeId);
+
+    AirplaneDto update(Long id, NewAirplaneDtoRequest newAirplaneDto);
 }
diff --git a/core/src/main/java/cz/muni/fi/pa165/core/facade/airplane/AirplaneFacadeImpl.java b/core/src/main/java/cz/muni/fi/pa165/core/facade/airplane/AirplaneFacadeImpl.java
index b0f969d..d9b9f44 100644
--- a/core/src/main/java/cz/muni/fi/pa165/core/facade/airplane/AirplaneFacadeImpl.java
+++ b/core/src/main/java/cz/muni/fi/pa165/core/facade/airplane/AirplaneFacadeImpl.java
@@ -1,6 +1,7 @@
 package cz.muni.fi.pa165.core.facade.airplane;
 
 import cz.muni.fi.pa165.core.data.domain.Airplane;
+import cz.muni.fi.pa165.core.exceptions.ResourceNotFoundException;
 import cz.muni.fi.pa165.core.model.AirplaneDto;
 import cz.muni.fi.pa165.core.model.AirplaneTypeDto;
 import cz.muni.fi.pa165.core.model.NewAirplaneDtoRequest;
@@ -42,7 +43,7 @@ public class AirplaneFacadeImpl implements AirplaneFacade<Long> {
 
     @Override
     public List<AirplaneDto> findAll() {
-        var entities = airplaneTypeService.findAll();
+        var entities = airplaneService.findAll();
         return entities.stream()
                 .map(entity -> modelMapper.map(entity, AirplaneDto.class))
                 .toList();
@@ -63,19 +64,17 @@ public class AirplaneFacadeImpl implements AirplaneFacade<Long> {
         var airplaneEntityOpt = airplaneService.findById(airplaneId);
         var airplaneTypeEntityOpt = airplaneTypeService.findById(airplaneTypeId);
 
-        if (airplaneEntityOpt.isPresent() && airplaneTypeEntityOpt.isPresent()) {
-            var airplaneEntity = airplaneEntityOpt.get();
-            var airplaneTypeEntity = airplaneTypeEntityOpt.get();
+        if (airplaneEntityOpt.isEmpty() || airplaneTypeEntityOpt.isEmpty()) {
+            throw new ResourceNotFoundException("Not Found.");
+        }
 
-            airplaneEntity.setType(airplaneTypeEntity);
-            var airplaneTypeDto = modelMapper.map(airplaneTypeEntity, AirplaneTypeDto.class);
-            var airplaneDto = modelMapper.map(airplaneEntity, AirplaneDto.class);
-            airplaneDto.setType(airplaneTypeDto);
+        var airplaneEntity = airplaneEntityOpt.get();
+        var airplaneTypeEntity = airplaneTypeEntityOpt.get();
 
-            return airplaneDto;
-        }
+        airplaneEntity.setType(airplaneTypeEntity);
+        airplaneService.save(airplaneEntity);
 
-        return null;
+        return mapToDtoWithMember(airplaneEntity);
     }
 
     @Override
@@ -87,4 +86,19 @@ public class AirplaneFacadeImpl implements AirplaneFacade<Long> {
             airplaneEntity.get().setType(null);
         }
     }
+
+    @Override
+    public AirplaneDto update(Long id, NewAirplaneDtoRequest newAirplaneDto) {
+        var newAirplaneEntity = modelMapper.map(newAirplaneDto, Airplane.class);
+
+        return modelMapper.map(airplaneService.update(id, newAirplaneEntity), AirplaneDto.class);
+    }
+
+    private AirplaneDto mapToDtoWithMember(Airplane airplane) {
+        var airplaneTypeDto = modelMapper.map(airplane.getType(), AirplaneTypeDto.class);
+        var airplaneDto = modelMapper.map(airplane, AirplaneDto.class);
+        airplaneDto.setType(airplaneTypeDto);
+
+        return airplaneDto;
+    }
 }
diff --git a/core/src/main/java/cz/muni/fi/pa165/core/rest/AirplaneController.java b/core/src/main/java/cz/muni/fi/pa165/core/rest/AirplaneController.java
index 5272433..d108beb 100644
--- a/core/src/main/java/cz/muni/fi/pa165/core/rest/AirplaneController.java
+++ b/core/src/main/java/cz/muni/fi/pa165/core/rest/AirplaneController.java
@@ -108,14 +108,14 @@ public class AirplaneController implements AirplaneApiDelegate {
      * Updates a airplane by id and returns it as a response.
      *
      * @param id          (required)
-     * @param airplaneDto (required)
+     * @param newAirplaneDtoRequest (required)
      * @return OK (status code 200)
      * or Input data not correct (status code 400)
      * @see AirplaneApi#updateAirplane
      */
     @Override
-    public ResponseEntity<AirplaneDto> updateAirplane(Long id, AirplaneDto airplaneDto) {
-        return AirplaneApiDelegate.super.updateAirplane(id, airplaneDto);
+    public ResponseEntity<AirplaneDto> updateAirplane(Long id, NewAirplaneDtoRequest newAirplaneDtoRequest) {
+        return ResponseEntity.ok(airplaneFacade.update(id, newAirplaneDtoRequest));
     }
 
     /**
diff --git a/core/src/main/java/cz/muni/fi/pa165/core/service/airplane/AirplaneService.java b/core/src/main/java/cz/muni/fi/pa165/core/service/airplane/AirplaneService.java
index eefbeed..c724f1e 100644
--- a/core/src/main/java/cz/muni/fi/pa165/core/service/airplane/AirplaneService.java
+++ b/core/src/main/java/cz/muni/fi/pa165/core/service/airplane/AirplaneService.java
@@ -5,4 +5,5 @@ import cz.muni.fi.pa165.core.service.common.BaseService;
 
 public interface AirplaneService extends BaseService<Airplane, Long> {
 
+    Airplane update(Long id, Airplane newAirplane);
 }
diff --git a/core/src/main/java/cz/muni/fi/pa165/core/service/airplane/AirplaneServiceImpl.java b/core/src/main/java/cz/muni/fi/pa165/core/service/airplane/AirplaneServiceImpl.java
index 26dedd4..a69211a 100644
--- a/core/src/main/java/cz/muni/fi/pa165/core/service/airplane/AirplaneServiceImpl.java
+++ b/core/src/main/java/cz/muni/fi/pa165/core/service/airplane/AirplaneServiceImpl.java
@@ -2,6 +2,7 @@ package cz.muni.fi.pa165.core.service.airplane;
 
 import cz.muni.fi.pa165.core.data.domain.Airplane;
 import cz.muni.fi.pa165.core.data.repository.airplane.AirplaneRepository;
+import cz.muni.fi.pa165.core.exceptions.ResourceNotFoundException;
 import cz.muni.fi.pa165.core.service.common.BaseServiceImpl;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -16,4 +17,15 @@ public class AirplaneServiceImpl extends BaseServiceImpl<Airplane, Long> impleme
         super(airplaneRepository);
         this.airplaneRepository = airplaneRepository;
     }
+
+    @Override
+    public Airplane update(Long id, Airplane newAirplane) {
+        var entityToUpdate = airplaneRepository.findById(id)
+                .orElseThrow(() -> new ResourceNotFoundException("Not Found."));
+
+        entityToUpdate.setName(newAirplane.getName());
+        entityToUpdate.setCapacity(newAirplane.getCapacity());
+
+        return airplaneRepository.save(entityToUpdate);
+    }
 }
-- 
GitLab