Commit c5c9b132 authored by 0Tyler's avatar 0Tyler

checkout api

parent 75175179
......@@ -6,12 +6,14 @@ import edu.prlab.ecsimple.service.AccountServiceImpl;
import edu.prlab.ecsimple.service.OrderServiceImpl;
import edu.prlab.ecsimple.service.ProductServiceImpl;
import lombok.RequiredArgsConstructor;
import org.hibernate.id.GUIDGenerator;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
@RequiredArgsConstructor
@Component
......@@ -38,6 +40,7 @@ public class DefaultDataBean implements ApplicationRunner {
.build())
.orElseThrow(() -> new EntityNotFoundException("no order"));
Item b = orderService.create(Item.builder()
.sku(UUID.randomUUID().toString())
.quantity(1)
.build())
.orElseThrow(() -> new EntityNotFoundException("no Item"));
......
package edu.prlab.ecsimple.controller;
import edu.prlab.ecsimple.common.mapper.MapperUtil;
import edu.prlab.ecsimple.model.OrderModel;
import edu.prlab.ecsimple.model.ResponseModel;
import edu.prlab.ecsimple.service.OrderServiceImpl;
import edu.prlab.ecsimple.service.ProductService;
import edu.prlab.ecsimple.service.ProductServiceImpl;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
@RestController
@RequiredArgsConstructor
public class ProductController {
private final ProductServiceImpl productService;
private final OrderServiceImpl orderService;
@GetMapping("/product/{sku}")
public ResponseEntity<ResponseModel> getProduct(@PathVariable Integer sku) {
......@@ -33,13 +34,22 @@ public class ProductController {
public ResponseEntity<ResponseModel> getProducts() {
return ResponseEntity.ok()
.body(ResponseModel.builder()
.status("status")
.data(MapperUtil.objectToJsonNode(productService.getProducts()))
.build());
.status("status")
.data(MapperUtil.objectToJsonNode(productService.getProducts()))
.build());
}
// @PostMapping("/checkout")
// public ResponseEntity<ResponseModel> checkout(){
// return
// }
@PostMapping("/checkout")
public ResponseEntity<ResponseModel> checkout(@RequestBody OrderModel orderModel) {
return orderService.checkout(orderModel)
.map(MapperUtil::objectToJsonNode)
.map(it -> ResponseEntity.ok()
.body(ResponseModel.builder()
.status("status")
.data(it)
.build()))
.orElseGet(() -> ResponseEntity.badRequest().body(ResponseModel.builder()
.status("status")
.build()));
}
}
\ No newline at end of file
......@@ -15,8 +15,8 @@ import javax.persistence.*;
public class Item {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer sku;
@GeneratedValue(strategy = GenerationType.IDENTITY)
private String sku;
@Column
private Integer quantity;
......
package edu.prlab.ecsimple.model;
import edu.prlab.ecsimple.domain.Item;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.FetchType;
import javax.persistence.ManyToMany;
import java.util.ArrayList;
import java.util.Collection;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class OrderModel {
@Builder.Default
private Collection<Item> lineItems = new ArrayList<>();
private String email;
private String creditCard;
}
......@@ -5,5 +5,5 @@ import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface ItemRepo extends JpaRepository<Item, Integer> {
public interface ItemRepo extends JpaRepository<Item, String> {
}
......@@ -2,11 +2,14 @@ package edu.prlab.ecsimple.service;
import edu.prlab.ecsimple.domain.Item;
import edu.prlab.ecsimple.domain.TheOrder;
import edu.prlab.ecsimple.model.OrderModel;
import java.util.Optional;
public interface OrderService {
Optional<TheOrder> create(TheOrder theOrder);
Optional<Item> create(Item item);
void addItemToOrder(Integer orderId, Integer itemId);
void addItemToOrder(Integer orderId, String sku);
Optional<TheOrder> checkout(OrderModel orderModel);
}
......@@ -3,13 +3,19 @@ package edu.prlab.ecsimple.service;
import edu.prlab.ecsimple.common.exception.EntityNotFoundException;
import edu.prlab.ecsimple.domain.Item;
import edu.prlab.ecsimple.domain.TheOrder;
import edu.prlab.ecsimple.model.OrderModel;
import edu.prlab.ecsimple.model.ResponseModel;
import edu.prlab.ecsimple.repo.ItemRepo;
import edu.prlab.ecsimple.repo.OrderRepo;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
@Service
@RequiredArgsConstructor
......@@ -32,13 +38,29 @@ public class OrderServiceImpl implements OrderService {
}
@Override
public void addItemToOrder(Integer orderId, Integer itemId) {
public void addItemToOrder(Integer orderId, String sku) {
orderRepo.findById(orderId)
.map(order -> itemRepo.findById(itemId)
.map(order -> itemRepo.findById(sku)
.map(item -> order.getItems().add(item))
.orElseThrow(() -> new EntityNotFoundException("No found this order")))
.orElseThrow(() -> new EntityNotFoundException("No found this order"));
}
@Override
public Optional<TheOrder> checkout(OrderModel orderModel) {
return Optional.of(orderModel)
.map(it -> orderRepo.save(TheOrder.builder()
.email(orderModel.getEmail())
.state("created")
.checkoutDate(LocalDateTime.now().toString())
.build()))
.map(order -> {
orderModel.getLineItems().stream()
.map(it -> create(it)
.orElseThrow(() -> new RuntimeException("save item error")))
.forEach(it -> addItemToOrder(order.getIid(), it.getSku()));
return order;
});
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment