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