From df47331805b27869bb9d58a310157c4a8f7f8d3e Mon Sep 17 00:00:00 2001 From: KyuCheol Hwang Date: Fri, 5 Jan 2024 17:06:37 +0900 Subject: [PATCH 01/11] =?UTF-8?q?feat:=20=EC=83=81=ED=92=88=20Repository?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ProductRepository 구현 --- .../domain/product/repository/ProductRepository.java | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/main/java/kr/co/fastcampus/yanabada/domain/product/repository/ProductRepository.java diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/product/repository/ProductRepository.java b/src/main/java/kr/co/fastcampus/yanabada/domain/product/repository/ProductRepository.java new file mode 100644 index 00000000..d6f44b1b --- /dev/null +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/product/repository/ProductRepository.java @@ -0,0 +1,8 @@ +package kr.co.fastcampus.yanabada.domain.product.repository; + +import kr.co.fastcampus.yanabada.domain.product.entity.Product; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ProductRepository extends JpaRepository { + +} From d2f4b99bc98246f0d0cb364b1001b467aae0c436 Mon Sep 17 00:00:00 2001 From: KyuCheol Hwang Date: Fri, 5 Jan 2024 17:12:08 +0900 Subject: [PATCH 02/11] =?UTF-8?q?feat:=20=EC=83=81=ED=92=88=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EC=9A=94=EC=B2=AD=20DTO=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ProductSaveRequest 구현 --- .../product/dto/ProductSaveRequest.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/main/java/kr/co/fastcampus/yanabada/domain/product/dto/ProductSaveRequest.java diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/product/dto/ProductSaveRequest.java b/src/main/java/kr/co/fastcampus/yanabada/domain/product/dto/ProductSaveRequest.java new file mode 100644 index 00000000..c44daab5 --- /dev/null +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/product/dto/ProductSaveRequest.java @@ -0,0 +1,28 @@ +package kr.co.fastcampus.yanabada.domain.product.dto; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import java.time.LocalDate; + +public record ProductSaveRequest( + + @NotNull + Long orderId, + + @NotNull + Integer price, + + @NotBlank + String description, + + @NotNull + Boolean canNegotiate, + + @NotNull + LocalDate saleEndDate, + + @NotNull + Boolean isAutoCancel +) { + +} From 004901d29eefec0bd85c7c382c2973e8d1685e60 Mon Sep 17 00:00:00 2001 From: KyuCheol Hwang Date: Fri, 5 Jan 2024 17:14:07 +0900 Subject: [PATCH 03/11] =?UTF-8?q?feat:=20=EC=83=81=ED=92=88=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EC=9D=91=EB=8B=B5=20DTO=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ProductIdResponse 구현 --- .../product/dto/{ => request}/ProductSaveRequest.java | 2 +- .../domain/product/dto/response/ProductIdResponse.java | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) rename src/main/java/kr/co/fastcampus/yanabada/domain/product/dto/{ => request}/ProductSaveRequest.java (86%) create mode 100644 src/main/java/kr/co/fastcampus/yanabada/domain/product/dto/response/ProductIdResponse.java diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/product/dto/ProductSaveRequest.java b/src/main/java/kr/co/fastcampus/yanabada/domain/product/dto/request/ProductSaveRequest.java similarity index 86% rename from src/main/java/kr/co/fastcampus/yanabada/domain/product/dto/ProductSaveRequest.java rename to src/main/java/kr/co/fastcampus/yanabada/domain/product/dto/request/ProductSaveRequest.java index c44daab5..a37ee69e 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/product/dto/ProductSaveRequest.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/product/dto/request/ProductSaveRequest.java @@ -1,4 +1,4 @@ -package kr.co.fastcampus.yanabada.domain.product.dto; +package kr.co.fastcampus.yanabada.domain.product.dto.request; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/product/dto/response/ProductIdResponse.java b/src/main/java/kr/co/fastcampus/yanabada/domain/product/dto/response/ProductIdResponse.java new file mode 100644 index 00000000..1e08951a --- /dev/null +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/product/dto/response/ProductIdResponse.java @@ -0,0 +1,7 @@ +package kr.co.fastcampus.yanabada.domain.product.dto.response; + +public record ProductIdResponse( + Long productId +) { + +} From 21b043bbe1d6c33970978dbe9e8706b606e4f2d9 Mon Sep 17 00:00:00 2001 From: KyuCheol Hwang Date: Fri, 5 Jan 2024 17:16:40 +0900 Subject: [PATCH 04/11] =?UTF-8?q?rename:=20RoomOrder=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=EB=AA=85=20Order=20=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit RoomOrder -> Order 로 클래스명 변경 --- .../domain/order/dto/request/OrderSaveRequest.java | 6 +++--- .../order/entity/{RoomOrder.java => Order.java} | 8 ++++---- .../domain/order/repository/OrderRepository.java | 4 ++-- .../yanabada/domain/order/service/OrderService.java | 4 ++-- .../yanabada/domain/product/entity/Product.java | 12 ++++++------ 5 files changed, 17 insertions(+), 17 deletions(-) rename src/main/java/kr/co/fastcampus/yanabada/domain/order/entity/{RoomOrder.java => Order.java} (96%) diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/order/dto/request/OrderSaveRequest.java b/src/main/java/kr/co/fastcampus/yanabada/domain/order/dto/request/OrderSaveRequest.java index d0d13a0a..6a48ad4c 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/order/dto/request/OrderSaveRequest.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/order/dto/request/OrderSaveRequest.java @@ -3,7 +3,7 @@ import java.time.LocalDate; import kr.co.fastcampus.yanabada.domain.accommodation.entity.Room; import kr.co.fastcampus.yanabada.domain.member.entity.Member; -import kr.co.fastcampus.yanabada.domain.order.entity.RoomOrder; +import kr.co.fastcampus.yanabada.domain.order.entity.Order; import kr.co.fastcampus.yanabada.domain.order.entity.enums.OrderStatus; import kr.co.fastcampus.yanabada.domain.order.entity.enums.PaymentType; @@ -23,8 +23,8 @@ public record OrderSaveRequest( Integer childCount ) { - public RoomOrder toEntity(Room room, Member member) { - return RoomOrder.create( + public Order toEntity(Room room, Member member) { + return Order.create( room, member, checkInDate, diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/order/entity/RoomOrder.java b/src/main/java/kr/co/fastcampus/yanabada/domain/order/entity/Order.java similarity index 96% rename from src/main/java/kr/co/fastcampus/yanabada/domain/order/entity/RoomOrder.java rename to src/main/java/kr/co/fastcampus/yanabada/domain/order/entity/Order.java index 97600626..c86a88b7 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/order/entity/RoomOrder.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/order/entity/Order.java @@ -25,7 +25,7 @@ @NoArgsConstructor(access = AccessLevel.PROTECTED) @Table(name = "room_order") @Entity -public class RoomOrder extends BaseEntity { +public class Order extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -74,7 +74,7 @@ public class RoomOrder extends BaseEntity { @Column(nullable = false) private Integer childCount; - private RoomOrder( + private Order( Room room, Member member, LocalDate checkInDate, @@ -104,7 +104,7 @@ private RoomOrder( this.childCount = childCount; } - public static RoomOrder create( + public static Order create( Room room, Member member, LocalDate checkInDate, @@ -119,7 +119,7 @@ public static RoomOrder create( Integer adultCount, Integer childCount ) { - return new RoomOrder( + return new Order( room, member, checkInDate, diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/order/repository/OrderRepository.java b/src/main/java/kr/co/fastcampus/yanabada/domain/order/repository/OrderRepository.java index a7213cc5..6ae824eb 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/order/repository/OrderRepository.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/order/repository/OrderRepository.java @@ -1,7 +1,7 @@ package kr.co.fastcampus.yanabada.domain.order.repository; -import kr.co.fastcampus.yanabada.domain.order.entity.RoomOrder; +import kr.co.fastcampus.yanabada.domain.order.entity.Order; import org.springframework.data.jpa.repository.JpaRepository; -public interface OrderRepository extends JpaRepository { +public interface OrderRepository extends JpaRepository { } diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/order/service/OrderService.java b/src/main/java/kr/co/fastcampus/yanabada/domain/order/service/OrderService.java index 682c7fa6..7a3d4fd3 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/order/service/OrderService.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/order/service/OrderService.java @@ -5,7 +5,7 @@ import kr.co.fastcampus.yanabada.domain.member.entity.Member; import kr.co.fastcampus.yanabada.domain.member.repository.MemberRepository; import kr.co.fastcampus.yanabada.domain.order.dto.request.OrderSaveRequest; -import kr.co.fastcampus.yanabada.domain.order.entity.RoomOrder; +import kr.co.fastcampus.yanabada.domain.order.entity.Order; import kr.co.fastcampus.yanabada.domain.order.repository.OrderRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -25,6 +25,6 @@ public class OrderService { public void saveOrder(OrderSaveRequest request) { Room room = roomRepository.getRoom(request.roomId()); Member member = memberRepository.getMember(request.memberId()); - RoomOrder roomOrder = orderRepository.save(request.toEntity(room, member)); + Order order = orderRepository.save(request.toEntity(room, member)); } } diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/product/entity/Product.java b/src/main/java/kr/co/fastcampus/yanabada/domain/product/entity/Product.java index b49d6121..27dbb916 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/product/entity/Product.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/product/entity/Product.java @@ -12,7 +12,7 @@ import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; import java.time.LocalDate; -import kr.co.fastcampus.yanabada.domain.order.entity.RoomOrder; +import kr.co.fastcampus.yanabada.domain.order.entity.Order; import kr.co.fastcampus.yanabada.domain.product.entity.enums.ProductStatus; import lombok.AccessLevel; import lombok.Getter; @@ -30,7 +30,7 @@ public class Product { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "room_order_id") - private RoomOrder roomOrder; + private Order order; @Column(nullable = false) private Integer price; @@ -52,7 +52,7 @@ public class Product { private ProductStatus status; private Product( - RoomOrder roomOrder, + Order order, Integer price, String description, Boolean canNegotiate, @@ -60,7 +60,7 @@ private Product( Boolean isAutoCancel, ProductStatus status ) { - this.roomOrder = roomOrder; + this.order = order; this.price = price; this.description = description; this.canNegotiate = canNegotiate; @@ -70,7 +70,7 @@ private Product( } public static Product create( - RoomOrder roomOrder, + Order order, Integer price, String description, Boolean canNegotiate, @@ -79,7 +79,7 @@ public static Product create( ProductStatus status ) { return new Product( - roomOrder, + order, price, description, canNegotiate, From a22ddd2ee169f6d2966826faf4e6abbd0ed75d79 Mon Sep 17 00:00:00 2001 From: KyuCheol Hwang Date: Fri, 5 Jan 2024 21:49:45 +0900 Subject: [PATCH 05/11] =?UTF-8?q?feat:=20ProductService=EC=9D=98=20?= =?UTF-8?q?=EC=83=81=ED=92=88=20=EB=93=B1=EB=A1=9D=20=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ProductService의 saveProduct 메소드 구현 --- .../product/service/ProductService.java | 83 +++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 src/main/java/kr/co/fastcampus/yanabada/domain/product/service/ProductService.java diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/product/service/ProductService.java b/src/main/java/kr/co/fastcampus/yanabada/domain/product/service/ProductService.java new file mode 100644 index 00000000..d1cb425a --- /dev/null +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/product/service/ProductService.java @@ -0,0 +1,83 @@ +package kr.co.fastcampus.yanabada.domain.product.service; + +import java.time.LocalDate; +import java.util.Objects; +import kr.co.fastcampus.yanabada.common.exception.AccessForbiddenException; +import kr.co.fastcampus.yanabada.common.exception.OrderNotFoundException; +import kr.co.fastcampus.yanabada.common.exception.OrderNotSellableException; +import kr.co.fastcampus.yanabada.common.exception.SaleEndDateRangeException; +import kr.co.fastcampus.yanabada.common.exception.SellingPriceRangeException; +import kr.co.fastcampus.yanabada.domain.member.entity.Member; +import kr.co.fastcampus.yanabada.domain.member.repository.MemberRepository; +import kr.co.fastcampus.yanabada.domain.order.entity.Order; +import kr.co.fastcampus.yanabada.domain.order.entity.enums.OrderStatus; +import kr.co.fastcampus.yanabada.domain.order.repository.OrderRepository; +import kr.co.fastcampus.yanabada.domain.product.dto.request.ProductSaveRequest; +import kr.co.fastcampus.yanabada.domain.product.dto.response.ProductIdResponse; +import kr.co.fastcampus.yanabada.domain.product.repository.ProductRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +public class ProductService { + + private final ProductRepository productRepository; + + private final MemberRepository memberRepository; + + private final OrderRepository orderRepository; + + @Transactional + public ProductIdResponse saveProduct( + Long memberId, + ProductSaveRequest request + ) { + Member member = memberRepository.getMember(memberId); + Order order = orderRepository.findById(request.orderId()) + .orElseThrow(OrderNotFoundException::new); + + if (!Objects.equals(member, order.getMember())) { + throw new AccessForbiddenException(); + } + validateProductSaveRequest(request, order); + + return new ProductIdResponse( + productRepository.save(request.toEntity(order)) + ); + } + + private void validateProductSaveRequest( + ProductSaveRequest request, + Order order + ) { + validateSellableOrder(order); + validateProductPrice(request.price(), order.getPrice()); + validateProductSaleEndDate(request.saleEndDate(), order.getCheckInDate()); + } + + private void validateSellableOrder(Order order) { + if (order.getStatus() != OrderStatus.RESERVED) { + throw new OrderNotSellableException(); + } + if (LocalDate.now().isAfter(order.getCheckInDate())) { + throw new OrderNotSellableException(); + } + } + + private void validateProductPrice(int price, int purchasePrice) { + if (price > purchasePrice) { + throw new SellingPriceRangeException(); + } + } + + private void validateProductSaleEndDate( + LocalDate saleEndDate, LocalDate checkInDate + ) { + if (saleEndDate.isBefore(LocalDate.now()) + || saleEndDate.isAfter(checkInDate)) { + throw new SaleEndDateRangeException(); + } + } +} From e70d45aeb127a984c0d0c1d602114c2fc8b7ee28 Mon Sep 17 00:00:00 2001 From: KyuCheol Hwang Date: Fri, 5 Jan 2024 21:51:31 +0900 Subject: [PATCH 06/11] =?UTF-8?q?feat:=20Product=20=EB=93=B1=EB=A1=9D?= =?UTF-8?q?=EC=8B=9C=20=EB=B0=9C=EC=83=9D=ED=95=98=EB=8A=94=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Product 등록시 발생하는 예외 구현 --- .../common/exception/AccessForbiddenException.java | 9 +++++++++ .../common/exception/OrderNotFoundException.java | 9 +++++++++ .../common/exception/OrderNotSellableException.java | 9 +++++++++ .../common/exception/SaleEndDateRangeException.java | 9 +++++++++ .../common/exception/SellingPriceRangeException.java | 9 +++++++++ 5 files changed, 45 insertions(+) create mode 100644 src/main/java/kr/co/fastcampus/yanabada/common/exception/AccessForbiddenException.java create mode 100644 src/main/java/kr/co/fastcampus/yanabada/common/exception/OrderNotFoundException.java create mode 100644 src/main/java/kr/co/fastcampus/yanabada/common/exception/OrderNotSellableException.java create mode 100644 src/main/java/kr/co/fastcampus/yanabada/common/exception/SaleEndDateRangeException.java create mode 100644 src/main/java/kr/co/fastcampus/yanabada/common/exception/SellingPriceRangeException.java diff --git a/src/main/java/kr/co/fastcampus/yanabada/common/exception/AccessForbiddenException.java b/src/main/java/kr/co/fastcampus/yanabada/common/exception/AccessForbiddenException.java new file mode 100644 index 00000000..b1698d5e --- /dev/null +++ b/src/main/java/kr/co/fastcampus/yanabada/common/exception/AccessForbiddenException.java @@ -0,0 +1,9 @@ +package kr.co.fastcampus.yanabada.common.exception; + +import kr.co.fastcampus.yanabada.common.response.ErrorCode; + +public class AccessForbiddenException extends BaseException { + public AccessForbiddenException() { + super(ErrorCode.ACCESS_FORBIDDEN.getMessage()); + } +} diff --git a/src/main/java/kr/co/fastcampus/yanabada/common/exception/OrderNotFoundException.java b/src/main/java/kr/co/fastcampus/yanabada/common/exception/OrderNotFoundException.java new file mode 100644 index 00000000..6c498af4 --- /dev/null +++ b/src/main/java/kr/co/fastcampus/yanabada/common/exception/OrderNotFoundException.java @@ -0,0 +1,9 @@ +package kr.co.fastcampus.yanabada.common.exception; + +import kr.co.fastcampus.yanabada.common.response.ErrorCode; + +public class OrderNotFoundException extends BaseException { + public OrderNotFoundException() { + super(ErrorCode.ACCOMMODATION_NOT_FOUND.getMessage()); + } +} diff --git a/src/main/java/kr/co/fastcampus/yanabada/common/exception/OrderNotSellableException.java b/src/main/java/kr/co/fastcampus/yanabada/common/exception/OrderNotSellableException.java new file mode 100644 index 00000000..6d38d2af --- /dev/null +++ b/src/main/java/kr/co/fastcampus/yanabada/common/exception/OrderNotSellableException.java @@ -0,0 +1,9 @@ +package kr.co.fastcampus.yanabada.common.exception; + +import kr.co.fastcampus.yanabada.common.response.ErrorCode; + +public class OrderNotSellableException extends BaseException { + public OrderNotSellableException() { + super(ErrorCode.ORDER_NOT_SELLABLE.getMessage()); + } +} diff --git a/src/main/java/kr/co/fastcampus/yanabada/common/exception/SaleEndDateRangeException.java b/src/main/java/kr/co/fastcampus/yanabada/common/exception/SaleEndDateRangeException.java new file mode 100644 index 00000000..bbb08c1d --- /dev/null +++ b/src/main/java/kr/co/fastcampus/yanabada/common/exception/SaleEndDateRangeException.java @@ -0,0 +1,9 @@ +package kr.co.fastcampus.yanabada.common.exception; + +import kr.co.fastcampus.yanabada.common.response.ErrorCode; + +public class SaleEndDateRangeException extends BaseException { + public SaleEndDateRangeException() { + super(ErrorCode.INVALID_SALE_END_DATE_RANGE.getMessage()); + } +} diff --git a/src/main/java/kr/co/fastcampus/yanabada/common/exception/SellingPriceRangeException.java b/src/main/java/kr/co/fastcampus/yanabada/common/exception/SellingPriceRangeException.java new file mode 100644 index 00000000..c32d6a54 --- /dev/null +++ b/src/main/java/kr/co/fastcampus/yanabada/common/exception/SellingPriceRangeException.java @@ -0,0 +1,9 @@ +package kr.co.fastcampus.yanabada.common.exception; + +import kr.co.fastcampus.yanabada.common.response.ErrorCode; + +public class SellingPriceRangeException extends BaseException { + public SellingPriceRangeException() { + super(ErrorCode.INVALID_SELLING_PRICE_RANGE.getMessage()); + } +} From 619c96c6e3e836efb1a52fc6d677ee921987bd2a Mon Sep 17 00:00:00 2001 From: KyuCheol Hwang Date: Fri, 5 Jan 2024 21:52:08 +0900 Subject: [PATCH 07/11] =?UTF-8?q?feat:=20Product=20=EB=93=B1=EB=A1=9D?= =?UTF-8?q?=EC=8B=9C=20=EB=B0=9C=EC=83=9D=ED=95=98=EB=8A=94=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=EC=9D=98=20=EB=A9=94=EC=8B=9C=EC=A7=80=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Product 등록시 발생하는 예외의 메시지 구현 --- .../kr/co/fastcampus/yanabada/common/response/ErrorCode.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/kr/co/fastcampus/yanabada/common/response/ErrorCode.java b/src/main/java/kr/co/fastcampus/yanabada/common/response/ErrorCode.java index 8e6d2a46..94ba3336 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/common/response/ErrorCode.java +++ b/src/main/java/kr/co/fastcampus/yanabada/common/response/ErrorCode.java @@ -10,6 +10,11 @@ public enum ErrorCode { ACCOMMODATION_NOT_FOUND("존재하지 않는 숙소입니다."), ROOM_NOT_FOUND("존재하지 않는 객실입니다."), MEMBER_NOT_FOUND("존재하지 않는 회원입니다."), + ORDER_NOT_FOUND("존재하지 않는 예약입니다."), + ACCESS_FORBIDDEN("권한이 없습니다."), + ORDER_NOT_SELLABLE("판매할 수 없는 예약입니다."), + INVALID_SELLING_PRICE_RANGE("판매가는 구매가보다 클 수 없습니다."), + INVALID_SALE_END_DATE_RANGE("판매 중단 날짜는 현재 날짜 이상 체크인 날짜 이하여야 합니다."), ; private final String message; From d2f4388529d6032179a18fb01ad9d2619bd338e6 Mon Sep 17 00:00:00 2001 From: KyuCheol Hwang Date: Fri, 5 Jan 2024 21:53:22 +0900 Subject: [PATCH 08/11] =?UTF-8?q?feat:=20Product=20=EB=93=B1=EB=A1=9D?= =?UTF-8?q?=EC=9D=98=20=EC=9A=94=EC=B2=AD=20=EB=B0=8F=20=EC=9D=91=EB=8B=B5?= =?UTF-8?q?=20DTO=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ProductSaveRequest, ProductIdResponse 구현 --- .../product/dto/request/ProductSaveRequest.java | 16 ++++++++++++++++ .../product/dto/response/ProductIdResponse.java | 5 +++++ 2 files changed, 21 insertions(+) diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/product/dto/request/ProductSaveRequest.java b/src/main/java/kr/co/fastcampus/yanabada/domain/product/dto/request/ProductSaveRequest.java index a37ee69e..6f05007e 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/product/dto/request/ProductSaveRequest.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/product/dto/request/ProductSaveRequest.java @@ -3,6 +3,9 @@ import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import java.time.LocalDate; +import kr.co.fastcampus.yanabada.domain.order.entity.Order; +import kr.co.fastcampus.yanabada.domain.product.entity.Product; +import kr.co.fastcampus.yanabada.domain.product.entity.enums.ProductStatus; public record ProductSaveRequest( @@ -25,4 +28,17 @@ public record ProductSaveRequest( Boolean isAutoCancel ) { + public Product toEntity( + Order order + ) { + return Product.create( + order, + price, + description, + canNegotiate, + saleEndDate, + isAutoCancel, + ProductStatus.ON_SALE + ); + } } diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/product/dto/response/ProductIdResponse.java b/src/main/java/kr/co/fastcampus/yanabada/domain/product/dto/response/ProductIdResponse.java index 1e08951a..90853b38 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/product/dto/response/ProductIdResponse.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/product/dto/response/ProductIdResponse.java @@ -1,7 +1,12 @@ package kr.co.fastcampus.yanabada.domain.product.dto.response; +import kr.co.fastcampus.yanabada.domain.product.entity.Product; + public record ProductIdResponse( Long productId ) { + public ProductIdResponse(Product product) { + this(product.getId()); + } } From 78521b66b459548302db18d68aeb6e9514bb2dc8 Mon Sep 17 00:00:00 2001 From: KyuCheol Hwang Date: Fri, 5 Jan 2024 21:54:40 +0900 Subject: [PATCH 09/11] =?UTF-8?q?feat:=20ProductController=20=EC=9D=98=20?= =?UTF-8?q?=EC=83=81=ED=92=88=20=EB=93=B1=EB=A1=9D=20=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ProductController 의 addProduct 메소드 구현 --- .../product/controller/ProductController.java | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 src/main/java/kr/co/fastcampus/yanabada/domain/product/controller/ProductController.java diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/product/controller/ProductController.java b/src/main/java/kr/co/fastcampus/yanabada/domain/product/controller/ProductController.java new file mode 100644 index 00000000..0667f4cd --- /dev/null +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/product/controller/ProductController.java @@ -0,0 +1,31 @@ +package kr.co.fastcampus.yanabada.domain.product.controller; + +import jakarta.validation.Valid; +import kr.co.fastcampus.yanabada.common.response.ResponseBody; +import kr.co.fastcampus.yanabada.domain.product.dto.request.ProductSaveRequest; +import kr.co.fastcampus.yanabada.domain.product.dto.response.ProductIdResponse; +import kr.co.fastcampus.yanabada.domain.product.service.ProductService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +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.RestController; + +@Slf4j +@RestController +@RequiredArgsConstructor +@RequestMapping("/products") +public class ProductController { + + private final ProductService productService; + + @PostMapping + public ResponseBody addProduct( + @RequestBody @Valid ProductSaveRequest request + ) { + return ResponseBody.ok( + productService.saveProduct(1L, request) + ); + } +} From b2c64ed70bba638abff44c3fee42e4ef74a1672d Mon Sep 17 00:00:00 2001 From: KyuCheol Hwang Date: Fri, 5 Jan 2024 22:33:42 +0900 Subject: [PATCH 10/11] =?UTF-8?q?style:=20Exception=20=EC=9D=98=20Enum=20?= =?UTF-8?q?=EB=A9=94=EC=8B=9C=EC=A7=80=EB=A5=BC=20static=20import=20?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Exception 의 Enum 메시지를 static import 로 변화 --- .../yanabada/common/exception/AccessForbiddenException.java | 4 ++-- .../common/exception/AccommodationNotFoundException.java | 4 ++-- .../common/exception/CommonEntityNotFoundException.java | 4 ++-- .../yanabada/common/exception/MemberNotFoundException.java | 4 ++-- .../yanabada/common/exception/OrderNotFoundException.java | 4 ++-- .../yanabada/common/exception/OrderNotSellableException.java | 4 ++-- .../yanabada/common/exception/RoomNotFoundException.java | 4 ++-- .../yanabada/common/exception/SaleEndDateRangeException.java | 4 ++-- .../yanabada/common/exception/SellingPriceRangeException.java | 4 ++-- 9 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/main/java/kr/co/fastcampus/yanabada/common/exception/AccessForbiddenException.java b/src/main/java/kr/co/fastcampus/yanabada/common/exception/AccessForbiddenException.java index b1698d5e..a41cef35 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/common/exception/AccessForbiddenException.java +++ b/src/main/java/kr/co/fastcampus/yanabada/common/exception/AccessForbiddenException.java @@ -1,9 +1,9 @@ package kr.co.fastcampus.yanabada.common.exception; -import kr.co.fastcampus.yanabada.common.response.ErrorCode; +import static kr.co.fastcampus.yanabada.common.response.ErrorCode.ACCESS_FORBIDDEN; public class AccessForbiddenException extends BaseException { public AccessForbiddenException() { - super(ErrorCode.ACCESS_FORBIDDEN.getMessage()); + super(ACCESS_FORBIDDEN.getMessage()); } } diff --git a/src/main/java/kr/co/fastcampus/yanabada/common/exception/AccommodationNotFoundException.java b/src/main/java/kr/co/fastcampus/yanabada/common/exception/AccommodationNotFoundException.java index 591b86ae..662f1a95 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/common/exception/AccommodationNotFoundException.java +++ b/src/main/java/kr/co/fastcampus/yanabada/common/exception/AccommodationNotFoundException.java @@ -1,9 +1,9 @@ package kr.co.fastcampus.yanabada.common.exception; -import kr.co.fastcampus.yanabada.common.response.ErrorCode; +import static kr.co.fastcampus.yanabada.common.response.ErrorCode.ACCOMMODATION_NOT_FOUND; public class AccommodationNotFoundException extends BaseException { public AccommodationNotFoundException() { - super(ErrorCode.ACCOMMODATION_NOT_FOUND.getMessage()); + super(ACCOMMODATION_NOT_FOUND.getMessage()); } } diff --git a/src/main/java/kr/co/fastcampus/yanabada/common/exception/CommonEntityNotFoundException.java b/src/main/java/kr/co/fastcampus/yanabada/common/exception/CommonEntityNotFoundException.java index eb5690a7..58a7ee2e 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/common/exception/CommonEntityNotFoundException.java +++ b/src/main/java/kr/co/fastcampus/yanabada/common/exception/CommonEntityNotFoundException.java @@ -1,9 +1,9 @@ package kr.co.fastcampus.yanabada.common.exception; -import kr.co.fastcampus.yanabada.common.response.ErrorCode; +import static kr.co.fastcampus.yanabada.common.response.ErrorCode.COMMON_ENTITY_NOT_FOUND; public class CommonEntityNotFoundException extends BaseException { public CommonEntityNotFoundException() { - super(ErrorCode.COMMON_ENTITY_NOT_FOUND.getMessage()); + super(COMMON_ENTITY_NOT_FOUND.getMessage()); } } diff --git a/src/main/java/kr/co/fastcampus/yanabada/common/exception/MemberNotFoundException.java b/src/main/java/kr/co/fastcampus/yanabada/common/exception/MemberNotFoundException.java index 6c9c8139..e90e5c84 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/common/exception/MemberNotFoundException.java +++ b/src/main/java/kr/co/fastcampus/yanabada/common/exception/MemberNotFoundException.java @@ -1,10 +1,10 @@ package kr.co.fastcampus.yanabada.common.exception; -import kr.co.fastcampus.yanabada.common.response.ErrorCode; +import static kr.co.fastcampus.yanabada.common.response.ErrorCode.MEMBER_NOT_FOUND; public class MemberNotFoundException extends BaseException { public MemberNotFoundException() { - super(ErrorCode.MEMBER_NOT_FOUND.getMessage()); + super(MEMBER_NOT_FOUND.getMessage()); } } diff --git a/src/main/java/kr/co/fastcampus/yanabada/common/exception/OrderNotFoundException.java b/src/main/java/kr/co/fastcampus/yanabada/common/exception/OrderNotFoundException.java index 6c498af4..7dc257f4 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/common/exception/OrderNotFoundException.java +++ b/src/main/java/kr/co/fastcampus/yanabada/common/exception/OrderNotFoundException.java @@ -1,9 +1,9 @@ package kr.co.fastcampus.yanabada.common.exception; -import kr.co.fastcampus.yanabada.common.response.ErrorCode; +import static kr.co.fastcampus.yanabada.common.response.ErrorCode.ACCOMMODATION_NOT_FOUND; public class OrderNotFoundException extends BaseException { public OrderNotFoundException() { - super(ErrorCode.ACCOMMODATION_NOT_FOUND.getMessage()); + super(ACCOMMODATION_NOT_FOUND.getMessage()); } } diff --git a/src/main/java/kr/co/fastcampus/yanabada/common/exception/OrderNotSellableException.java b/src/main/java/kr/co/fastcampus/yanabada/common/exception/OrderNotSellableException.java index 6d38d2af..5efb0f80 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/common/exception/OrderNotSellableException.java +++ b/src/main/java/kr/co/fastcampus/yanabada/common/exception/OrderNotSellableException.java @@ -1,9 +1,9 @@ package kr.co.fastcampus.yanabada.common.exception; -import kr.co.fastcampus.yanabada.common.response.ErrorCode; +import static kr.co.fastcampus.yanabada.common.response.ErrorCode.ORDER_NOT_SELLABLE; public class OrderNotSellableException extends BaseException { public OrderNotSellableException() { - super(ErrorCode.ORDER_NOT_SELLABLE.getMessage()); + super(ORDER_NOT_SELLABLE.getMessage()); } } diff --git a/src/main/java/kr/co/fastcampus/yanabada/common/exception/RoomNotFoundException.java b/src/main/java/kr/co/fastcampus/yanabada/common/exception/RoomNotFoundException.java index fb2d1300..513025f8 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/common/exception/RoomNotFoundException.java +++ b/src/main/java/kr/co/fastcampus/yanabada/common/exception/RoomNotFoundException.java @@ -1,9 +1,9 @@ package kr.co.fastcampus.yanabada.common.exception; -import kr.co.fastcampus.yanabada.common.response.ErrorCode; +import static kr.co.fastcampus.yanabada.common.response.ErrorCode.ROOM_NOT_FOUND; public class RoomNotFoundException extends BaseException { public RoomNotFoundException() { - super(ErrorCode.ROOM_NOT_FOUND.getMessage()); + super(ROOM_NOT_FOUND.getMessage()); } } diff --git a/src/main/java/kr/co/fastcampus/yanabada/common/exception/SaleEndDateRangeException.java b/src/main/java/kr/co/fastcampus/yanabada/common/exception/SaleEndDateRangeException.java index bbb08c1d..f26db7f8 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/common/exception/SaleEndDateRangeException.java +++ b/src/main/java/kr/co/fastcampus/yanabada/common/exception/SaleEndDateRangeException.java @@ -1,9 +1,9 @@ package kr.co.fastcampus.yanabada.common.exception; -import kr.co.fastcampus.yanabada.common.response.ErrorCode; +import static kr.co.fastcampus.yanabada.common.response.ErrorCode.INVALID_SALE_END_DATE_RANGE; public class SaleEndDateRangeException extends BaseException { public SaleEndDateRangeException() { - super(ErrorCode.INVALID_SALE_END_DATE_RANGE.getMessage()); + super(INVALID_SALE_END_DATE_RANGE.getMessage()); } } diff --git a/src/main/java/kr/co/fastcampus/yanabada/common/exception/SellingPriceRangeException.java b/src/main/java/kr/co/fastcampus/yanabada/common/exception/SellingPriceRangeException.java index c32d6a54..3cdab224 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/common/exception/SellingPriceRangeException.java +++ b/src/main/java/kr/co/fastcampus/yanabada/common/exception/SellingPriceRangeException.java @@ -1,9 +1,9 @@ package kr.co.fastcampus.yanabada.common.exception; -import kr.co.fastcampus.yanabada.common.response.ErrorCode; +import static kr.co.fastcampus.yanabada.common.response.ErrorCode.INVALID_SELLING_PRICE_RANGE; public class SellingPriceRangeException extends BaseException { public SellingPriceRangeException() { - super(ErrorCode.INVALID_SELLING_PRICE_RANGE.getMessage()); + super(INVALID_SELLING_PRICE_RANGE.getMessage()); } } From a988596a8012855094242408c69463a0be25480f Mon Sep 17 00:00:00 2001 From: KyuCheol Hwang Date: Mon, 8 Jan 2024 10:46:40 +0900 Subject: [PATCH 11/11] =?UTF-8?q?refactor:=20=EC=9D=91=EB=8B=B5=20DTO=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EB=B0=A9=EC=8B=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 응답 DTO 생성 방식에 빌더 패턴과 팩토리 메소드 패턴 적용 --- .../domain/product/dto/response/ProductIdResponse.java | 8 ++++++-- .../yanabada/domain/product/service/ProductService.java | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/product/dto/response/ProductIdResponse.java b/src/main/java/kr/co/fastcampus/yanabada/domain/product/dto/response/ProductIdResponse.java index 90853b38..75604137 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/product/dto/response/ProductIdResponse.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/product/dto/response/ProductIdResponse.java @@ -1,12 +1,16 @@ package kr.co.fastcampus.yanabada.domain.product.dto.response; import kr.co.fastcampus.yanabada.domain.product.entity.Product; +import lombok.Builder; +@Builder public record ProductIdResponse( Long productId ) { - public ProductIdResponse(Product product) { - this(product.getId()); + public static ProductIdResponse from(Product product) { + return ProductIdResponse.builder() + .productId(product.getId()) + .build(); } } diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/product/service/ProductService.java b/src/main/java/kr/co/fastcampus/yanabada/domain/product/service/ProductService.java index d1cb425a..b8f31e65 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/product/service/ProductService.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/product/service/ProductService.java @@ -43,7 +43,7 @@ public ProductIdResponse saveProduct( } validateProductSaveRequest(request, order); - return new ProductIdResponse( + return ProductIdResponse.from( productRepository.save(request.toEntity(order)) ); }