-
Notifications
You must be signed in to change notification settings - Fork 248
/
Copy pathSession.java
118 lines (95 loc) · 4.15 KB
/
Session.java
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
109
110
111
112
113
114
115
116
117
118
package nextstep.courses.domain;
import nextstep.courses.enums.SessionStatus;
import nextstep.courses.exception.BusinessInvalidValueException;
import nextstep.courses.utils.BaseEntity;
import nextstep.users.domain.NsUser;
import java.time.LocalDateTime;
import java.util.List;
public class Session extends BaseEntity {
public static long FREE_PRICE = 0L;
public static int MAX_CAPACITY = Integer.MAX_VALUE;
private final Long id;
private Course course;
private SessionCover sessionCover;
private Period period;
private Capacity capacity;
private Price price;
private SessionStatus status = SessionStatus.PREPARE;
private List<NsUser> participants;
public Session(Long id) {
this.id = id;
}
private Session(Long id, LocalDateTime beginDt, LocalDateTime endDt, SessionCover sessionCover, Course course, Capacity capacity, Price price, List<NsUser> participants) {
this.id = id;
this.period = new Period(beginDt, endDt);
this.sessionCover = sessionCover;
this.course = course;
this.capacity = capacity;
this.price = price;
this.participants = participants;
}
public Session(Long id, LocalDateTime beginDt, LocalDateTime endDt, SessionStatus status, Capacity capacity, Price price, Course course, SessionCover sessionCover, LocalDateTime createdAt, LocalDateTime updatedAt) {
this.id = id;
this.period = new Period(beginDt, endDt);
this.status = status;
this.sessionCover = sessionCover;
this.course = course;
this.capacity = capacity;
this.price = price;
this.createdAt = createdAt;
this.updatedAt = updatedAt;
}
public static Session fromSessionForFree(Session session, SessionCover sessionCover, Course course, List<NsUser> participants) {
return Session.ofFree(session.id, session.period.getBeginDt(), session.period.getEndDt(), sessionCover, course, participants);
}
public static Session fromSessionForPaid(Session session, SessionCover sessionCover, Course course, List<NsUser> participants) {
return Session.ofPaid(session.id, session.period.getBeginDt(), session.period.getEndDt(), sessionCover, course, session.price.price(), session.capacity.capacity(), participants);
}
public static Session ofFree(Long id, LocalDateTime beginDt, LocalDateTime endDt, SessionCover sessionCover, Course course, List<NsUser> participants) {
return new Session(id, beginDt, endDt, sessionCover, course, new Capacity(MAX_CAPACITY), new Price(FREE_PRICE), participants);
}
public static Session ofPaid(Long id, LocalDateTime beginDt, LocalDateTime endDt, SessionCover sessionCover, Course course, Long price, Integer capacity, List<NsUser> participants) {
return new Session(id, beginDt, endDt, sessionCover, course, new Capacity(capacity), new Price(price), participants);
}
public static Session fromSession(Session session, SessionCover sessionCover, Course course, List<NsUser> participants) {
if (session.price.equals(0L)) {
return fromSessionForFree(session, sessionCover, course, participants);
}
return fromSessionForPaid(session, sessionCover, course, participants);
}
public void startEnrollment() {
this.status = SessionStatus.ENROLL;
}
public void enroll(NsUser participant, Long amount) {
capacity.validateCapacity(participants.size());
price.validatePrice(amount);
validateStatus();
this.participants.add(participant);
}
private void validateStatus() {
if (SessionStatus.ENROLL != this.status) {
throw new BusinessInvalidValueException("수강신청 가능한 상태가 아닙니다.");
}
}
public Price price() {
return price;
}
public Capacity capacity() {
return capacity;
}
public Long id() {
return id;
}
public Period period() {
return period;
}
public Course course() {
return course;
}
public SessionCover sessionCover() {
return sessionCover;
}
public String status() {
return this.status.name();
}
}