Skip to content

Commit

Permalink
Merge pull request #7 from 1223v/ordercheck
Browse files Browse the repository at this point in the history
Feat: 주문접수 및 취소 기능 추가
  • Loading branch information
1223v authored Nov 25, 2023
2 parents 0cb5811 + cdded2d commit 2ed6cd6
Show file tree
Hide file tree
Showing 14 changed files with 294 additions and 6 deletions.
16 changes: 16 additions & 0 deletions src/main/java/com/readyvery/readyverydemo/domain/Order.java
Original file line number Diff line number Diff line change
Expand Up @@ -103,4 +103,20 @@ public class Order extends BaseTimeEntity {

@OneToOne(mappedBy = "order", fetch = FetchType.LAZY)
private Receipt receipt;

public void completeOrder(Progress progress) {
this.progress = progress;
}

public void cancelOrder(Progress progress) {
this.progress = progress;
}

public void orderTime(Long time) {
this.estimatedTime = LocalDateTime.now().plusMinutes(time);
}

public void cancelPayStatus() {
this.payStatus = false;
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.readyvery.readyverydemo.domain.repository;

import java.util.List;
import java.util.Optional;

import org.springframework.data.jpa.repository.JpaRepository;

Expand All @@ -11,4 +12,6 @@ public interface OrderRepository extends JpaRepository<Order, Long> {
List<Order> findAllById(Long id);

List<Order> findAllByProgressAndStoreId(Progress progress, Long storeId);

Optional<Order> findByOrderId(String orderId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,11 @@ public enum ExceptionCode {
NOT_FOUND_STORE(404, "Not found store."),
NOT_LOGIN_USER(401, "Not login user."),
NOT_FOUND_ORDER(404, "Not found order."),
NOT_PROGRESS_ORDER(400, "Not progress order.");
NOT_PROGRESS_ORDER(400, "Not progress order."),
NOT_CHANGE_ORDER(400, "Not change order."),
NOT_FOUND_TIME(404, "Not found time."),
TOSS_PAYMENT_SUCCESS_FAIL(400, "Toss payment success fail."),
NOT_FOUND_REJECT_REASON(404, "Not found reject reason.");

private int status;
private String message;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,17 @@

import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.readyvery.readyverydemo.domain.Progress;
import com.readyvery.readyverydemo.security.jwt.dto.CustomUserDetails;
import com.readyvery.readyverydemo.src.order.dto.OrderRegisterRes;
import com.readyvery.readyverydemo.src.order.dto.OrderStatusRes;
import com.readyvery.readyverydemo.src.order.dto.OrderStatusUpdateReq;

import lombok.RequiredArgsConstructor;

Expand All @@ -22,6 +26,18 @@ public class OrderController {
@GetMapping("/order")
public OrderRegisterRes getOrder(@AuthenticationPrincipal CustomUserDetails userDetails,
@RequestParam(required = false) Progress status) {
return orderServiceImpl.getOrder(userDetails.getId(), status);
return orderServiceImpl.getOrders(userDetails.getId(), status);
}

@PostMapping("/order/complete")
public OrderStatusRes completeOrder(@AuthenticationPrincipal CustomUserDetails userDetails,
@RequestBody OrderStatusUpdateReq request) {
return orderServiceImpl.completeOrder(userDetails.getId(), request);
}

@PostMapping("/order/cancel")
public OrderStatusRes cancelOrder(@AuthenticationPrincipal CustomUserDetails userDetails,
@RequestBody OrderStatusUpdateReq request) {
return orderServiceImpl.cancelOrder(userDetails.getId(), request);
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,18 @@
package com.readyvery.readyverydemo.src.order;

import com.readyvery.readyverydemo.domain.Order;
import com.readyvery.readyverydemo.domain.Progress;
import com.readyvery.readyverydemo.src.order.dto.OrderRegisterRes;
import com.readyvery.readyverydemo.src.order.dto.OrderStatusRes;
import com.readyvery.readyverydemo.src.order.dto.OrderStatusUpdateReq;

public interface OrderService {

OrderRegisterRes getOrder(Long id, Progress progress);
OrderRegisterRes getOrders(Long id, Progress progress);

OrderStatusRes completeOrder(Long id, OrderStatusUpdateReq request);

OrderStatusRes cancelOrder(Long id, OrderStatusUpdateReq request);

void cancelTossPayment(Order order, OrderStatusUpdateReq request);
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,18 @@
package com.readyvery.readyverydemo.src.order;

import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.Collections;
import java.util.List;
import java.util.Objects;

import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import net.minidev.json.JSONObject;

import com.readyvery.readyverydemo.domain.CeoInfo;
import com.readyvery.readyverydemo.domain.Order;
Expand All @@ -11,8 +21,12 @@
import com.readyvery.readyverydemo.domain.repository.OrderRepository;
import com.readyvery.readyverydemo.global.exception.BusinessLogicException;
import com.readyvery.readyverydemo.global.exception.ExceptionCode;
import com.readyvery.readyverydemo.src.order.config.TossPaymentConfig;
import com.readyvery.readyverydemo.src.order.dto.OrderMapper;
import com.readyvery.readyverydemo.src.order.dto.OrderRegisterRes;
import com.readyvery.readyverydemo.src.order.dto.OrderStatusRes;
import com.readyvery.readyverydemo.src.order.dto.OrderStatusUpdateReq;
import com.readyvery.readyverydemo.src.order.dto.TosspaymentDto;

import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
Expand All @@ -25,27 +39,134 @@ public class OrderServiceImpl implements OrderService {
private final OrderRepository orderRepository;
private final OrderMapper orderMapper;
private final CeoRepository ceoRepository;
private final TossPaymentConfig tosspaymentConfig;

@Override
public OrderRegisterRes getOrder(Long id, Progress progress) {
public OrderRegisterRes getOrders(Long id, Progress progress) {
CeoInfo ceoInfo = getCeoInfo(id);

if (progress == null) {
throw new BusinessLogicException(ExceptionCode.NOT_PROGRESS_ORDER);
}

List<Order> orders = orderRepository.findAllByProgressAndStoreId(progress, ceoInfo.getStore().getId());
log.info("progress: {}", orders);

if (orders.isEmpty()) {
throw new BusinessLogicException(ExceptionCode.NOT_FOUND_ORDER);
}
return orderMapper.orderToOrderRegisterRes(orders);
}

@Override
public OrderStatusRes completeOrder(Long id, OrderStatusUpdateReq request) {
CeoInfo ceoInfo = getCeoInfo(id);
Order order = getOrder(request.getOrderId());

verifyPostOrder(ceoInfo, order);
verifyPostProgress(order, request);
order.completeOrder(request.getStatus());
orderRepository.save(order);
return OrderStatusRes.builder()
.success(true)
.build();
}

@Override
public OrderStatusRes cancelOrder(Long id, OrderStatusUpdateReq request) {
CeoInfo ceoInfo = getCeoInfo(id);
Order order = getOrder(request.getOrderId());

verifyPostOrder(ceoInfo, order);
verifyPostProgress(order, request);
//order.cancelOrder(request.getStatus());
orderRepository.save(order);
return OrderStatusRes.builder()
.success(true)
.build();
}

@Override
public void cancelTossPayment(Order order, OrderStatusUpdateReq request) {

TosspaymentDto tosspaymentDto = requestTossPaymentCancel(order.getPaymentKey(), request.getRejectReason());

applyCancelTosspaymentDto(order, tosspaymentDto);

}

private void verifyPostProgress(Order order, OrderStatusUpdateReq request) {
if (order.getProgress() == Progress.ORDER && request.getStatus() == Progress.MAKE) { // 주문 -> 제조
if (request.getTime() == null) {
throw new BusinessLogicException(ExceptionCode.NOT_FOUND_TIME);
}
order.orderTime(request.getTime());
return;
} else if (order.getProgress() == Progress.ORDER && request.getStatus() == Progress.CANCEL) {
if (request.getRejectReason() == null) {
throw new BusinessLogicException(ExceptionCode.NOT_FOUND_REJECT_REASON);
}
cancelTossPayment(order, request);
return;
} else if (order.getProgress() == Progress.MAKE && request.getStatus() == Progress.COMPLETE) { // 제조 -> 완료
return;
} else if (order.getProgress() == Progress.COMPLETE && request.getStatus() == Progress.PICKUP) { // 완료 -> 픽업
return;
} else {
throw new BusinessLogicException(ExceptionCode.NOT_CHANGE_ORDER);
}
}

private void verifyPostOrder(CeoInfo ceoInfo, Order order) {
if (Objects.equals(order.getStore(), ceoInfo.getStore())) {
return;
}
throw new BusinessLogicException(ExceptionCode.NOT_FOUND_ORDER);
}

private Order getOrder(String orderId) {
return orderRepository.findByOrderId(orderId).orElseThrow(
() -> new BusinessLogicException(ExceptionCode.NOT_FOUND_ORDER)
);
}

private CeoInfo getCeoInfo(Long id) {
return ceoRepository.findById(id).orElseThrow(
() -> new BusinessLogicException(ExceptionCode.USER_NOT_FOUND)
);
}

private void applyCancelTosspaymentDto(Order order, TosspaymentDto tosspaymentDto) {
order.cancelOrder(Progress.CANCEL);
order.cancelPayStatus();
order.getReceipt().setCancels(tosspaymentDto.getCancels().toString());
order.getReceipt().setStatus(tosspaymentDto.getStatus());
}

private TosspaymentDto requestTossPaymentCancel(String paymentKey, String rejectReason) {
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = makeTossHeader();
JSONObject params = new JSONObject();

params.put("cancelReason", rejectReason);

try {
return restTemplate.postForObject(TossPaymentConfig.PAYMENT_URL + paymentKey + "/cancel",
new HttpEntity<>(params, headers),
TosspaymentDto.class);
} catch (Exception e) {
System.out.println("e.getMessage() = " + e.getMessage());
throw new BusinessLogicException(ExceptionCode.TOSS_PAYMENT_SUCCESS_FAIL);
}
}

private HttpHeaders makeTossHeader() {
HttpHeaders headers = new HttpHeaders();
String encodedAuthKey = new String(
Base64.getEncoder().encode((tosspaymentConfig.getTossSecretKey() + ":").getBytes(StandardCharsets.UTF_8)));
headers.setBasicAuth(encodedAuthKey);
headers.setContentType(MediaType.APPLICATION_JSON);
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
return headers;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.readyvery.readyverydemo.src.order.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;

import lombok.Getter;

@Configuration
@Getter
public class TossPaymentConfig {
public static final String PAYMENT_URL = "https://api.tosspayments.com/v1/payments/";
public static final String CONFIRM_URL = "https://api.tosspayments.com/v1/payments/confirm";

@Value("${payment.toss.client_key}")
private String tossClientKey;

@Value("${payment.toss.secret_key}")
private String tossSecretKey;

@Value("${payment.toss.success_url}")
private String tossSuccessUrl;

@Value("${payment.toss.fail_url}")
private String tossFailUrl;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.readyvery.readyverydemo.src.order.dto;

import lombok.Builder;
import lombok.Getter;

@Getter
@Builder
public class DefaultRes {
private String message;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.readyvery.readyverydemo.src.order.dto;

import com.readyvery.readyverydemo.domain.Progress;

import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
public class OrderCancelStatusUpdateReq {
private String orderId;
private Progress status;
private String rejectReason;

}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
public class OrderDto {
private Long idx;
private String orderNum;
private String orderId;
private Long pickUp;
private List<FoodieDto> foodies;
private String phone;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@ public OrderRegisterRes orderToOrderRegisterRes(List<Order> order) {
private OrderDto toOrderDto(Order order) {
return OrderDto.builder()
.idx(order.getId())
.orderNum(order.getOrderId())
.orderNum(order.getOrderNumber())
.orderId(order.getOrderId())
.pickUp(order.getInOut())
.time(order.getCreatedAt())
.phone(order.getUserInfo().getPhone())
Expand All @@ -41,4 +42,10 @@ private FoodieDto cartItemToFoodieDto(CartItem cartItem) {
cartItem.getCartOptions().stream().map(cartOption -> cartOption.getFoodieOption().getName()).toList())
.build();
}

public DefaultRes tosspaymentDtoToCancelRes() {
return DefaultRes.builder()
.message("취소 성공")
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.readyvery.readyverydemo.src.order.dto;

import lombok.Builder;
import lombok.Getter;

@Getter
@Builder
public class OrderStatusRes {
private boolean success;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.readyvery.readyverydemo.src.order.dto;

import com.readyvery.readyverydemo.domain.Progress;

import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
public class OrderStatusUpdateReq {
private String orderId;
private Progress status;
private Long time;
private String rejectReason;
}
Loading

0 comments on commit 2ed6cd6

Please sign in to comment.