From 15bd64cdd3d1183371daa7b396f9dd620be8461c Mon Sep 17 00:00:00 2001
From: Hendrik Jungnitsch <hendrik.jungnitsch@gedoplan.de>
Date: Do, 29 Sep 2022 17:50:59 +0200
Subject: [PATCH] exercise

---
 src/test/java/de/gedoplan/seminar/sbt/di/exercise/Exercise09Test.java                     |   36 +++++++++
 src/main/java/de/gedoplan/seminar/sbt/di/exercise/rest/MixerEndpoint.java                 |   83 ++++++++++++++++++++
 src/main/java/de/gedoplan/seminar/sbt/di/exercise/repository/CocktailOrderRepository.java |    9 ++
 src/main/java/de/gedoplan/seminar/sbt/di/exercise/exception/OutOfStockException.java      |    9 ++
 src/main/java/de/gedoplan/seminar/sbt/di/exercise/service/CocktailOrderService.java       |   51 ++++++++++++
 src/main/java/de/gedoplan/seminar/sbt/di/exercise/domain/CocktailOrder.java               |    4 +
 6 files changed, 192 insertions(+), 0 deletions(-)

diff --git a/src/main/java/de/gedoplan/seminar/sbt/di/exercise/domain/CocktailOrder.java b/src/main/java/de/gedoplan/seminar/sbt/di/exercise/domain/CocktailOrder.java
index b56fedf..d73eeb1 100644
--- a/src/main/java/de/gedoplan/seminar/sbt/di/exercise/domain/CocktailOrder.java
+++ b/src/main/java/de/gedoplan/seminar/sbt/di/exercise/domain/CocktailOrder.java
@@ -27,6 +27,10 @@
   @Column(name = "COCKTAIL_COUNT")
   private Map<String, Integer> orderDetails = new TreeMap<>();
 
+  public Integer getId() {
+    return id;
+  }
+
   public Date getOrderDate() {
     return this.orderDate;
   }
diff --git a/src/main/java/de/gedoplan/seminar/sbt/di/exercise/exception/OutOfStockException.java b/src/main/java/de/gedoplan/seminar/sbt/di/exercise/exception/OutOfStockException.java
new file mode 100644
index 0000000..26cf16c
--- /dev/null
+++ b/src/main/java/de/gedoplan/seminar/sbt/di/exercise/exception/OutOfStockException.java
@@ -0,0 +1,9 @@
+package de.gedoplan.seminar.sbt.di.exercise.exception;
+
+import de.gedoplan.seminar.sbt.di.exercise.domain.Beverage;
+
+public class OutOfStockException extends RuntimeException {
+  public OutOfStockException(Beverage cocktailIngredient) {
+    super(cocktailIngredient.getName() + " is out of stock");
+  }
+}
diff --git a/src/main/java/de/gedoplan/seminar/sbt/di/exercise/repository/CocktailOrderRepository.java b/src/main/java/de/gedoplan/seminar/sbt/di/exercise/repository/CocktailOrderRepository.java
new file mode 100644
index 0000000..01a87c2
--- /dev/null
+++ b/src/main/java/de/gedoplan/seminar/sbt/di/exercise/repository/CocktailOrderRepository.java
@@ -0,0 +1,9 @@
+package de.gedoplan.seminar.sbt.di.exercise.repository;
+
+import de.gedoplan.seminar.sbt.di.exercise.domain.CocktailOrder;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface CocktailOrderRepository extends JpaRepository<CocktailOrder, Integer> {
+}
diff --git a/src/main/java/de/gedoplan/seminar/sbt/di/exercise/rest/MixerEndpoint.java b/src/main/java/de/gedoplan/seminar/sbt/di/exercise/rest/MixerEndpoint.java
new file mode 100644
index 0000000..fa09c0e
--- /dev/null
+++ b/src/main/java/de/gedoplan/seminar/sbt/di/exercise/rest/MixerEndpoint.java
@@ -0,0 +1,83 @@
+package de.gedoplan.seminar.sbt.di.exercise.rest;
+
+import de.gedoplan.seminar.sbt.di.exercise.domain.CocktailOrder;
+import de.gedoplan.seminar.sbt.di.exercise.exception.OutOfStockException;
+import de.gedoplan.seminar.sbt.di.exercise.repository.CocktailOrderRepository;
+import de.gedoplan.seminar.sbt.di.exercise.service.CocktailOrderService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.server.ResponseStatusException;
+import org.springframework.web.util.UriComponentsBuilder;
+
+import java.net.URI;
+
+@RequestMapping(path = "mixer", produces = MediaType.APPLICATION_JSON_VALUE)
+@RestController
+public class MixerEndpoint {
+
+  @Autowired
+  CocktailOrderService cocktailOrderService;
+
+  @Autowired
+  CocktailOrderRepository cocktailOrderRepository;
+
+
+  @PostMapping(path = "order",produces = MediaType.TEXT_PLAIN_VALUE)
+  public ResponseEntity<String> postOrder(UriComponentsBuilder uriComponentsBuilder) {
+    Integer newId = this.cocktailOrderService.createNewOrder();
+    return ResponseEntity
+        .created(uriComponentsBuilder
+                .pathSegment("api","mixer","order", newId.toString())
+                .build().toUri())
+        .build();
+  }
+
+  @GetMapping(value = "order/{id}")
+  public CocktailOrder getOrder(@PathVariable Integer id) {
+    return this.cocktailOrderRepository.findById(id)
+            .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND));
+  }
+
+  @PostMapping(path = "order/{id}/{cocktailId}", produces = MediaType.TEXT_PLAIN_VALUE)
+  public ResponseEntity<String> addCocktail(@PathVariable Integer id, @PathVariable String cocktailId) {
+    try {
+      this.cocktailOrderService.addCocktail(id, cocktailId);
+
+      return ResponseEntity
+          .status(HttpStatus.CREATED)
+          .build();
+    } catch (IllegalArgumentException e) {
+      return ResponseEntity
+          .notFound()
+          .build();
+    } catch (OutOfStockException e) {
+      return ResponseEntity
+              .status(HttpStatus.CONFLICT)
+          .body(e.getMessage());
+    }
+  }
+
+
+  @PutMapping("order/{id}/placed")
+  public ResponseEntity<String> setPlaced(@PathVariable Integer id) {
+    try {
+      this.cocktailOrderService.placeOrder(id);
+
+      return ResponseEntity.noContent().build();
+    } catch (IllegalArgumentException e) {
+      return ResponseEntity
+          .notFound()
+          .build();
+    }
+
+  }
+
+
+  @DeleteMapping("order/{id}")
+  public void delete(@PathVariable Integer id) {
+    this.cocktailOrderService.cancelOrder(id);
+  }
+}
diff --git a/src/main/java/de/gedoplan/seminar/sbt/di/exercise/service/CocktailOrderService.java b/src/main/java/de/gedoplan/seminar/sbt/di/exercise/service/CocktailOrderService.java
new file mode 100644
index 0000000..2028b91
--- /dev/null
+++ b/src/main/java/de/gedoplan/seminar/sbt/di/exercise/service/CocktailOrderService.java
@@ -0,0 +1,51 @@
+package de.gedoplan.seminar.sbt.di.exercise.service;
+
+import de.gedoplan.seminar.sbt.di.exercise.domain.Cocktail;
+import de.gedoplan.seminar.sbt.di.exercise.domain.CocktailOrder;
+import de.gedoplan.seminar.sbt.di.exercise.repository.CocktailOrderRepository;
+import de.gedoplan.seminar.sbt.di.exercise.repository.CocktailRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+@Component
+public class CocktailOrderService {
+
+  @Autowired
+  CocktailOrderRepository cocktailOrderRepository;
+
+  @Autowired
+  CocktailRepository cocktailRepository;
+
+  public Integer createNewOrder() {
+    CocktailOrder cocktailOrder = new CocktailOrder();
+    this.cocktailOrderRepository.save(cocktailOrder);
+    this.cocktailOrderRepository.flush();
+    return cocktailOrder.getId();
+  }
+
+  @Transactional
+  public void addCocktail(Integer id, String cocktailId) {
+    CocktailOrder cocktailOrder = this.cocktailOrderRepository.findById(id)
+            .orElseThrow(() -> new IllegalArgumentException());
+    Cocktail cocktail = cocktailRepository.findById(cocktailId)
+            .orElseThrow(() -> new IllegalArgumentException());
+
+    cocktailOrder.addCocktail(cocktailId);
+  }
+
+  @Transactional
+  public void placeOrder(Integer id) {
+    CocktailOrder cocktailOrder = this.cocktailOrderRepository.findById(id)
+            .orElseThrow(() -> new IllegalArgumentException());
+
+    if (!cocktailOrder.isPlaced()) {
+      cocktailOrder.place();
+    }
+  }
+
+  public void cancelOrder(Integer id) {
+    this.cocktailOrderRepository.deleteById(id);
+  }
+
+}
diff --git a/src/test/java/de/gedoplan/seminar/sbt/di/exercise/Exercise09Test.java b/src/test/java/de/gedoplan/seminar/sbt/di/exercise/Exercise09Test.java
new file mode 100644
index 0000000..8d30c2c
--- /dev/null
+++ b/src/test/java/de/gedoplan/seminar/sbt/di/exercise/Exercise09Test.java
@@ -0,0 +1,36 @@
+package de.gedoplan.seminar.sbt.di.exercise;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.web.servlet.MockMvc;
+
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+@AutoConfigureMockMvc
+@SpringBootTest
+public class Exercise09Test {
+
+    @Autowired
+    MockMvc mockMvc;
+
+    @Test
+    public void testFiltersNonAlcEmpty() throws Exception {
+        mockMvc.perform(get("/api/bar/cocktails"))
+                .andExpect(status().isOk());
+
+
+        mockMvc.perform(get("/api/methodCount"))
+                .andExpect(jsonPath("$.findAll").value(2));
+
+        mockMvc.perform(get("/api/bar/cocktails"))
+                .andExpect(status().isOk());
+
+        mockMvc.perform(get("/api/methodCount"))
+                .andExpect(jsonPath("$.findAll").value(4));
+    }
+
+}

--
Gitblit v1.7.1