Skip to content

Commit f0bb5e5

Browse files
committed
[2505/01] 주문기능 최초 커밋
1 parent 2c4d65a commit f0bb5e5

File tree

16 files changed

+711
-2
lines changed

16 files changed

+711
-2
lines changed

build.gradle

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ plugins {
22
id 'java'
33
id 'org.springframework.boot' version '3.4.4'
44
id 'io.spring.dependency-management' version '1.1.7'
5+
id 'com.google.protobuf' version '0.9.4'
56
}
67

78
group = 'com'
@@ -26,7 +27,10 @@ dependencies {
2627
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
2728
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
2829
implementation 'org.springframework.boot:spring-boot-starter-web'
30+
implementation 'org.springframework.kafka:spring-kafka'
31+
implementation 'com.google.protobuf:protobuf-java:3.25.2'
2932
implementation 'io.jsonwebtoken:jjwt-api:0.12.6'
33+
implementation 'com.google.code.gson:gson'
3034
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.12.6'
3135
runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.12.6' // JSON 처리를 위한 의존성
3236
compileOnly 'org.projectlombok:lombok'
@@ -35,10 +39,17 @@ dependencies {
3539
runtimeOnly 'com.mysql:mysql-connector-j'
3640
annotationProcessor 'org.projectlombok:lombok'
3741
testImplementation 'org.springframework.boot:spring-boot-starter-test'
42+
testImplementation 'org.awaitility:awaitility4.2.0'
3843
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
39-
implementation 'com.google.code.gson:gson'
4044
}
4145

4246
tasks.named('test') {
4347
useJUnitPlatform()
4448
}
49+
50+
51+
protobuf {
52+
protoc {
53+
artifact = 'com.google.protobuf:protoc:3.25.2'
54+
}
55+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.ecommerce.order.dto.orderRequest;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Getter;
5+
import lombok.NoArgsConstructor;
6+
7+
import java.util.List;
8+
9+
@Getter
10+
@NoArgsConstructor
11+
@AllArgsConstructor
12+
public class OrderCreateRequest {
13+
14+
private List<OrderItemRequest> items;
15+
16+
private String address;
17+
18+
private String contact;
19+
20+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.ecommerce.order.dto.orderRequest;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Getter;
6+
import lombok.NoArgsConstructor;
7+
8+
import java.math.BigDecimal;
9+
import java.util.UUID;
10+
11+
@Getter
12+
@NoArgsConstructor
13+
@AllArgsConstructor
14+
@Builder
15+
public class OrderItemRequest {
16+
17+
private UUID productUUID;
18+
19+
private Integer quantity;
20+
21+
private BigDecimal price;
22+
23+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.ecommerce.order.dto.orderResponse;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Getter;
6+
import lombok.NoArgsConstructor;
7+
8+
import java.math.BigDecimal;
9+
import java.util.UUID;
10+
11+
@Getter
12+
@NoArgsConstructor
13+
@AllArgsConstructor
14+
@Builder
15+
public class OrderItemResponse {
16+
17+
private UUID productUUID;
18+
19+
private Integer quantity;
20+
21+
private BigDecimal price;
22+
23+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.ecommerce.order.dto.orderResponse;
2+
3+
import com.ecommerce.order.orderStatus.OrderStatus;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Builder;
6+
import lombok.Getter;
7+
import lombok.NoArgsConstructor;
8+
9+
import java.math.BigDecimal;
10+
import java.util.List;
11+
import java.util.UUID;
12+
13+
@Getter
14+
@NoArgsConstructor
15+
@AllArgsConstructor
16+
@Builder
17+
public class OrderResponse {
18+
19+
private UUID orderUUID;
20+
21+
private OrderStatus status;
22+
23+
private BigDecimal totalPrice;
24+
25+
private String address;
26+
27+
private String contact;
28+
29+
private List<OrderItemResponse> items;
30+
31+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package com.ecommerce.order.orderController;
2+
3+
import com.ecommerce.order.dto.orderRequest.OrderCreateRequest;
4+
import com.ecommerce.order.dto.orderResponse.OrderResponse;
5+
import com.ecommerce.order.orderService.OrderService;
6+
import com.ecommerce.util.JwtService;
7+
import lombok.RequiredArgsConstructor;
8+
import org.springframework.http.ResponseEntity;
9+
import org.springframework.validation.annotation.Validated;
10+
import org.springframework.web.bind.annotation.*;
11+
12+
import java.util.List;
13+
import java.util.UUID;
14+
15+
@RestController
16+
@RequiredArgsConstructor
17+
@RequestMapping("/orders")
18+
public class orderController {
19+
20+
private final JwtService jwtService;
21+
private final OrderService orderService;
22+
23+
@PostMapping
24+
public ResponseEntity<OrderResponse> create(@RequestHeader("Authorization") String auth
25+
, @RequestBody @Validated OrderCreateRequest request) {
26+
String token = auth.replace("Bearer ", "");
27+
UUID userId = UUID.fromString(jwtService.extractUserId(token));
28+
return ResponseEntity.ok(orderService.createOrder(userId, request));
29+
}
30+
31+
@GetMapping("/{orderUUID}")
32+
public ResponseEntity<OrderResponse> detail(@PathVariable UUID orderUUID) {
33+
return ResponseEntity.ok(orderService.getOrderDetail(orderUUID));
34+
}
35+
36+
@GetMapping
37+
public ResponseEntity<List<OrderResponse>> userOrders(@RequestHeader("Authorization") String auth) {
38+
String token = auth.replace("Bearer ", "");
39+
UUID userId = UUID.fromString(jwtService.extractUserId(token));
40+
return ResponseEntity.ok(orderService.getOrderListByUser(userId));
41+
}
42+
43+
@PatchMapping("/{orderUUID}/cancel")
44+
public ResponseEntity<OrderResponse> cancel(@PathVariable UUID orderUUID) {
45+
return ResponseEntity.ok(orderService.cancelOrder(orderUUID));
46+
}
47+
48+
}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package com.ecommerce.order.orderEntity;
2+
3+
import com.ecommerce.order.dto.orderRequest.OrderCreateRequest;
4+
import com.ecommerce.order.dto.orderRequest.OrderItemRequest;
5+
import com.ecommerce.order.orderStatus.OrderStatus;
6+
import jakarta.persistence.*;
7+
import lombok.AllArgsConstructor;
8+
import lombok.Builder;
9+
import lombok.Getter;
10+
import lombok.NoArgsConstructor;
11+
12+
import java.math.BigDecimal;
13+
import java.time.LocalDateTime;
14+
import java.util.ArrayList;
15+
import java.util.List;
16+
import java.util.UUID;
17+
18+
@Entity
19+
@Table(name = "orders")
20+
@Getter
21+
@NoArgsConstructor
22+
@AllArgsConstructor
23+
@Builder
24+
public class Order {
25+
26+
@Id
27+
@GeneratedValue(strategy = GenerationType.IDENTITY)
28+
private Long id;
29+
30+
@Column(name = "order_uuid", columnDefinition = "BINARY(16)", unique = true, nullable = false)
31+
private UUID orderUUID;
32+
33+
@Column(name = "user_uuid", columnDefinition = "BINARY(16)", nullable = false)
34+
private UUID userId;
35+
36+
@Builder.Default
37+
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL, orphanRemoval = true)
38+
private List<OrderItem> orderItems = new ArrayList<>();
39+
40+
@Enumerated(EnumType.STRING)
41+
@Column(name = "status")
42+
private OrderStatus status;
43+
44+
private String address;
45+
46+
private String contact;
47+
48+
@Column(name = "total_price")
49+
private BigDecimal totalPrice;
50+
51+
@Column(name = "crea_dt")
52+
private LocalDateTime createdAt;
53+
54+
@Column(name = "updt_dt")
55+
private LocalDateTime updatedAt;
56+
57+
public static Order of(UUID userId, OrderCreateRequest dto, BigDecimal totalPrice, List<OrderItemRequest> itemRequests) {
58+
Order order = Order.builder()
59+
.userId(userId).address(dto.getAddress()).contact(dto.getContact()).status(OrderStatus.ORDERED).totalPrice(totalPrice)
60+
.build();
61+
62+
List<OrderItem> orderItems = itemRequests.stream()
63+
.map(item -> OrderItem.builder()
64+
.order(order).productUUID(item.getProductUUID()).quantity(item.getQuantity()).price(item.getPrice())
65+
.build())
66+
.toList();
67+
68+
order.orderItems = orderItems;
69+
return order;
70+
}
71+
72+
@PrePersist
73+
protected void onCreate() {
74+
this.createdAt = LocalDateTime.now();
75+
this.orderUUID = UUID.randomUUID();
76+
}
77+
78+
public void cancel() {
79+
this.status = OrderStatus.CANCELLED;
80+
}
81+
82+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.ecommerce.order.orderEntity;
2+
3+
import jakarta.persistence.*;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Builder;
6+
import lombok.Getter;
7+
import lombok.NoArgsConstructor;
8+
9+
import java.math.BigDecimal;
10+
import java.util.UUID;
11+
12+
@Entity
13+
@Table(name="order_items")
14+
@Getter
15+
@NoArgsConstructor
16+
@AllArgsConstructor
17+
@Builder
18+
public class OrderItem {
19+
20+
@Id
21+
@GeneratedValue(strategy = GenerationType.IDENTITY)
22+
private Long id;
23+
24+
@ManyToOne(fetch = FetchType.LAZY)
25+
@JoinColumn(name = "order_id")
26+
private Order order;
27+
28+
@Column(name = "product_uuid", columnDefinition = "BINARY(16)", nullable = false)
29+
private UUID productUUID;
30+
31+
private Integer quantity;
32+
33+
private BigDecimal price;
34+
35+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.ecommerce.order.orderRepository;
2+
3+
import com.ecommerce.order.orderEntity.Order;
4+
import com.ecommerce.order.orderEntity.OrderItem;
5+
import org.springframework.data.jpa.repository.JpaRepository;
6+
7+
public interface OrderItemRepository extends JpaRepository<OrderItem, Long> {
8+
9+
void deleteAllByOrder(Order order);
10+
11+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.ecommerce.order.orderRepository;
2+
3+
import com.ecommerce.order.orderEntity.Order;
4+
import org.springframework.data.jpa.repository.EntityGraph;
5+
import org.springframework.data.jpa.repository.JpaRepository;
6+
7+
import java.util.List;
8+
import java.util.Optional;
9+
import java.util.UUID;
10+
11+
public interface OrderRepository extends JpaRepository<Order, Long> {
12+
@EntityGraph(attributePaths = "orderItems")
13+
Optional<Order> findByOrderUUID(UUID uuid);
14+
15+
@EntityGraph(attributePaths = "orderItems")
16+
List<Order> findAllByUserId(UUID userId);
17+
18+
void deleteById(Long id);
19+
20+
}

0 commit comments

Comments
 (0)