-
Notifications
You must be signed in to change notification settings - Fork 11
Expand file tree
/
Copy pathItemOrder.java
More file actions
108 lines (87 loc) · 3.06 KB
/
ItemOrder.java
File metadata and controls
108 lines (87 loc) · 3.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package com.ceos23.spring_boot.domain;
import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany;
import jakarta.persistence.PrePersist;
import jakarta.persistence.Index;
import jakarta.persistence.Table;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Table(
indexes = {
@Index(
name = "idx_item_order_user_ordered_at",
columnList = "user_id, ordered_at"
)
}
)
public class ItemOrder {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "user_id", nullable = false)
private User user;
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "theater_id", nullable = false)
private Theater theater;
@Column(nullable = false)
private Integer totalPrice;
@Column(nullable = false)
private LocalDateTime orderedAt;
@Enumerated(EnumType.STRING)
@Column(nullable = false)
private OrderStatus orderStatus;
private String paymentId;
private LocalDateTime paidAt;
private LocalDateTime cancelledAt;
@OneToMany(mappedBy = "itemOrder", cascade = CascadeType.ALL, orphanRemoval = true)
private List<OrderDetail> orderDetails = new ArrayList<>();
private ItemOrder(User user, Theater theater, Integer totalPrice) {
this.user = user;
this.theater = theater;
this.totalPrice = totalPrice;
this.orderStatus = OrderStatus.PENDING_PAYMENT;
}
public static ItemOrder of(User user, Theater theater, Integer totalPrice) {
return new ItemOrder(user, theater, totalPrice);
}
@PrePersist
protected void onCreate() {
this.orderedAt = LocalDateTime.now();
}
// 주문 상세 생성 책임을 주문 도메인으로 이동
public void addOrderDetail(Item item, Integer count) {
OrderDetail orderDetail = OrderDetail.of(this, item, count);
this.orderDetails.add(orderDetail);
}
public void markPaid(String paymentId, LocalDateTime paidAt) {
this.paymentId = paymentId;
this.paidAt = paidAt;
this.orderStatus = OrderStatus.PAID;
}
public void markPaymentFailed(String paymentId) {
this.paymentId = paymentId;
this.orderStatus = OrderStatus.PAYMENT_FAILED;
}
public void cancel(LocalDateTime cancelledAt) {
this.cancelledAt = cancelledAt;
this.orderStatus = OrderStatus.CANCELLED;
}
}