Эх сурвалжийг харах

making rest api better again

Fabien CHERET 5 жил өмнө
parent
commit
f0d31bc3db

+ 13 - 31
src/main/java/eu/fibane/parkingtoll/api/ParkingLotApiController.java

@@ -1,6 +1,6 @@
 package eu.fibane.parkingtoll.api;
 package eu.fibane.parkingtoll.api;
 
 
-import eu.fibane.parkingtoll.core.PersistenceManager;
+import eu.fibane.parkingtoll.service.ParkingLotService;
 import eu.fibane.parkingtoll.model.CarSlot;
 import eu.fibane.parkingtoll.model.CarSlot;
 import eu.fibane.parkingtoll.model.ParkingLot;
 import eu.fibane.parkingtoll.model.ParkingLot;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
@@ -10,21 +10,19 @@ import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 
 
 import javax.validation.Valid;
 import javax.validation.Valid;
-import java.math.BigDecimal;
 import java.net.URI;
 import java.net.URI;
 import java.util.Collection;
 import java.util.Collection;
-import java.util.stream.Collectors;
 
 
 @RestController
 @RestController
 public class ParkingLotApiController {
 public class ParkingLotApiController {
 
 
     private static final Logger log = LoggerFactory.getLogger(ParkingLotApiController.class);
     private static final Logger log = LoggerFactory.getLogger(ParkingLotApiController.class);
 
 
-    private PersistenceManager persistenceManager;
+    private ParkingLotService controller;
 
 
     @Autowired
     @Autowired
-    public ParkingLotApiController(PersistenceManager persistenceManager) {
-        this.persistenceManager = persistenceManager;
+    public ParkingLotApiController(ParkingLotService controller) {
+        this.controller = controller;
     }
     }
 
 
     @PostMapping(value = "/parking_lot",
     @PostMapping(value = "/parking_lot",
@@ -32,7 +30,7 @@ public class ParkingLotApiController {
             consumes = { "application/json" })
             consumes = { "application/json" })
     public ResponseEntity<ParkingLot> createParkingLot(@Valid @RequestBody ParkingLot parkingLotItem) {
     public ResponseEntity<ParkingLot> createParkingLot(@Valid @RequestBody ParkingLot parkingLotItem) {
 
 
-        parkingLotItem = persistenceManager.addParkingLot(parkingLotItem);
+        parkingLotItem = controller.createParkingLot(parkingLotItem);
         return ResponseEntity.created(URI.create("/parking_lot/" + parkingLotItem.getId())).body(parkingLotItem);
         return ResponseEntity.created(URI.create("/parking_lot/" + parkingLotItem.getId())).body(parkingLotItem);
     }
     }
 
 
@@ -40,14 +38,14 @@ public class ParkingLotApiController {
             produces = { "application/json" },
             produces = { "application/json" },
             consumes = { "application/json" })
             consumes = { "application/json" })
     public ResponseEntity<ParkingLot> deleteParkingLotById(@PathVariable("parkingLotId") Long parkingLotId) {
     public ResponseEntity<ParkingLot> deleteParkingLotById(@PathVariable("parkingLotId") Long parkingLotId) {
-        ParkingLot parkingLot = persistenceManager.deleteParkingLotById(parkingLotId);
+        ParkingLot parkingLot = controller.deleteParkingLotById(parkingLotId);
         return ResponseEntity.ok(parkingLot);
         return ResponseEntity.ok(parkingLot);
     }
     }
 
 
     @GetMapping(value = "/parking_lot/{parkingLotId}",
     @GetMapping(value = "/parking_lot/{parkingLotId}",
             produces = { "application/json" })
             produces = { "application/json" })
     public ResponseEntity<ParkingLot> getParkingById(@PathVariable("parkingLotId") Long parkingLotId) {
     public ResponseEntity<ParkingLot> getParkingById(@PathVariable("parkingLotId") Long parkingLotId) {
-        ParkingLot parkingLot = persistenceManager.getParkingLotById(parkingLotId);
+        ParkingLot parkingLot = controller.getParkingById(parkingLotId);
         return ResponseEntity.ok(parkingLot);
         return ResponseEntity.ok(parkingLot);
     }
     }
 
 
@@ -55,11 +53,8 @@ public class ParkingLotApiController {
             produces = { "application/json" })
             produces = { "application/json" })
     public ResponseEntity<CarSlot> leaveParkingLot(@PathVariable("parkingLotId") Long parkingLotId, @Valid @RequestBody CarSlot carSlotItem) {
     public ResponseEntity<CarSlot> leaveParkingLot(@PathVariable("parkingLotId") Long parkingLotId, @Valid @RequestBody CarSlot carSlotItem) {
 
 
-        ParkingLot parkingLot = persistenceManager.getParkingLotById(parkingLotId);
-        CarSlot oldCarSlot = parkingLot.removeCar(carSlotItem);
-        BigDecimal fare = parkingLot.getPricingPolicy().computeFare(oldCarSlot.getArrivalTime(), oldCarSlot.getDepartureTime());
-        oldCarSlot.setPrice(fare);
-        return ResponseEntity.ok(oldCarSlot);
+        CarSlot carSlot = controller.leaveParkingLot(parkingLotId, carSlotItem);
+        return ResponseEntity.ok(carSlot);
     }
     }
 
 
     @PostMapping(value = "/parking_lot/{parkingLotId}/park",
     @PostMapping(value = "/parking_lot/{parkingLotId}/park",
@@ -67,35 +62,22 @@ public class ParkingLotApiController {
             consumes = { "application/json" })
             consumes = { "application/json" })
     public ResponseEntity<CarSlot> parkAtParkingLot(@PathVariable("parkingLotId") Long parkingLotId, @Valid @RequestBody CarSlot carSlotItem) {
     public ResponseEntity<CarSlot> parkAtParkingLot(@PathVariable("parkingLotId") Long parkingLotId, @Valid @RequestBody CarSlot carSlotItem) {
         //check if the asked parking exists
         //check if the asked parking exists
-        ParkingLot parkingLot = persistenceManager.getParkingLotById(parkingLotId);
-        carSlotItem.setParkingLotId(parkingLotId);
-        parkingLot.parkCar(carSlotItem);
-
-        return ResponseEntity.ok(carSlotItem);
+        CarSlot slot = controller.parkAtParkingLot(parkingLotId, carSlotItem);
+        return ResponseEntity.ok(slot);
     }
     }
 
 
     @PutMapping(value = "/parking_lot/{parkingLotId}",
     @PutMapping(value = "/parking_lot/{parkingLotId}",
             produces = { "application/json" },
             produces = { "application/json" },
             consumes = { "application/json" })
             consumes = { "application/json" })
     public ResponseEntity<ParkingLot> updateParkingLot(@PathVariable("parkingLotId") Long parkingLotId, @Valid @RequestBody ParkingLot parkingLotItem) {
     public ResponseEntity<ParkingLot> updateParkingLot(@PathVariable("parkingLotId") Long parkingLotId, @Valid @RequestBody ParkingLot parkingLotItem) {
-        Long oldID = parkingLotItem.getId();
-        parkingLotItem.setId(parkingLotId);
-        boolean newItem = persistenceManager.updateParkingLot(parkingLotId, parkingLotItem);
-        if(newItem){
-            //it's a creation - 201
-            return ResponseEntity.created(URI.create("/parking_lot/" + parkingLotItem.getId())).build();
-        }
-        //204 no content
+        ParkingLot parkingLot = controller.updateParkingLot(parkingLotId, parkingLotItem);
         return ResponseEntity.noContent().build();
         return ResponseEntity.noContent().build();
     }
     }
 
 
     @GetMapping(value = "/parking_lot",
     @GetMapping(value = "/parking_lot",
             produces = { "application/json" })
             produces = { "application/json" })
     public ResponseEntity<Collection<ParkingLot>> searchParkingLot(@Valid @RequestParam(value = "searchString", required = false) String searchString) {
     public ResponseEntity<Collection<ParkingLot>> searchParkingLot(@Valid @RequestParam(value = "searchString", required = false) String searchString) {
-        Collection<ParkingLot> parkingLots = persistenceManager.getAllParkingLots();
-        if(searchString != null && !searchString.isBlank()) {
-            parkingLots = parkingLots.stream().filter(a -> a.getName().toUpperCase().contains(searchString.toUpperCase())).collect(Collectors.toList());
-        }
+        Collection<ParkingLot> parkingLots = controller.searchParkingLot(searchString);
         return ResponseEntity.ok(parkingLots);
         return ResponseEntity.ok(parkingLots);
     }
     }
 
 

+ 0 - 50
src/main/java/eu/fibane/parkingtoll/core/PersistenceManager.java

@@ -1,50 +0,0 @@
-package eu.fibane.parkingtoll.core;
-
-import eu.fibane.parkingtoll.model.ParkingLot;
-
-import java.util.Collection;
-
-public interface PersistenceManager {
-
-    /**
-     * Get all currently stored parking lots
-     * @return all currently stored parking lots
-     */
-    Collection<ParkingLot> getAllParkingLots();
-
-    /**
-     * Adds a ParkingLot in database and assigns it a new ID
-     * @param parkingLot the ParkingLot to add
-     * @return the added ParkingLot
-     */
-    ParkingLot addParkingLot(ParkingLot parkingLot);
-
-    /**
-     * Search a parking lot by id
-     * @param id the id to look for
-     * @return the requested ParkingLot object
-     */
-    ParkingLot getParkingLotById(Long id);
-
-    /**
-     * Update the specified ParkingLot in database. If it was not added previously, add it.
-     * @param parkingLot the new value of parkingLot
-     * @return true if the parking was created, false if the parking was updated
-     */
-    boolean updateParkingLot(Long id, ParkingLot parkingLot);
-
-    //public void parkCarAtParking(Long id);
-
-    /**
-     * Delete parking lot by id
-     * @param id parking lot id to delete
-     * @return the ParkingLot that was deleted, null if the parking lot was not found in the database
-     */
-    ParkingLot deleteParkingLotById(Long id);
-
-    /**
-     * Clear all data stored in the database
-     */
-    void clearDatabase();
-
-}

+ 0 - 8
src/main/java/eu/fibane/parkingtoll/model/Layout.java

@@ -64,14 +64,6 @@ public class Layout {
     this.available.incrementAndGet();
     this.available.incrementAndGet();
   }
   }
 
 
-
-  public void parkCar(CarSlot carSlot) {
-    Long id = decrementAndGetID();
-    carSlot.setSlot(id);
-    carSlot.setArrivalTime(Instant.now());
-    carSlots.put(id,carSlot);
-  }
-
   public CarSlot removeCar(CarSlot carSlot) {
   public CarSlot removeCar(CarSlot carSlot) {
     CarSlot slot = carSlots.get(carSlot.getSlot());
     CarSlot slot = carSlots.get(carSlot.getSlot());
     if(slot == null){
     if(slot == null){

+ 0 - 7
src/main/java/eu/fibane/parkingtoll/model/ParkingLot.java

@@ -35,13 +35,6 @@ public class ParkingLot   {
   @Valid @NotNull
   @Valid @NotNull
   private PricingPolicy pricingPolicy;
   private PricingPolicy pricingPolicy;
 
 
-  public CarSlot parkCar(CarSlot carSlot){
-    Layout layout = getLayoutByName(carSlot.getType());
-    layout.parkCar(carSlot);
-    carSlot.setParkingLotId(this.id);
-    return carSlot;
-  }
-
   public CarSlot removeCar(CarSlot carSlot){
   public CarSlot removeCar(CarSlot carSlot){
     Layout layout = getLayoutByName(carSlot.getType());
     Layout layout = getLayoutByName(carSlot.getType());
     return layout.removeCar(carSlot);
     return layout.removeCar(carSlot);

+ 44 - 0
src/main/java/eu/fibane/parkingtoll/persistence/Dao.java

@@ -0,0 +1,44 @@
+package eu.fibane.parkingtoll.persistence;
+
+import java.util.Collection;
+
+public interface Dao<T> {
+
+    /**
+     * Get all currently stored parking lots
+     * @return all currently stored parking lots
+     */
+    Collection<T> getAll();
+
+    /**
+     * Adds an object in database and assigns it a new ID
+     * @param t the object to add
+     * @return the added object
+     */
+    T save(T t);
+
+    /**
+     * Search an object by id
+     * @param id the id to look for
+     * @return the requested object object
+     */
+    T findById(Long id);
+
+    /**
+     * Update the specified object in database.
+     * @param t the value of object to add
+     */
+    void update(Long id, T t);
+
+    /**
+     * Delete object by id
+     * @param id of the object to delete
+     */
+    void delete(Long id);
+
+    /**
+     * Clear all data stored in the database
+     */
+    void clearDatabase();
+
+}

+ 11 - 22
src/main/java/eu/fibane/parkingtoll/core/InMemoryPersistenceManager.java → src/main/java/eu/fibane/parkingtoll/persistence/InMemoryPersistenceManager.java

@@ -1,10 +1,9 @@
-package eu.fibane.parkingtoll.core;
+package eu.fibane.parkingtoll.persistence;
 
 
 import eu.fibane.parkingtoll.exceptions.ParkingNotFoundException;
 import eu.fibane.parkingtoll.exceptions.ParkingNotFoundException;
 import eu.fibane.parkingtoll.model.ParkingLot;
 import eu.fibane.parkingtoll.model.ParkingLot;
 import org.springframework.stereotype.Repository;
 import org.springframework.stereotype.Repository;
 
 
-import java.io.StringReader;
 import java.util.Collection;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashMap;
@@ -12,26 +11,26 @@ import java.util.Map;
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.concurrent.atomic.AtomicLong;
 
 
 @Repository
 @Repository
-public class InMemoryPersistenceManager implements PersistenceManager {
+public class InMemoryPersistenceManager implements Dao<ParkingLot> {
 
 
     private static final Map<Long, ParkingLot> parkingLotMap = new HashMap<>();
     private static final Map<Long, ParkingLot> parkingLotMap = new HashMap<>();
     private static AtomicLong idCounter = new AtomicLong();
     private static AtomicLong idCounter = new AtomicLong();
 
 
     @Override
     @Override
-    public Collection<ParkingLot> getAllParkingLots() {
+    public Collection<ParkingLot> getAll() {
         //prevent user from deleting items from the collection
         //prevent user from deleting items from the collection
         return Collections.unmodifiableCollection(parkingLotMap.values());
         return Collections.unmodifiableCollection(parkingLotMap.values());
     }
     }
 
 
     @Override
     @Override
-    public ParkingLot addParkingLot(ParkingLot parkingLot) {
+    public ParkingLot save(ParkingLot parkingLot) {
         parkingLot.setId(createID());
         parkingLot.setId(createID());
         parkingLotMap.put(parkingLot.getId(), parkingLot);
         parkingLotMap.put(parkingLot.getId(), parkingLot);
         return parkingLot;
         return parkingLot;
     }
     }
 
 
     @Override
     @Override
-    public ParkingLot getParkingLotById(Long id) {
+    public ParkingLot findById(Long id) {
         ParkingLot result = parkingLotMap.get(id);
         ParkingLot result = parkingLotMap.get(id);
         if(result == null){
         if(result == null){
             throw new ParkingNotFoundException("The given ID is not associated with a parking lot.");
             throw new ParkingNotFoundException("The given ID is not associated with a parking lot.");
@@ -44,25 +43,15 @@ public class InMemoryPersistenceManager implements PersistenceManager {
     }
     }
 
 
     @Override
     @Override
-    public boolean updateParkingLot(Long id, ParkingLot parkingLot) {
-        if(!parkingLotExists(id)){
-            addParkingLot(parkingLot);
-            return true;
-        } else {
-            //secure case where user puts wrong ID
-            parkingLot.setId(id);
-            parkingLotMap.put(parkingLot.getId(), parkingLot);
-            return false;
-        }
+    public void update(Long id, ParkingLot parkingLot) {
+        //secure case where user puts wrong ID
+        parkingLot.setId(id);
+        parkingLotMap.put(parkingLot.getId(), parkingLot);
     }
     }
 
 
     @Override
     @Override
-    public ParkingLot deleteParkingLotById(Long id) {
-        ParkingLot result = parkingLotMap.remove(id);
-        if(result == null){
-            throw new ParkingNotFoundException("The given ID is not associated with a parking lot.");
-        }
-        return result;
+    public void delete(Long id) {
+        parkingLotMap.remove(id);
     }
     }
 
 
 
 

+ 124 - 0
src/main/java/eu/fibane/parkingtoll/service/ParkingLotService.java

@@ -0,0 +1,124 @@
+package eu.fibane.parkingtoll.service;
+
+import eu.fibane.parkingtoll.persistence.Dao;
+import eu.fibane.parkingtoll.exceptions.NoSuchCarInParkingException;
+import eu.fibane.parkingtoll.exceptions.ParkingIsFullException;
+import eu.fibane.parkingtoll.exceptions.ParkingNotFoundException;
+import eu.fibane.parkingtoll.exceptions.ParkingTypeDoesNotExistException;
+import eu.fibane.parkingtoll.model.CarSlot;
+import eu.fibane.parkingtoll.model.Layout;
+import eu.fibane.parkingtoll.model.ParkingLot;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.math.BigDecimal;
+import java.time.Instant;
+import java.util.Collection;
+
+public class ParkingLotService {
+
+    private Dao<ParkingLot> persistenceManager;
+
+    @Autowired
+    public ParkingLotService(Dao<ParkingLot> persistenceManager) {
+        this.persistenceManager = persistenceManager;
+    }
+
+    public ParkingLot createParkingLot(ParkingLot parkingLotItem) {
+        return persistenceManager.save(parkingLotItem);
+    }
+
+    public ParkingLot deleteParkingLotById(Long parkingLotId) {
+        //check if object exists
+        ParkingLot parkingLot = findParkingLotByIdOrThrow(parkingLotId);
+        persistenceManager.delete(parkingLotId);
+        return parkingLot;
+    }
+
+    public ParkingLot getParkingById(Long parkingLotId) {
+        ParkingLot parkingLot = persistenceManager.findById(parkingLotId);
+        if(parkingLot == null){
+            throw new ParkingNotFoundException("The given ID is not associated with a parking lot.");
+        }
+        return parkingLot;
+    }
+
+    public CarSlot leaveParkingLot(Long parkingLotId, CarSlot carSlotItem) {
+        ParkingLot parkingLot = findParkingLotByIdOrThrow(parkingLotId);
+        Layout layout = getLayoutByNameOrThrow(carSlotItem.getType(),parkingLot);
+        CarSlot carSlot;
+        synchronized (this) {
+            carSlot = findCarSlotByIdOrThrow(carSlotItem.getSlot(), layout);
+            carSlot.setDepartureTime(Instant.now());
+            layout.incrementAndFree(carSlot.getSlot());
+        }
+        BigDecimal fare = parkingLot.getPricingPolicy().computeFare(carSlot.getArrivalTime(), carSlot.getDepartureTime());
+        carSlot.setPrice(fare);
+        return carSlot;
+    }
+
+    public CarSlot parkAtParkingLot(Long parkingLotId, CarSlot carSlotItem) {
+        //check if the asked parking exists
+        ParkingLot parkingLot = findParkingLotByIdOrThrow(parkingLotId);
+
+        //check if there is available slots
+        Layout layout = getLayoutByNameOrThrow(carSlotItem.getType(), parkingLot);
+        if(layout.getAvailable().get() == 0){
+            throw new ParkingIsFullException("");
+        }
+        //found & available spot
+        synchronized (this){
+            //double check locking
+            if(layout.getAvailable().get() == 0){
+                throw new ParkingIsFullException("");
+            }
+            Long slotId = layout.decrementAndGetID();
+            carSlotItem.setSlot(slotId);
+            carSlotItem.setParkingLotId(parkingLotId);
+            carSlotItem.setArrivalTime(Instant.now());
+            layout.getCarSlots().put(slotId, carSlotItem);
+            persistenceManager.save(parkingLot);
+        }
+        return carSlotItem;
+    }
+
+
+    public ParkingLot updateParkingLot(Long parkingLotId, ParkingLot parkingLotItem) {
+        //parking lot exists ?
+        ParkingLot parkingLot = persistenceManager.findById(parkingLotId);
+        ParkingLot newParkingLot = null;
+        if(parkingLot == null){
+            //new one, save it
+            newParkingLot = persistenceManager.save(parkingLotItem);
+        } else {
+            persistenceManager.update(parkingLotId, parkingLotItem);
+        }
+        return newParkingLot;
+    }
+
+    public Collection<ParkingLot> searchParkingLot(String searchString) {
+        return persistenceManager.getAll();
+    }
+
+    private Layout getLayoutByNameOrThrow(String slotName, ParkingLot parkingLot){
+        return parkingLot.getLayoutList().stream()
+                .filter(lay -> lay.getName().equals(slotName)).findFirst()
+                .orElseThrow(() -> new ParkingTypeDoesNotExistException(""));
+    }
+
+    private ParkingLot findParkingLotByIdOrThrow(Long id){
+        ParkingLot parkingLot = persistenceManager.findById(id);
+        if(parkingLot == null){
+            throw new ParkingNotFoundException("The given ID is not associated with a parking lot.");
+        }
+        return parkingLot;
+    }
+
+    private CarSlot findCarSlotByIdOrThrow(Long id, Layout layout){
+        CarSlot carSlot = layout.getCarSlots().get(id);
+        if(carSlot == null){
+            throw new NoSuchCarInParkingException("This car is not at the specified location");
+        }
+        return carSlot;
+    }
+
+}

+ 14 - 14
src/test/java/eu/fibane/parkingtoll/ParkingTollApplicationTests.java

@@ -1,7 +1,7 @@
 package eu.fibane.parkingtoll;
 package eu.fibane.parkingtoll;
 
 
 import eu.fibane.parkingtoll.api.ParkingLotApiController;
 import eu.fibane.parkingtoll.api.ParkingLotApiController;
-import eu.fibane.parkingtoll.core.InMemoryPersistenceManager;
+import eu.fibane.parkingtoll.persistence.InMemoryPersistenceManager;
 import eu.fibane.parkingtoll.exceptions.ParkingNotFoundException;
 import eu.fibane.parkingtoll.exceptions.ParkingNotFoundException;
 import eu.fibane.parkingtoll.model.CarSlot;
 import eu.fibane.parkingtoll.model.CarSlot;
 import eu.fibane.parkingtoll.model.ParkingLot;
 import eu.fibane.parkingtoll.model.ParkingLot;
@@ -55,7 +55,7 @@ class ParkingTollApplicationTests {
 
 
 	@Test
 	@Test
 	void searchEmptyParkingLotTest() {
 	void searchEmptyParkingLotTest() {
-		when(persistenceManager.getAllParkingLots()).thenReturn(Collections.emptyList());
+		when(persistenceManager.getAll()).thenReturn(Collections.emptyList());
 
 
 		ResponseEntity<Collection<ParkingLot>> result = parkingLotApiController.searchParkingLot("");
 		ResponseEntity<Collection<ParkingLot>> result = parkingLotApiController.searchParkingLot("");
 		assertNotNull(result.getBody());
 		assertNotNull(result.getBody());
@@ -64,7 +64,7 @@ class ParkingTollApplicationTests {
 
 
 	@Test
 	@Test
 	void searchParkingLotTestWithWrongName() {
 	void searchParkingLotTestWithWrongName() {
-		when(persistenceManager.getAllParkingLots()).thenReturn(parkingLots);
+		when(persistenceManager.getAll()).thenReturn(parkingLots);
 
 
 		ResponseEntity<Collection<ParkingLot>> result = parkingLotApiController.searchParkingLot("");
 		ResponseEntity<Collection<ParkingLot>> result = parkingLotApiController.searchParkingLot("");
 		assertNotNull(result.getBody());
 		assertNotNull(result.getBody());
@@ -77,7 +77,7 @@ class ParkingTollApplicationTests {
 
 
 	@Test
 	@Test
 	void searchParkingLotTestWithCorrectName() {
 	void searchParkingLotTestWithCorrectName() {
-		when(persistenceManager.getAllParkingLots()).thenReturn(parkingLots);
+		when(persistenceManager.getAll()).thenReturn(parkingLots);
 
 
 		ResponseEntity<Collection<ParkingLot>> result = parkingLotApiController.searchParkingLot("");
 		ResponseEntity<Collection<ParkingLot>> result = parkingLotApiController.searchParkingLot("");
 		assertNotNull(result.getBody());
 		assertNotNull(result.getBody());
@@ -95,8 +95,8 @@ class ParkingTollApplicationTests {
 
 
 	@Test
 	@Test
 	void parkingLotDeleteByIdTest(){
 	void parkingLotDeleteByIdTest(){
-		when(persistenceManager.deleteParkingLotById(eq(-5L))).thenThrow(ParkingNotFoundException.class);
-		when(persistenceManager.deleteParkingLotById(eq(1L))).thenReturn(parkingLots.get(0));
+		when(persistenceManager.delete(eq(-5L))).thenThrow(ParkingNotFoundException.class);
+		when(persistenceManager.delete(eq(1L))).thenReturn(parkingLots.get(0));
 
 
 		//non existing id
 		//non existing id
 		assertThrows(ParkingNotFoundException.class, () -> parkingLotApiController.deleteParkingLotById(-5L));
 		assertThrows(ParkingNotFoundException.class, () -> parkingLotApiController.deleteParkingLotById(-5L));
@@ -105,14 +105,14 @@ class ParkingTollApplicationTests {
 		assertEquals(parkingLots.get(0), result.getBody());
 		assertEquals(parkingLots.get(0), result.getBody());
 		assertEquals(result.getStatusCode(), HttpStatus.OK);
 		assertEquals(result.getStatusCode(), HttpStatus.OK);
 
 
-		verify(persistenceManager, times(2)).deleteParkingLotById(any());
+		verify(persistenceManager, times(2)).delete(any());
 	}
 	}
 
 
 	@Test
 	@Test
 	void addParkingLotTest(){
 	void addParkingLotTest(){
 		ParkingLot storedParkingLot = ParkingLotTest.generateParking("created parking", 55L);
 		ParkingLot storedParkingLot = ParkingLotTest.generateParking("created parking", 55L);
 
 
-		when(persistenceManager.addParkingLot(any())).thenReturn(storedParkingLot);
+		when(persistenceManager.save(any())).thenReturn(storedParkingLot);
 
 
 		ResponseEntity<ParkingLot> response = parkingLotApiController.createParkingLot(parkingLots.get(0));
 		ResponseEntity<ParkingLot> response = parkingLotApiController.createParkingLot(parkingLots.get(0));
 
 
@@ -125,7 +125,7 @@ class ParkingTollApplicationTests {
 	@Test
 	@Test
 	void parkingLotGetByIdTest(){
 	void parkingLotGetByIdTest(){
 		ParkingLot storedParkingLot = ParkingLotTest.generateParking("created parking", 5L);
 		ParkingLot storedParkingLot = ParkingLotTest.generateParking("created parking", 5L);
-		when(persistenceManager.getParkingLotById(5L)).thenReturn(storedParkingLot);
+		when(persistenceManager.findById(5L)).thenReturn(storedParkingLot);
 		ResponseEntity<ParkingLot> result = parkingLotApiController.getParkingById(5L);
 		ResponseEntity<ParkingLot> result = parkingLotApiController.getParkingById(5L);
 
 
 		assertEquals(HttpStatus.OK, result.getStatusCode());
 		assertEquals(HttpStatus.OK, result.getStatusCode());
@@ -139,7 +139,7 @@ class ParkingTollApplicationTests {
 		policy.setFlatFee(BigDecimal.valueOf(1));
 		policy.setFlatFee(BigDecimal.valueOf(1));
 		storedParkingLot.setPricingPolicy(policy);
 		storedParkingLot.setPricingPolicy(policy);
 
 
-		when(persistenceManager.getParkingLotById(storedParkingLot.getId())).thenReturn(storedParkingLot);
+		when(persistenceManager.findById(storedParkingLot.getId())).thenReturn(storedParkingLot);
 
 
 		CarSlot carSlot = new CarSlot();
 		CarSlot carSlot = new CarSlot();
 		carSlot.setArrivalTime(Instant.now().minus(Duration.ofHours(1)));
 		carSlot.setArrivalTime(Instant.now().minus(Duration.ofHours(1)));
@@ -155,7 +155,7 @@ class ParkingTollApplicationTests {
 		ParkingLot storedParkingLot = ParkingLotTest.generateParking("created parking", 5L);
 		ParkingLot storedParkingLot = ParkingLotTest.generateParking("created parking", 5L);
 		CarSlot carSlot = new CarSlot();
 		CarSlot carSlot = new CarSlot();
 		carSlot.setType(storedParkingLot.getSlotTypes().get(0));
 		carSlot.setType(storedParkingLot.getSlotTypes().get(0));
-		when(persistenceManager.getParkingLotById(storedParkingLot.getId())).thenReturn(storedParkingLot);
+		when(persistenceManager.findById(storedParkingLot.getId())).thenReturn(storedParkingLot);
 
 
 		ResponseEntity<CarSlot> result = parkingLotApiController.parkAtParkingLot(storedParkingLot.getId(), carSlot);
 		ResponseEntity<CarSlot> result = parkingLotApiController.parkAtParkingLot(storedParkingLot.getId(), carSlot);
 		assertEquals(HttpStatus.OK, result.getStatusCode());
 		assertEquals(HttpStatus.OK, result.getStatusCode());
@@ -164,8 +164,8 @@ class ParkingTollApplicationTests {
 	@Test
 	@Test
 	void updateParkingLotTest(){
 	void updateParkingLotTest(){
 		//no existing parking lots
 		//no existing parking lots
-		when(persistenceManager.getParkingLotById(any())).thenReturn(null);
-		when(persistenceManager.updateParkingLot(anyLong(), any())).thenReturn(true);
+		when(persistenceManager.findById(any())).thenReturn(null);
+		when(persistenceManager.update(anyLong(), any())).thenReturn(true);
 
 
 		ParkingLot newParkingLot = ParkingLotTest.generateParking("created parking", 5L);
 		ParkingLot newParkingLot = ParkingLotTest.generateParking("created parking", 5L);
 		ResponseEntity<ParkingLot> result = parkingLotApiController.updateParkingLot(newParkingLot.getId(), newParkingLot);
 		ResponseEntity<ParkingLot> result = parkingLotApiController.updateParkingLot(newParkingLot.getId(), newParkingLot);
@@ -179,7 +179,7 @@ class ParkingTollApplicationTests {
 
 
 		ParkingLot updated = ParkingLotTest.generateParking("created parking", 6L);
 		ParkingLot updated = ParkingLotTest.generateParking("created parking", 6L);
 
 
-		when(persistenceManager.updateParkingLot(anyLong(), any())).thenReturn(false);
+		when(persistenceManager.update(anyLong(), any())).thenReturn(false);
 		newParkingLot = ParkingLotTest.generateParking("created parking", 5L);
 		newParkingLot = ParkingLotTest.generateParking("created parking", 5L);
 		result = parkingLotApiController.updateParkingLot(newParkingLot.getId(), newParkingLot);
 		result = parkingLotApiController.updateParkingLot(newParkingLot.getId(), newParkingLot);
 		assertEquals(HttpStatus.NO_CONTENT, result.getStatusCode());
 		assertEquals(HttpStatus.NO_CONTENT, result.getStatusCode());

+ 30 - 35
src/test/java/eu/fibane/parkingtoll/core/InMemoryPersistenceManagerTest.java → src/test/java/eu/fibane/parkingtoll/persistence/InMemoryPersistenceManagerTest.java

@@ -1,4 +1,4 @@
-package eu.fibane.parkingtoll.core;
+package eu.fibane.parkingtoll.persistence;
 
 
 import eu.fibane.parkingtoll.exceptions.ParkingNotFoundException;
 import eu.fibane.parkingtoll.exceptions.ParkingNotFoundException;
 import eu.fibane.parkingtoll.model.Layout;
 import eu.fibane.parkingtoll.model.Layout;
@@ -11,13 +11,8 @@ import java.security.SecureRandom;
 import java.time.Duration;
 import java.time.Duration;
 import java.time.Instant;
 import java.time.Instant;
 import java.time.temporal.ChronoUnit;
 import java.time.temporal.ChronoUnit;
-import java.time.temporal.TemporalUnit;
 import java.util.ArrayList;
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.List;
 import java.util.List;
-import java.util.Set;
-import java.util.concurrent.*;
-import java.util.stream.Collectors;
 
 
 import static org.junit.jupiter.api.Assertions.*;
 import static org.junit.jupiter.api.Assertions.*;
 
 
@@ -33,15 +28,15 @@ class InMemoryPersistenceManagerTest {
     @Test
     @Test
     void testClearDatabase() {
     void testClearDatabase() {
         manager.clearDatabase();
         manager.clearDatabase();
-        assertEquals(0, manager.getAllParkingLots().size());
-        assertThrows(ParkingNotFoundException.class, () -> manager.getParkingLotById(0L));
-        assertThrows(ParkingNotFoundException.class, () -> manager.deleteParkingLotById(getNewParkingLot().getId()));
+        assertEquals(0, manager.getAll().size());
+        assertThrows(ParkingNotFoundException.class, () -> manager.findById(0L));
+        assertThrows(ParkingNotFoundException.class, () -> manager.delete(getNewParkingLot().getId()));
     }
     }
 
 
     @Test
     @Test
     void getParkingLotByIdTest(){
     void getParkingLotByIdTest(){
-        assertThrows(ParkingNotFoundException.class, () -> manager.getParkingLotById(5L));
-        ParkingLot parkingLot = manager.addParkingLot(ParkingLotTest.generateParking("test", 5L));
+        assertThrows(ParkingNotFoundException.class, () -> manager.findById(5L));
+        ParkingLot parkingLot = manager.save(ParkingLotTest.generateParking("test", 5L));
         assertNotNull(parkingLot);
         assertNotNull(parkingLot);
         assertNotNull(parkingLot.getId());
         assertNotNull(parkingLot.getId());
     }
     }
@@ -50,18 +45,18 @@ class InMemoryPersistenceManagerTest {
     void addParkingLotTest() {
     void addParkingLotTest() {
         ParkingLot parkingLot = getNewParkingLot();
         ParkingLot parkingLot = getNewParkingLot();
         //call the service
         //call the service
-        ParkingLot returnedParkingLot = manager.addParkingLot(parkingLot);
-        assertEquals(1, manager.getAllParkingLots().size());
+        ParkingLot returnedParkingLot = manager.save(parkingLot);
+        assertEquals(1, manager.getAll().size());
 
 
         assertNotNull(returnedParkingLot);
         assertNotNull(returnedParkingLot);
         assertNotNull(returnedParkingLot.getId());
         assertNotNull(returnedParkingLot.getId());
 
 
         //call again
         //call again
         parkingLot = getNewParkingLot();
         parkingLot = getNewParkingLot();
-        returnedParkingLot = manager.addParkingLot(parkingLot);
+        returnedParkingLot = manager.save(parkingLot);
         assertNotNull(returnedParkingLot);
         assertNotNull(returnedParkingLot);
         assertNotNull(returnedParkingLot.getId());
         assertNotNull(returnedParkingLot.getId());
-        assertEquals(2, manager.getAllParkingLots().size());
+        assertEquals(2, manager.getAll().size());
 
 
     }
     }
 
 
@@ -89,10 +84,10 @@ class InMemoryPersistenceManagerTest {
         for (int i = 0; i < 10; i++) {
         for (int i = 0; i < 10; i++) {
             parkingLot = getNewParkingLot();
             parkingLot = getNewParkingLot();
             parkingLots.add(parkingLot);
             parkingLots.add(parkingLot);
-            manager.addParkingLot(parkingLot);
+            manager.save(parkingLot);
         }
         }
 
 
-        ArrayList<ParkingLot> lots = new ArrayList<>(manager.getAllParkingLots());
+        ArrayList<ParkingLot> lots = new ArrayList<>(manager.getAll());
         assertEquals(10, lots.size());
         assertEquals(10, lots.size());
 
 
         for (int i = 0; i < parkingLots.size(); i++) {
         for (int i = 0; i < parkingLots.size(); i++) {
@@ -107,12 +102,12 @@ class InMemoryPersistenceManagerTest {
             parkingLots.add(getNewParkingLot());
             parkingLots.add(getNewParkingLot());
         }
         }
         for (ParkingLot parkingLot : parkingLots) {
         for (ParkingLot parkingLot : parkingLots) {
-            manager.addParkingLot(parkingLot);
+            manager.save(parkingLot);
         }
         }
 
 
         //Call service and check
         //Call service and check
         for (ParkingLot parkingLot : parkingLots) {
         for (ParkingLot parkingLot : parkingLots) {
-            assertEquals(parkingLot, manager.getParkingLotById(parkingLot.getId()));
+            assertEquals(parkingLot, manager.findById(parkingLot.getId()));
         }
         }
     }
     }
 
 
@@ -120,41 +115,41 @@ class InMemoryPersistenceManagerTest {
     void updateParkingLot() {
     void updateParkingLot() {
         //first scenario, try to update an object that doesn't exist yet in database
         //first scenario, try to update an object that doesn't exist yet in database
         ParkingLot parkingLot = getNewParkingLot();
         ParkingLot parkingLot = getNewParkingLot();
-        assertEquals(0, manager.getAllParkingLots().size());
+        assertEquals(0, manager.getAll().size());
         assertNull(parkingLot.getId());
         assertNull(parkingLot.getId());
-        manager.updateParkingLot(parkingLot.getId(), parkingLot);
-        assertEquals(1, manager.getAllParkingLots().size());
+        manager.update(parkingLot.getId(), parkingLot);
+        assertEquals(1, manager.getAll().size());
         assertNotNull(parkingLot.getId());
         assertNotNull(parkingLot.getId());
 
 
         ParkingLot parkingLot2 = getNewParkingLot();
         ParkingLot parkingLot2 = getNewParkingLot();
         //set the id of parking 1
         //set the id of parking 1
         parkingLot2.setId(parkingLot.getId());
         parkingLot2.setId(parkingLot.getId());
-        manager.updateParkingLot(parkingLot2.getId(), parkingLot2);
-        assertEquals(1, manager.getAllParkingLots().size());
+        manager.update(parkingLot2.getId(), parkingLot2);
+        assertEquals(1, manager.getAll().size());
     }
     }
 
 
     @Test
     @Test
     void deleteParkingLot() {
     void deleteParkingLot() {
         ParkingLot parkingLot = getNewParkingLot();
         ParkingLot parkingLot = getNewParkingLot();
-        assertEquals(0, manager.getAllParkingLots().size());
-        manager.addParkingLot(parkingLot);
-        assertEquals(1, manager.getAllParkingLots().size());
+        assertEquals(0, manager.getAll().size());
+        manager.save(parkingLot);
+        assertEquals(1, manager.getAll().size());
 
 
         //call the service
         //call the service
-        ParkingLot result = manager.deleteParkingLotById(parkingLot.getId());
+        ParkingLot result = manager.delete(parkingLot.getId());
         assertEquals(result,parkingLot);
         assertEquals(result,parkingLot);
-        assertEquals(0, manager.getAllParkingLots().size());
+        assertEquals(0, manager.getAll().size());
 
 
-        assertThrows(ParkingNotFoundException.class, () -> manager.deleteParkingLotById(parkingLot.getId()));
-        assertEquals(0, manager.getAllParkingLots().size());
+        assertThrows(ParkingNotFoundException.class, () -> manager.delete(parkingLot.getId()));
+        assertEquals(0, manager.getAll().size());
 
 
-        manager.addParkingLot(parkingLot);
-        assertEquals(1, manager.getAllParkingLots().size());
+        manager.save(parkingLot);
+        assertEquals(1, manager.getAll().size());
         //now try to delete something else
         //now try to delete something else
         ParkingLot parkingLot1 = new ParkingLot();
         ParkingLot parkingLot1 = new ParkingLot();
         parkingLot1.setId(parkingLot.getId() + 1);
         parkingLot1.setId(parkingLot.getId() + 1);
-        assertThrows(ParkingNotFoundException.class, () -> manager.deleteParkingLotById(parkingLot1.getId()));
-        assertEquals(1, manager.getAllParkingLots().size());
+        assertThrows(ParkingNotFoundException.class, () -> manager.delete(parkingLot1.getId()));
+        assertEquals(1, manager.getAll().size());
     }
     }
 
 
     @Test
     @Test