이 내용은 스프링 부트 쇼핑몰 프로젝트 with JPA 책을 학습한 내용입니다.
- 주문 취소 시 상품의 재고를 상품 주문 수량만큼 다시 더해주는 addStock() 메소드를 추가함
| |
| public void addStock(int stockNumber) { |
| this.stockNumber += stockNumber; |
| } |
- Item.addStock() 메소드를 호출하는 cancel 메소드 추가
- 주문 상품 수량을 파라미터로 넘김
| |
| public void cancel() { |
| this.getItem().addStock(count); |
| } |
- 주문 상태를 CANCEL로 변경
- 모든 OrderItem 객체의 cancel() 메소드를 수행4. OrderService
// 주문 취소 시 주문 수량을 상품의 재고에 더해주고 주문 상태를 취소 상태로 바꿔주는 메소드
public void cancelOrder() {
this.orderStatus = orderStatus.CANCEL;
for(OrderItem orderItem : orderItems) {
orderItem.cancel();
}
}
- 상품을 주문한 유저와 주문 취소를 요청한 유저가 동일한지 검증
| |
| @Transactional(readOnly = true) |
| public boolean validateOrder(Long orderId, String email) { |
| Member curMember = memberRepository.findByEmail(email); |
| Order order = orderRepository.findById(orderId).orElseThrow(EntityNotFoundException::new); |
| Member savedMember = order.getMember(); |
| |
| if(!StringUtils.equals(curMember.getEmail(), savedMember.getEmail())) { |
| return false; |
| } |
| return true; |
| } |
| public void cancelOrder(Long orderId) { |
| Order order = orderRepository.findById(orderId).orElseThrow(EntityNotFoundException::new); |
| order.cancelOrder(); |
| } |
- 상품을 주문한 유저가 맞는 지 검증 후 orderService.cancelOrder() 메소드 수행
| |
| @PostMapping("/order/{orderId}/cancel") |
| public @ResponseBody ResponseEntity cancelOrder(@PathVariable("orderId") Long orderId, Principal principal) { |
| |
| if(!orderService.validateOrder(orderId, principal.getName())) { |
| return new ResponseEntity<String>("주문 취소 권한이 없습니다.", HttpStatus.FORBIDDEN); |
| } |
| |
| orderService.cancelOrder(orderId); |
| return new ResponseEntity<Long>(orderId, HttpStatus.OK); |
| } |
- 해당 주문을 취소하도록 요청을 보내는 cancelOrder() 함수 Ajax 코드
| <script th:inline="javascript"> |
| function cancelOrder(orderId) { |
| var token = $("meta[name='_csrf']").attr("content"); |
| var header = $("meta[name='_csrf_header']").attr("content"); |
| |
| var url = "/order/" + orderId + "/cancel"; |
| var paramData = { |
| orderId : orderId, |
| }; |
| |
| var param = JSON.stringify(paramData); |
| |
| $.ajax({ |
| url : url, |
| type : "POST", |
| contentType : "application/json", |
| data : param, |
| beforeSend : function(xhr){ |
| |
| xhr.setRequestHeader(header, token); |
| }, |
| dataType : "json", |
| cache : false, |
| success : function(result, status){ |
| alert("주문이 취소 되었습니다."); |
| location.href='/orders/' + [[${page}]]; |
| }, |
| error : function(jqXHR, status, error){ |
| if(jqXHR.status == '401'){ |
| alert('로그인 후 이용해주세요'); |
| location.href='/member/login'; |
| } else{ |
| alert(jqXHR.responseText); |
| } |
| } |
| }); |
| } |
| </script> |
- "주문취소" 버튼을 클릭하면 페이지를 생성할 때 미리 설정해놨던 value = "${order.orderId}" 값을 파라미터로해서 cancelOrder() 함수 호출
| <button type="button" class="btn btn-outline-secondary" |
| th:value="${order.orderId}" onclick="cancelOrder(this.value)">주문취소</button> |