Controller
@RestController
@RequestMapping("/cafe")
@RequiredArgsConstructor
public class CafeController {
private final CafeService cafeService;
@GetMapping("hello")
public String welcomeMessage(){
return "Welcome to The Wanted coding cafe!!";
}
@GetMapping("order")
public String orderFromMenu(){
HashMap<String, Integer> menu = new HashMap<String, Integer>();
menu.put("AMERICANO", 3);
return cafeService.orderFrom(menu);
}
}
Service
@Service
@RequiredArgsConstructor
public class CafeService {
private final Cafe wantedCafe;
public String orderFrom(HashMap<String, Integer> menu){
Cashier cashier = new Cashier(wantedCafe);
Map<String, Integer> myOrders = new HashMap<>();
myOrders.put("AMERICANO", 3);
Customer c1 = new Customer("Card", myOrders);
return c1.buyCoffee(cashier);
}
}
Handler
@Component
public class Cafe {
private final String name;
private Long sales;
public Cafe(){
this.name = "wantedCodingCafe";
this.sales = 10000L;
}
public String getCafeName(){
return name;
}
public void plusSales(Long amount){
this.sales += amount;
}
public void minusSales(Long amount){
this.sales -= amount;
}
}
public class Cashier {
private final Cafe cafe;
public Cashier(Cafe cafe) {
this.cafe = cafe;
}
public long calculateTotalPrice(Map<String, Integer> orders) {
long totalPrice = 0L;
long americanoPrice = 100L;
for (String key : orders.keySet()) {
if (key.equalsIgnoreCase("AMERICANO"))
totalPrice += americanoPrice * orders.get(key);
}
return totalPrice;
}
private String sendTo(Barista barista, Map<String, Integer> receivedOrders) {
return barista.makeCoffeeTo(receivedOrders);
}
public String takeOrder(Map<String, Integer> receivedOrders, long totalPrice) {
cafe.plusSales(totalPrice);
return sendTo(new Barista(0,0), receivedOrders);
}
}
public class Barista {
private int rank; // 0: Beginner 1: Middle 2: Master
private int status; // 0: Waiting 1: Making
public Barista(int rank, int status){
this.rank = rank;
this.status = status;
}
private void setRank(int rank){
this.rank = rank;
}
private void setStatus(int status){
this.status = status;
}
public String makeCoffeeTo(Map<String, Integer> orders){
StringBuilder makeOrders = new StringBuilder();
for(String coffeeName : orders.keySet()){
int quantity = orders.get(coffeeName);
makeOrders.append(coffeeName)
.append(":")
.append(quantity);
}
return makeOrders.toString();
}
}
public class Customer {
private String paymentMethod;
private final Map<String, Integer> myOrders;
public Customer(String paymentMethod, Map<String, Integer> orders) {
this.paymentMethod = paymentMethod;
this.myOrders = orders;
}
private void setPaymentMethod(String paymentMethod) {
this.paymentMethod = paymentMethod;
}
public String buyCoffee(Cashier cashier) {
long totalPrice = cashier.calculateTotalPrice(myOrders);
return cashier.takeOrder(myOrders, totalPrice);
}
}