Skip to content

Commit 99aa849

Browse files
committed
feat: 주문 도메인 API 작성
1 parent f8306d7 commit 99aa849

8 files changed

Lines changed: 220 additions & 0 deletions

File tree

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.loopers.infrastructure.order;
2+
3+
import com.loopers.domain.order.Order;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
6+
public interface OrderJpaRepository extends JpaRepository<Order, Long> {
7+
8+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.loopers.infrastructure.order;
2+
3+
import com.loopers.domain.order.Order;
4+
import com.loopers.domain.order.OrderRepository;
5+
import lombok.RequiredArgsConstructor;
6+
import org.springframework.stereotype.Component;
7+
8+
@Component
9+
@RequiredArgsConstructor
10+
public class OrderRepositoryImpl implements OrderRepository {
11+
private final OrderJpaRepository orderJpaRepository;
12+
13+
@Override
14+
public Order save(Order order) {
15+
return orderJpaRepository.save(order);
16+
}
17+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.loopers.infrastructure.orderitem;
2+
3+
import com.loopers.domain.orderitem.OrderItem;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
6+
public interface OrderItemJpaRepository extends JpaRepository<OrderItem, Long> {
7+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.loopers.infrastructure.orderitem;
2+
3+
import com.loopers.domain.orderitem.OrderItem;
4+
import com.loopers.domain.orderitem.OrderItemRepository;
5+
import lombok.RequiredArgsConstructor;
6+
import org.springframework.stereotype.Component;
7+
8+
import java.util.List;
9+
10+
@Component
11+
@RequiredArgsConstructor
12+
public class OrderItemRepositoryImpl implements OrderItemRepository {
13+
private final OrderItemJpaRepository orderItemJpaRepository;
14+
15+
@Override
16+
public List<OrderItem> saveAll(List<OrderItem> orderItems) {
17+
return orderItemJpaRepository.saveAll(orderItems);
18+
}
19+
20+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.loopers.interfaces.api.order;
2+
3+
4+
import com.loopers.interfaces.api.ApiResponse;
5+
import io.swagger.v3.oas.annotations.Operation;
6+
import io.swagger.v3.oas.annotations.parameters.RequestBody;
7+
import io.swagger.v3.oas.annotations.tags.Tag;
8+
9+
@Tag(name = "Order V1 API", description = "Order V1 API Spec")
10+
public interface OrderV1ApiSpec {
11+
12+
@Operation(summary = "주문 생성")
13+
ApiResponse<OrderV1Dto.OrderResponse> createOrder(@RequestBody OrderV1Dto.OrderRequest request);
14+
15+
@Operation(summary = "주문 조회")
16+
ApiResponse<OrderV1Dto.OrderResponse> findOrderById(Long id);
17+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.loopers.interfaces.api.order;
2+
3+
import com.loopers.application.order.OrderFacade;
4+
import com.loopers.application.order.OrderInfo;
5+
import com.loopers.application.order.OrderResultInfo;
6+
import com.loopers.interfaces.api.ApiResponse;
7+
import lombok.RequiredArgsConstructor;
8+
import org.springframework.web.bind.annotation.GetMapping;
9+
import org.springframework.web.bind.annotation.PathVariable;
10+
import org.springframework.web.bind.annotation.PostMapping;
11+
import org.springframework.web.bind.annotation.RequestBody;
12+
import org.springframework.web.bind.annotation.RequestMapping;
13+
import org.springframework.web.bind.annotation.RestController;
14+
15+
@RestController
16+
@RequestMapping("/api/v1/orders")
17+
@RequiredArgsConstructor
18+
public class OrderV1Controller implements OrderV1ApiSpec {
19+
private final OrderFacade orderFacade;
20+
21+
@PostMapping
22+
@Override
23+
public ApiResponse<OrderV1Dto.OrderResponse> createOrder(@RequestBody OrderV1Dto.OrderRequest request) {
24+
OrderResultInfo info = orderFacade.createOrder(request);
25+
26+
OrderV1Dto.OrderResponse response = OrderV1Dto.OrderResponse.from(info);
27+
28+
return ApiResponse.success(response);
29+
}
30+
31+
@GetMapping("/{id}")
32+
@Override
33+
public ApiResponse<OrderV1Dto.OrderResponse> findOrderById(@PathVariable Long id) {
34+
return null;
35+
}
36+
}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package com.loopers.interfaces.api.order;
2+
3+
import com.loopers.application.order.OrderInfo;
4+
import com.loopers.application.order.OrderResultInfo;
5+
import com.loopers.application.orderitem.OrderItemInfo;
6+
import com.loopers.domain.order.Order;
7+
import com.loopers.domain.order.OrderStatus;
8+
import com.loopers.domain.orderitem.OrderItem;
9+
10+
import java.math.BigDecimal;
11+
import java.time.ZonedDateTime;
12+
import java.util.List;
13+
14+
public class OrderV1Dto {
15+
public record OrderResponse(
16+
Long id,
17+
Long userId,
18+
OrderStatus status,
19+
BigDecimal totalPrice,
20+
List<OrderItemResponse> orderItems,
21+
ZonedDateTime createdAt
22+
)
23+
{
24+
public static OrderResponse from(OrderResultInfo resultInfo) {
25+
OrderInfo orderInfo = resultInfo.orderInfo();
26+
List<OrderItemInfo> orderItemInfos = resultInfo.orderItemInfos();
27+
28+
return new OrderResponse(
29+
orderInfo.id(),
30+
orderInfo.userId(),
31+
orderInfo.orderStatus(),
32+
orderInfo.totalPrice(),
33+
orderItemInfos.stream()
34+
.map(itemInfo -> new OrderItemResponse(
35+
itemInfo.id(),
36+
itemInfo.productId(),
37+
itemInfo.quantity(),
38+
itemInfo.orderPrice()
39+
))
40+
.toList(),
41+
orderInfo.createdAt()
42+
);
43+
}
44+
}
45+
46+
public record OrderItemResponse(
47+
Long id,
48+
Long productId,
49+
int quantity,
50+
BigDecimal orderPrice
51+
) {}
52+
53+
54+
55+
public record OrderRequest(
56+
Long userId,
57+
List<OrderItemRequest> orderItems
58+
) {
59+
public Order toEntity(BigDecimal totalPrice) {
60+
return new Order(
61+
userId,
62+
totalPrice,
63+
OrderStatus.READY
64+
);
65+
}
66+
}
67+
68+
public record OrderItemRequest(Long productId, int quantity) {
69+
public OrderItem toEntity(Long orderId, BigDecimal orderPrice) {
70+
return new OrderItem(
71+
orderId,
72+
productId,
73+
quantity,
74+
orderPrice
75+
);
76+
}
77+
}
78+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.loopers.interfaces.api.orderitem;
2+
3+
import com.loopers.application.orderitem.OrderItemInfo;
4+
import com.loopers.domain.orderitem.OrderItem;
5+
6+
import java.math.BigDecimal;
7+
8+
public class OrderItemV1Dto {
9+
public record OrderItemResponse(
10+
Long id,
11+
Long orderId,
12+
Long productId,
13+
int quantity,
14+
BigDecimal orderPrice
15+
) {
16+
public static OrderItemResponse from(OrderItemInfo info) {
17+
return new OrderItemResponse(
18+
info.id(),
19+
info.orderId(),
20+
info.productId(),
21+
info.quantity(),
22+
info.orderPrice()
23+
);
24+
}
25+
}
26+
27+
public record OrderItemRequest(Long orderId, Long productId, int quantity, BigDecimal productPrice) {
28+
public OrderItem toEntity() {
29+
return new OrderItem(
30+
orderId,
31+
productId,
32+
quantity,
33+
productPrice.multiply(BigDecimal.valueOf(quantity))
34+
);
35+
}
36+
}
37+
}

0 commit comments

Comments
 (0)