Skip to content

Commit

Permalink
Merge pull request #115 from nhnacademy-be4-ckin/develop
Browse files Browse the repository at this point in the history
[DEPLOY] 주문 수정
  • Loading branch information
f1v3-dev authored Mar 13, 2024
2 parents cc134ff + c6c41ff commit 0c3b7b4
Show file tree
Hide file tree
Showing 11 changed files with 161 additions and 107 deletions.
19 changes: 9 additions & 10 deletions src/main/java/store/ckin/api/sale/controller/SaleController.java
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,9 @@ public class SaleController {
* @return 주문 번호
*/
@PostMapping
public ResponseEntity<Long> createSale(@Valid @RequestBody SaleCreateRequestDto requestDto) {
Long saleId = saleFacade.createSale(requestDto);
return ResponseEntity.status(HttpStatus.CREATED).body(saleId);
public ResponseEntity<String> createSale(@Valid @RequestBody SaleCreateRequestDto requestDto) {
String saleNumber = saleFacade.createSale(requestDto);
return ResponseEntity.status(HttpStatus.CREATED).body(saleNumber);
}

/**
Expand All @@ -54,8 +54,7 @@ public ResponseEntity<Long> createSale(@Valid @RequestBody SaleCreateRequestDto
* @return 주문 DTO 리스트
*/
@GetMapping
public ResponseEntity<PagedResponse<List<SaleResponseDto>>> getSales(
@PageableDefault(page = 0, size = 10) Pageable pageable) {
public ResponseEntity<PagedResponse<List<SaleResponseDto>>> getSales(@PageableDefault Pageable pageable) {
return ResponseEntity.ok(saleFacade.getSales(pageable));
}

Expand Down Expand Up @@ -86,14 +85,14 @@ public ResponseEntity<Void> updateSalePaymentPaidStatus(@PathVariable("saleId")
}

/**
* 주문 ID로 주문 상세 정보와 주문한 책 정보를 조회하는 메서드입니다.
* 주문 번호로 주문 상세 정보와 주문한 책 정보를 조회하는 메서드입니다.
*
* @param saleId 주문 ID
* @param saleNumber 주문 번호 (UUID)
* @return 200 (OK), 주문 상세 정보와 주문한 책 정보
*/
@GetMapping("/{saleId}/books")
public ResponseEntity<SaleWithBookResponseDto> getSaleWithBooks(@PathVariable Long saleId) {
SaleWithBookResponseDto responseDto = saleFacade.getSaleWithBookResponseDto(saleId);
@GetMapping("/{saleNumber}/books")
public ResponseEntity<SaleWithBookResponseDto> getSaleWithBooks(@PathVariable String saleNumber) {
SaleWithBookResponseDto responseDto = saleFacade.getSaleWithBookResponseDto(saleNumber);
return ResponseEntity.ok(responseDto);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package store.ckin.api.sale.exception;

/**
* 주문 번호로 주문을 조회할 때 주문이 존재하지 않는 경우 발생하는 예외입니다.
*
* @author 정승조
* @version 2024. 03. 13.
*/
public class SaleNotFoundExceptionBySaleNumber extends RuntimeException {

public SaleNotFoundExceptionBySaleNumber(String number) {
super(String.format("주문 번호(%s)에 해당하는 주문이 존재하지 않습니다.", number));
}
}
16 changes: 8 additions & 8 deletions src/main/java/store/ckin/api/sale/facade/SaleFacade.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,20 +48,20 @@ public class SaleFacade {
* @return 생성된 주문 ID
*/
@Transactional
public Long createSale(SaleCreateRequestDto requestDto) {
public String createSale(SaleCreateRequestDto requestDto) {

SaleCreateNoBookRequestDto saleInfo =
requestDto.toCreateSaleWithoutBookRequestDto();

Long saleId = saleService.createSale(saleInfo);
SaleResponseDto sale = saleService.createSale(saleInfo);

bookSaleService.createBookSale(saleId, requestDto.getBookSaleList());
bookSaleService.createBookSale(sale.getSaleId(), requestDto.getBookSaleList());

if (requestDto.getMemberId() != null && requestDto.getPointUsage() > 0) {
memberService.updatePoint(requestDto.getMemberId(), requestDto.getPointUsage());
}

return saleId;
return sale.getSaleNumber();
}

/**
Expand Down Expand Up @@ -105,14 +105,14 @@ public void updateSalePaymentPaidStatus(Long saleId) {
}

/**
* 주문 ID로 주문 상세 정보와 주문한 책 정보를 조회하는 메서드입니다.
* 주문 번호로 주문 상세 정보와 주문한 책 정보를 조회하는 메서드입니다.
*
* @param saleId 주문 ID
* @param saleNumber 주문 번호 (UUID)
* @return 주문 상세 정보와 주문한 책 정보
*/
@Transactional(readOnly = true)
public SaleWithBookResponseDto getSaleWithBookResponseDto(Long saleId) {
return saleService.getSaleWithBook(saleId);
public SaleWithBookResponseDto getSaleWithBookResponseDto(String saleNumber) {
return saleService.getSaleWithBook(saleNumber);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,12 @@ public interface SaleRepositoryCustom {
SaleResponseDto findBySaleId(Long saleId);

/**
* 주문 ID로 주문 상세 정보와 주문한 책 정보를 조회하는 메서드입니다.
* 주문 번호로 주문 상세 정보와 주문한 책 정보를 조회하는 메서드입니다.
*
* @param saleId 주문 ID
* @param saleNumber 주문 번호
* @return 주문 상세 정보와 주문한 책 정보 DTO
*/
SaleWithBookResponseDto getSaleWithBook(Long saleId);
SaleWithBookResponseDto getSaleWithBook(String saleNumber);


/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,11 +65,11 @@ public SaleResponseDto findBySaleId(Long saleId) {
/**
* {@inheritDoc}
*
* @param saleId 주문 ID
* @param saleNumber 주문 번호
* @return 주문 상세 정보와 주문한 책 정보 DTO
*/
@Override
public SaleWithBookResponseDto getSaleWithBook(Long saleId) {
public SaleWithBookResponseDto getSaleWithBook(String saleNumber) {

QSale sale = QSale.sale;

Expand All @@ -82,7 +82,7 @@ public SaleWithBookResponseDto getSaleWithBook(Long saleId) {

List<BookSaleResponseDto> bookSaleResponseDtoList =
from(bookSale)
.where(bookSale.pk.saleId.eq(saleId))
.where(bookSale.sale.saleNumber.eq(saleNumber))
.select(Projections.constructor(BookSaleResponseDto.class,
bookSale.pk.saleId,
bookSale.pk.bookId,
Expand All @@ -96,7 +96,7 @@ public SaleWithBookResponseDto getSaleWithBook(Long saleId) {

SaleWithBookResponseDto responseDto =
from(sale)
.where(sale.saleId.eq(saleId))
.where(sale.saleNumber.eq(saleNumber))
.leftJoin(sale.member, member)
.on(sale.member.id.eq(member.id))
.select(Projections.constructor(SaleWithBookResponseDto.class,
Expand Down
6 changes: 3 additions & 3 deletions src/main/java/store/ckin/api/sale/service/SaleService.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public interface SaleService {
* @param requestDto 주문 생성 요청 DTO
* @return 생성된 주문 ID
*/
Long createSale(SaleCreateNoBookRequestDto requestDto);
SaleResponseDto createSale(SaleCreateNoBookRequestDto requestDto);


/**
Expand Down Expand Up @@ -53,10 +53,10 @@ public interface SaleService {
/**
* 주문 ID로 주문 상세 정보와 주문한 책 정보를 조회하는 메서드입니다.
*
* @param saleId 주문 ID
* @param saleNumber 주문 번호 (UUID)
* @return 주문 상세 정보와 주문한 책 정보 DTO
*/
SaleWithBookResponseDto getSaleWithBook(Long saleId);
SaleWithBookResponseDto getSaleWithBook(String saleNumber);

/**
* 주문 결제 정보를 조회하는 메서드입니다.
Expand Down
22 changes: 11 additions & 11 deletions src/main/java/store/ckin/api/sale/service/impl/SaleServiceImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import store.ckin.api.sale.dto.response.SaleWithBookResponseDto;
import store.ckin.api.sale.entity.Sale;
import store.ckin.api.sale.exception.SaleNotFoundException;
import store.ckin.api.sale.exception.SaleNotFoundExceptionBySaleNumber;
import store.ckin.api.sale.exception.SaleNumberNotFoundException;
import store.ckin.api.sale.repository.SaleRepository;
import store.ckin.api.sale.service.SaleService;
Expand Down Expand Up @@ -50,7 +51,7 @@ public class SaleServiceImpl implements SaleService {
*/
@Override
@Transactional
public Long createSale(SaleCreateNoBookRequestDto requestDto) {
public SaleResponseDto createSale(SaleCreateNoBookRequestDto requestDto) {

Optional<Member> member = Optional.empty();
if (Objects.nonNull(requestDto.getMemberId())) {
Expand Down Expand Up @@ -79,9 +80,8 @@ public Long createSale(SaleCreateNoBookRequestDto requestDto) {
.build();


Sale save = saleRepository.save(sale);

return save.getSaleId();
Sale savedSale = saleRepository.save(sale);
return SaleResponseDto.toDto(savedSale);
}

/**
Expand Down Expand Up @@ -134,21 +134,22 @@ public void updateSalePaymentPaidStatus(Long saleId) {
sale.updatePaymentStatus(Sale.PaymentStatus.PAID);
}


/**
* {@inheritDoc}
*
* @param saleId 주문 ID
* @param saleNumber 주문 번호 (UUID)
* @return 주문 상세 정보와 주문한 책 정보 DTO
*/
@Override
@Transactional(readOnly = true)
public SaleWithBookResponseDto getSaleWithBook(Long saleId) {
public SaleWithBookResponseDto getSaleWithBook(String saleNumber) {

if (!saleRepository.existsById(saleId)) {
throw new SaleNotFoundException(saleId);
if (!saleRepository.existsBySaleNumber(saleNumber)) {
throw new SaleNotFoundExceptionBySaleNumber(saleNumber);
}

return saleRepository.getSaleWithBook(saleId);
return saleRepository.getSaleWithBook(saleNumber);
}

/**
Expand All @@ -165,9 +166,8 @@ public SaleInfoResponseDto getSalePaymentInfo(String saleNumber) {
throw new SaleNumberNotFoundException(saleNumber);
}

Long saleId = saleRepository.getBySaleNumber(saleNumber).getSaleId();

return saleRepository.getSaleWithBook(saleId).extractSaleInfoResponseDto();
return saleRepository.getSaleWithBook(saleNumber).extractSaleInfoResponseDto();
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ class SaleControllerTest {
void testCreateSale() throws Exception {

given(saleFacade.createSale(any(SaleCreateRequestDto.class)))
.willReturn(1L);
.willReturn("12314");

SaleCreateRequestDto requestDto = new SaleCreateRequestDto(
1L,
Expand All @@ -84,7 +84,7 @@ void testCreateSale() throws Exception {
.contentType(MediaType.APPLICATION_JSON)
.content(json))
.andExpect(status().isCreated())
.andExpect(content().json("1"))
.andExpect(content().json("12314"))
.andDo(print());

verify(saleFacade, times(1)).createSale(any());
Expand Down Expand Up @@ -201,42 +201,42 @@ void testGetSaleDetail() throws Exception {

mockMvc.perform(get("/api/sales/{saleId}", 1L))

.andExpectAll(
status().isOk(),
content().contentType(MediaType.APPLICATION_JSON),
jsonPath("$.booksaleList[0].bookId").value(bookSale.getBookId()),
jsonPath("$.booksaleList[0].fileUrl").value(bookSale.getFileUrl()),
jsonPath("$.booksaleList[0].bookTitle").value(bookSale.getBookTitle()),
jsonPath("$.booksaleList[0].quantity").value(bookSale.getQuantity()),
jsonPath("$.booksaleList[0].couponId").value(bookSale.getCouponId()),
jsonPath("$.booksaleList[0].packagingType").value(bookSale.getPackagingType()),
jsonPath("$.booksaleList[0].packagingPrice").value(bookSale.getPackagingPrice()),
jsonPath("$.booksaleList[0].paymentAmount").value(bookSale.getPaymentAmount()),
jsonPath("$.saleResponseDto.saleId").value(sale.getSaleId()),
jsonPath("$.saleResponseDto.memberEmail").value(sale.getMemberEmail()),
jsonPath("$.saleResponseDto.saleNumber").value(sale.getSaleNumber()),
jsonPath("$.saleResponseDto.saleOrdererName").value(sale.getSaleOrdererName()),
jsonPath("$.saleResponseDto.saleOrdererContact").value(sale.getSaleOrdererContact()),
jsonPath("$.saleResponseDto.saleReceiverName").value(sale.getSaleReceiverName()),
jsonPath("$.saleResponseDto.saleReceiverContact").value(sale.getSaleReceiverContact()),
jsonPath("$.saleResponseDto.saleReceiverAddress").value(sale.getSaleReceiverAddress()),
jsonPath("$.saleResponseDto.saleDate").isNotEmpty(),
jsonPath("$.saleResponseDto.saleShippingDate").isNotEmpty(),
jsonPath("$.saleResponseDto.saleDeliveryDate").isNotEmpty(),
jsonPath("$.saleResponseDto.saleDeliveryStatus").value(sale.getSaleDeliveryStatus().name()),
jsonPath("$.saleResponseDto.saleDeliveryFee").value(sale.getSaleDeliveryFee()),
jsonPath("$.saleResponseDto.salePointUsage").value(sale.getSalePointUsage()),
jsonPath("$.saleResponseDto.saleTotalPrice").value(sale.getSaleTotalPrice()),
jsonPath("$.saleResponseDto.salePaymentStatus").value(sale.getSalePaymentStatus().name()),
jsonPath("$.saleResponseDto.saleShippingPostCode").value(sale.getSaleShippingPostCode()),
jsonPath("$.paymentResponseDto.paymentId").value(payment.getPaymentId()),
jsonPath("$.paymentResponseDto.saleId").value(payment.getSaleId()),
jsonPath("$.paymentResponseDto.paymentKey").value(payment.getPaymentKey()),
jsonPath("$.paymentResponseDto.paymentStatus").value(payment.getPaymentStatus()),
jsonPath("$.paymentResponseDto.requestedAt").isNotEmpty(),
jsonPath("$.paymentResponseDto.approvedAt").isNotEmpty(),
jsonPath("paymentResponseDto.receiptUrl").value(payment.getReceiptUrl())
);
.andExpectAll(
status().isOk(),
content().contentType(MediaType.APPLICATION_JSON),
jsonPath("$.booksaleList[0].bookId").value(bookSale.getBookId()),
jsonPath("$.booksaleList[0].fileUrl").value(bookSale.getFileUrl()),
jsonPath("$.booksaleList[0].bookTitle").value(bookSale.getBookTitle()),
jsonPath("$.booksaleList[0].quantity").value(bookSale.getQuantity()),
jsonPath("$.booksaleList[0].couponId").value(bookSale.getCouponId()),
jsonPath("$.booksaleList[0].packagingType").value(bookSale.getPackagingType()),
jsonPath("$.booksaleList[0].packagingPrice").value(bookSale.getPackagingPrice()),
jsonPath("$.booksaleList[0].paymentAmount").value(bookSale.getPaymentAmount()),
jsonPath("$.saleResponseDto.saleId").value(sale.getSaleId()),
jsonPath("$.saleResponseDto.memberEmail").value(sale.getMemberEmail()),
jsonPath("$.saleResponseDto.saleNumber").value(sale.getSaleNumber()),
jsonPath("$.saleResponseDto.saleOrdererName").value(sale.getSaleOrdererName()),
jsonPath("$.saleResponseDto.saleOrdererContact").value(sale.getSaleOrdererContact()),
jsonPath("$.saleResponseDto.saleReceiverName").value(sale.getSaleReceiverName()),
jsonPath("$.saleResponseDto.saleReceiverContact").value(sale.getSaleReceiverContact()),
jsonPath("$.saleResponseDto.saleReceiverAddress").value(sale.getSaleReceiverAddress()),
jsonPath("$.saleResponseDto.saleDate").isNotEmpty(),
jsonPath("$.saleResponseDto.saleShippingDate").isNotEmpty(),
jsonPath("$.saleResponseDto.saleDeliveryDate").isNotEmpty(),
jsonPath("$.saleResponseDto.saleDeliveryStatus").value(sale.getSaleDeliveryStatus().name()),
jsonPath("$.saleResponseDto.saleDeliveryFee").value(sale.getSaleDeliveryFee()),
jsonPath("$.saleResponseDto.salePointUsage").value(sale.getSalePointUsage()),
jsonPath("$.saleResponseDto.saleTotalPrice").value(sale.getSaleTotalPrice()),
jsonPath("$.saleResponseDto.salePaymentStatus").value(sale.getSalePaymentStatus().name()),
jsonPath("$.saleResponseDto.saleShippingPostCode").value(sale.getSaleShippingPostCode()),
jsonPath("$.paymentResponseDto.paymentId").value(payment.getPaymentId()),
jsonPath("$.paymentResponseDto.saleId").value(payment.getSaleId()),
jsonPath("$.paymentResponseDto.paymentKey").value(payment.getPaymentKey()),
jsonPath("$.paymentResponseDto.paymentStatus").value(payment.getPaymentStatus()),
jsonPath("$.paymentResponseDto.requestedAt").isNotEmpty(),
jsonPath("$.paymentResponseDto.approvedAt").isNotEmpty(),
jsonPath("paymentResponseDto.receiptUrl").value(payment.getReceiptUrl())
);


verify(saleFacade, times(1)).getSaleDetail(anyLong());
Expand Down Expand Up @@ -274,10 +274,9 @@ void testGetSaleWithBooks() throws Exception {
);


given(saleFacade.getSaleWithBookResponseDto(anyLong()))
given(saleFacade.getSaleWithBookResponseDto(anyString()))
.willReturn(responseDto);
mockMvc.perform(get("/api/sales/{saleId}/books", 1L))

mockMvc.perform(get("/api/sales/{saleNumber}/books", "ABC1234DEF"))
.andExpectAll(
status().isOk(),
content().contentType(MediaType.APPLICATION_JSON),
Expand All @@ -296,7 +295,7 @@ void testGetSaleWithBooks() throws Exception {
jsonPath("$.totalPrice").value(responseDto.getTotalPrice())
).andDo(print());

verify(saleFacade, times(1)).getSaleWithBookResponseDto(anyLong());
verify(saleFacade, times(1)).getSaleWithBookResponseDto(anyString());
}

@Test
Expand Down
Loading

0 comments on commit 0c3b7b4

Please sign in to comment.