Hendrik Jungnitsch
2022-09-29 15bd64cdd3d1183371daa7b396f9dd620be8461c
exercise
5 Dateien hinzugefügt
1 Dateien geändert
192 ■■■■■ Geänderte Dateien
src/main/java/de/gedoplan/seminar/sbt/di/exercise/domain/CocktailOrder.java 4 ●●●● Patch | Ansicht | Raw | Blame | Historie
src/main/java/de/gedoplan/seminar/sbt/di/exercise/exception/OutOfStockException.java 9 ●●●●● Patch | Ansicht | Raw | Blame | Historie
src/main/java/de/gedoplan/seminar/sbt/di/exercise/repository/CocktailOrderRepository.java 9 ●●●●● Patch | Ansicht | Raw | Blame | Historie
src/main/java/de/gedoplan/seminar/sbt/di/exercise/rest/MixerEndpoint.java 83 ●●●●● Patch | Ansicht | Raw | Blame | Historie
src/main/java/de/gedoplan/seminar/sbt/di/exercise/service/CocktailOrderService.java 51 ●●●●● Patch | Ansicht | Raw | Blame | Historie
src/test/java/de/gedoplan/seminar/sbt/di/exercise/Exercise09Test.java 36 ●●●●● 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));
    }
}