Skip to content

Commit

Permalink
Merge PR(#186) from feature/order - 결제 및 주문 API 수정 및 추가
Browse files Browse the repository at this point in the history
  • Loading branch information
woody35545 authored May 16, 2024
2 parents 039fce2 + 4bc49ea commit c5d79fa
Show file tree
Hide file tree
Showing 19 changed files with 546 additions and 106 deletions.
Original file line number Diff line number Diff line change
@@ -1,25 +1,33 @@
package com.t3t.bookstoreapi.order.controller;

import com.t3t.bookstoreapi.model.response.BaseResponse;
import com.t3t.bookstoreapi.order.model.dto.OrderDetailDto;
import com.t3t.bookstoreapi.model.response.PageResponse;
import com.t3t.bookstoreapi.order.model.request.MemberOrderPreparationRequest;
import com.t3t.bookstoreapi.order.model.request.OrderConfirmRequest;
import com.t3t.bookstoreapi.order.model.request.GuestOrderPreparationRequest;
import com.t3t.bookstoreapi.order.model.response.GuestOrderPreparationResponse;
import com.t3t.bookstoreapi.order.model.response.MemberOrderPreparationResponse;
import com.t3t.bookstoreapi.order.model.response.OrderDetailInfoResponse;
import com.t3t.bookstoreapi.order.model.response.OrderInfoResponse;
import com.t3t.bookstoreapi.order.service.OrderDetailService;
import com.t3t.bookstoreapi.order.service.OrderService;
import com.t3t.bookstoreapi.order.service.OrderServiceFacade;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@Slf4j
@RequiredArgsConstructor
public class OrderController {
private final OrderDetailService orderDetailService;
private final OrderServiceFacade orderServiceFacade;
private final OrderService orderService;

/**
* 주문 내에 속해있는 주문 상세 리스트 조회
Expand All @@ -29,8 +37,8 @@ public class OrderController {
*/
@GetMapping("/orders/{orderId}/details")
@ResponseStatus(HttpStatus.OK)
public BaseResponse<List<OrderDetailDto>> getOrderDetailDtoListByOrderId(@PathVariable("orderId") long orderId) {
return new BaseResponse<List<OrderDetailDto>>().data(orderDetailService.getOrderDetailDtoListByOrderId(orderId));
public BaseResponse<List<OrderDetailInfoResponse>> getOrderDetailDtoListByOrderId(@PathVariable("orderId") long orderId) {
return new BaseResponse<List<OrderDetailInfoResponse>>().data(orderDetailService.getOrderDetailInfoResponse(orderId));
}

/**
Expand All @@ -41,7 +49,8 @@ public BaseResponse<List<OrderDetailDto>> getOrderDetailDtoListByOrderId(@PathVa
*/
@PostMapping("/orders/confirm")
@ResponseStatus(HttpStatus.OK)
public BaseResponse<Void> confirmOrder(OrderConfirmRequest orderConfirmRequest) {
public BaseResponse<Void> confirmOrder(@RequestBody OrderConfirmRequest orderConfirmRequest) {
log.info("[*] orderConfirmRequest => {}", orderConfirmRequest);
orderServiceFacade.confirmOrder(orderConfirmRequest);
return new BaseResponse<Void>().message("주문 승인이 완료되었습니다.");
}
Expand Down Expand Up @@ -75,4 +84,25 @@ public BaseResponse<GuestOrderPreparationResponse> createMemberOrder(@RequestBod
public BaseResponse<MemberOrderPreparationResponse> createMemberOrder(@RequestBody MemberOrderPreparationRequest request) {
return new BaseResponse<MemberOrderPreparationResponse>().data(orderServiceFacade.prepareOrder(request));
}

/**
* 특정 회원의 모든 주문 관련 정보를 페이징을 통해 조회
*
* @author woody35545(구건모)
*/
@GetMapping("/members/{memberId}/orders")
public BaseResponse<PageResponse<OrderInfoResponse>> getMemberOrderInfoListByMemberId(@PathVariable("memberId") Long memberId, Pageable pageable) {

Page<OrderInfoResponse> orderInfoResponsePage = orderService.getMemberOrderInfoListByMemberId(memberId, pageable);

PageResponse<OrderInfoResponse> pageResponse = PageResponse.<OrderInfoResponse>builder()
.content(orderInfoResponsePage.getContent())
.pageNo(orderInfoResponsePage.getNumber())
.pageSize(orderInfoResponsePage.getSize())
.totalElements(orderInfoResponsePage.getTotalElements())
.totalPages(orderInfoResponsePage.getTotalPages())
.build();

return new BaseResponse<PageResponse<OrderInfoResponse>>().data(pageResponse);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,9 @@ public class MemberOrderPreparationRequest {
/**
* 배송 정보
*/
@Nullable
private Long memberAddressId; // 회원 주소록에서 주소를 선택한 경우 회원 주소 식별자

@Nullable
private Integer addressNumber; // 배송 우편 주소

Expand All @@ -64,7 +67,7 @@ public class MemberOrderPreparationRequest {

@AssertTrue(message = "우편 주소와 도로명 주소 중 하나는 반드시 입력되어야 합니다.")
private boolean isEitherAddressNotNull() {
return addressNumber != null || roadnameAddress != null;
return memberAddressId != null || addressNumber != null || roadnameAddress != null;
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package com.t3t.bookstoreapi.order.model.response;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;

/**
* 주문 상세와 관련된 정보를 반환하는 DTO
*
* @author woody35545(구건모)
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class OrderDetailInfoResponse {

private Long id; // 주문 상세 식별자
private Integer quantity; // 주문 수량
/**
* price<br>
* 주문 상세 항목 단건에 대한 최종 가격
* (= 책 가격 * 할인율 + 포장지 가격)
*/
private BigDecimal price; // 상품 최종 결제 금액

private LocalDateTime createdAt; // 주문 상세 생성 일시
/**
* order
*/
private Long orderId; // 주문 상세 항목이 속한 주문 정보 식별자
/**
* book
*/
private Long bookId; // 주문한 책 식별자
private String bookName; // 주문한 책 이름
private String bookPublisherName; // 주문한 책 출판사 이름

/**
* packaging
*/
private Long packagingId; // 주문 상세 항목에 사용된 포장지 식별자
private String packagingName; // 주문 상세 항목에 사용된 포장지 이름
private BigDecimal packagingPrice; // 주문 상세 항목에 사용된 포장지 가격

/**
* orderStatus
*/
private String orderStatusName; // 주문 상태 이름

/**
* delivery
*/
private Long deliveryId; // 배송 식별자
private BigDecimal deliveryPrice; // 배송비
private int addressNumber; // 우편 주소
private String roadnameAddress; // 도로명 주소
private String detailAddress; // 상세 주소
private LocalDate deliveryDate; // 배송 예정 일자(희망 배송 일자)
private String recipientName; // 수령인 이름
private String recipientPhoneNumber; // 수령인 연락처

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
package com.t3t.bookstoreapi.order.model.response;

import com.t3t.bookstoreapi.payment.constant.PaymentProviderType;
import com.t3t.bookstoreapi.payment.model.entity.PaymentProvider;
import lombok.*;
import org.springframework.lang.Nullable;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;

/**
* 주문 관련 정보에 대한 응답 객체
*
* @author woody35545(구건모)
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class OrderInfoResponse {

/**
* 주문 정보
*/
private Long orderId;
private LocalDateTime orderCreatedAt;

/**
* 주문에 포함된 주문 상세 정보
*/
private List<OrderDetailInfo> orderDetailInfoList;


/**
* 주문 회원 정보<br>
* 비회원의 경우 null 이 될 수 있다.
*/
@Nullable
private Long memberId;

/**
* 결제 정보
*/
private Long paymentId;
private Long paymentProviderId;
private PaymentProviderType paymentProviderType;
private BigDecimal paymentTotalAmount;
private LocalDateTime paymentCreatedAt;
private String paymentProviderOrderId;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public static class OrderDetailInfo {
private Long orderDetailId; // 주문 상세 식별자
private Integer quantity; // 주문 수량
/**
* price<br>
* 주문 상세 항목 단건에 대한 최종 가격
* (= 책 가격 * 할인율 + 포장지 가격)
*/
private BigDecimal price; // 상품 최종 결제 금액

private LocalDateTime createdAt; // 주문 상세 생성 일시

/**
* order
*/
private Long orderId; // 주문 상세 항목이 속한 주문 정보 식별자

/**
* book
*/
private Long bookId; // 주문한 책 식별자
private String bookName; // 주문한 책 이름
private String bookPublisherName; // 주문한 책 출판사 이름
private String bookImageUrl; // 책 이미지 URL

/**
* packaging
*/
private Long packagingId; // 주문 상세 항목에 사용된 포장지 식별자
private String packagingName; // 주문 상세 항목에 사용된 포장지 이름
private BigDecimal packagingPrice; // 주문 상세 항목에 사용된 포장지 가격

/**
* orderStatus
*/
private String orderStatusName; // 주문 상태 이름

/**
* delivery
*/
private Long deliveryId; // 배송 식별자
private BigDecimal deliveryPrice; // 배송비
private int addressNumber; // 우편 주소
private String roadnameAddress; // 도로명 주소
private String detailAddress; // 상세 주소
private LocalDate deliveryDate; // 배송 예정 일자(희망 배송 일자)
private String recipientName; // 수령인 이름
private String recipientPhoneNumber; // 수령인 연락처
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.t3t.bookstoreapi.order.model.dto.OrderDetailDto;
import com.t3t.bookstoreapi.order.model.entity.OrderDetail;
import com.t3t.bookstoreapi.order.model.response.OrderDetailInfoResponse;
import com.t3t.bookstoreapi.recommendation.model.response.BookInfoBriefResponse;

import java.util.List;
Expand All @@ -20,7 +21,7 @@ public interface OrderDetailRepositoryCustom {
*
* @author woody35545(구건모)
*/
List<OrderDetailDto> getOrderDetailDtoListByOrderId(long orderId);
List<OrderDetailInfoResponse> getOrderDetailInfoResponseListByOrderId(long orderId);

/**
* 주문 식별자로 주문 상세 엔티티 리스트 조회
Expand Down
Loading

0 comments on commit c5d79fa

Please sign in to comment.