| src/main/java/de/gedoplan/seminar/sbt/di/exercise/domain/CocktailOrder.java | ●●●●● Patch | Ansicht | Raw | Blame | Historie | |
| src/main/java/de/gedoplan/seminar/sbt/di/exercise/exception/OutOfStockException.java | ●●●●● Patch | Ansicht | Raw | Blame | Historie | |
| src/main/java/de/gedoplan/seminar/sbt/di/exercise/repository/CocktailOrderRepository.java | ●●●●● Patch | Ansicht | Raw | Blame | Historie | |
| src/main/java/de/gedoplan/seminar/sbt/di/exercise/rest/MixerEndpoint.java | ●●●●● Patch | Ansicht | Raw | Blame | Historie | |
| src/main/java/de/gedoplan/seminar/sbt/di/exercise/service/CocktailOrderService.java | ●●●●● Patch | Ansicht | Raw | Blame | Historie | |
| src/test/java/de/gedoplan/seminar/sbt/di/exercise/Exercise09Test.java | ●●●●● Patch | Ansicht | Raw | Blame | Historie |
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; } src/main/java/de/gedoplan/seminar/sbt/di/exercise/exception/OutOfStockException.java
Neue Datei @@ -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"); } } src/main/java/de/gedoplan/seminar/sbt/di/exercise/repository/CocktailOrderRepository.java
Neue Datei @@ -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> { } src/main/java/de/gedoplan/seminar/sbt/di/exercise/rest/MixerEndpoint.java
Neue Datei @@ -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); } } src/main/java/de/gedoplan/seminar/sbt/di/exercise/service/CocktailOrderService.java
Neue Datei @@ -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); } } src/test/java/de/gedoplan/seminar/sbt/di/exercise/Exercise09Test.java
Neue Datei @@ -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)); } }