Skip to content

Commit c0e9f4e

Browse files
authored
๐Ÿš€ 3๋‹จ๊ณ„ - ์ˆ˜๊ฐ•์‹ ์ฒญ(DB ์ ์šฉ) (#802)
* ๐Ÿš€ 3๋‹จ๊ณ„ - ์ˆ˜๊ฐ•์‹ ์ฒญ(DB ์ ์šฉ) * ๋„๋ฉ”์ธ๊ณผ ์—”ํ‹ฐํ‹ฐ ์‚ฌ์šฉ ๋ถ„๋ฆฌ ๋ฐ JDBC์‚ฌ์šฉ ์ˆจ๊น€ * register ๋กœ์ง ์ •๋ฆฌ ์ง„ํ–‰
1 parent ccd918f commit c0e9f4e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+1520
-343
lines changed
Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,41 @@
11
package nextstep.courses.domain.image;
22

33
public class SessionCoverImage {
4+
private final Long id;
5+
private final Long sessionId;
46
private final SessionImageDimension dimension;
57
private final SessionImageExtension extension;
68
private final SessionImageCapacity capacity;
79

8-
public SessionCoverImage(int width, int height, String extension, long bytes) {
9-
this(new SessionImageDimension(width, height), SessionImageExtension.from(extension), new SessionImageCapacity(bytes));
10+
public SessionCoverImage(Long sessionId, int width, int height, String extension, long bytes) {
11+
this(null, sessionId, new SessionImageDimension(width, height), SessionImageExtension.from(extension), new SessionImageCapacity(bytes));
1012
}
1113

12-
public SessionCoverImage(SessionImageDimension dimension, SessionImageExtension extension, SessionImageCapacity capacity) {
14+
public SessionCoverImage(Long id, Long sessionId, SessionImageDimension dimension, SessionImageExtension extension, SessionImageCapacity capacity) {
15+
this.id = id;
16+
this.sessionId = sessionId;
1317
this.dimension = dimension;
1418
this.extension = extension;
1519
this.capacity = capacity;
1620
}
21+
22+
public Long getId() {
23+
return id;
24+
}
25+
26+
public Long getSessionId() {
27+
return sessionId;
28+
}
29+
30+
public SessionImageDimension getDimension() {
31+
return dimension;
32+
}
33+
34+
public SessionImageExtension getExtension() {
35+
return extension;
36+
}
37+
38+
public SessionImageCapacity getCapacity() {
39+
return capacity;
40+
}
1741
}

โ€Žsrc/main/java/nextstep/courses/domain/image/SessionImageCapacity.javaโ€Ž

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,7 @@ private void validate(long bytes) {
2626
}
2727
}
2828

29+
public long bytes() {
30+
return bytes;
31+
}
2932
}

โ€Žsrc/main/java/nextstep/courses/domain/image/SessionImageDimension.javaโ€Ž

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ public SessionImageDimension(int width, int height) {
1515
this.width = width;
1616
this.height = height;
1717
}
18+
1819
private void validateMinLength(int width, int height){
1920
if(!(width >= MIN_WIDTH && height >= MIN_HEIGHT)) {
2021
throw new IllegalArgumentException("์ด๋ฏธ์ง€๋Š” ๊ฐ€๋กœ 300์ด์ƒ, ์„ธ๋กœ 200 ์ด์ƒ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.");
@@ -34,5 +35,11 @@ private int gcd(int a, int b) {
3435
return b == 0 ? a : gcd(b, a % b);
3536
}
3637

38+
public int width() {
39+
return width;
40+
}
3741

42+
public int height() {
43+
return height;
44+
}
3845
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package nextstep.courses.domain.image;
2+
3+
public interface SessionImageRepository {
4+
int save(SessionCoverImage image);
5+
6+
SessionCoverImage findById(Long id);
7+
8+
SessionCoverImage findBySessionId(Long sessionId);
9+
}
Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,42 @@
11
package nextstep.courses.domain.registration;
22

33
import java.time.LocalDateTime;
4+
import java.util.Objects;
45

56
public class Registration {
7+
private final Long id;
68
private final Long sessionId;
79
private final Long studentId;
810
private final LocalDateTime enrolledAt;
911

1012
public Registration(Long sessionId, Long studentId) {
11-
this(sessionId, studentId, LocalDateTime.now());
13+
this(null, sessionId, studentId, LocalDateTime.now());
1214
}
1315

14-
public Registration(Long sessionId, Long studentId, LocalDateTime enrolledAt) {
16+
public Registration(Long id, Long sessionId, Long studentId, LocalDateTime enrolledAt) {
17+
this.id = id;
1518
this.sessionId = sessionId;
1619
this.studentId = studentId;
1720
this.enrolledAt = enrolledAt;
1821
}
22+
1923
public boolean contains(Long studentId) {
20-
return this.studentId == studentId;
24+
return Objects.equals(this.studentId, studentId);
25+
}
26+
27+
public Long getId() {
28+
return id;
29+
}
30+
31+
public Long getSessionId() {
32+
return sessionId;
33+
}
34+
35+
public Long getStudentId() {
36+
return studentId;
2137
}
2238

39+
public LocalDateTime getEnrolledAt() {
40+
return enrolledAt;
41+
}
2342
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package nextstep.courses.domain.registration;
2+
3+
import java.util.List;
4+
5+
public interface RegistrationRepository {
6+
int save(Registration registration);
7+
8+
Registration findById(Long id);
9+
10+
List<Registration> findBySessionId(Long sessionId);
11+
12+
int countBySessionId(Long sessionId);
13+
}
Lines changed: 37 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,44 @@
11
package nextstep.courses.domain.registration;
22

33
import java.util.ArrayList;
4-
import java.util.Collections;
54
import java.util.List;
65

76
public class Registrations {
8-
private final List<Registration> registrations;
9-
10-
public Registrations() {
11-
this(new ArrayList<>());
12-
}
13-
14-
public Registrations(List<Registration> registrations) {
15-
this.registrations = registrations;
16-
}
17-
18-
public Registrations add(Registration registration) {
19-
List<Registration> newList = new ArrayList<>(registrations);
20-
newList.add(registration);
21-
return new Registrations(newList);
22-
}
23-
24-
public int count() {
25-
return registrations.size();
26-
}
27-
28-
public boolean contains(Long studentId) {
29-
return registrations.stream()
30-
.anyMatch(r -> r.contains(studentId));
31-
}
32-
7+
private final List<Registration> registrations;
8+
9+
public Registrations() {
10+
this(new ArrayList<>());
11+
}
12+
13+
public Registrations(List<Registration> registrations) {
14+
this.registrations = new ArrayList<>(registrations);
15+
}
16+
17+
public Registrations add(Registration registration) {
18+
validateDuplicateRegistration(registration);
19+
List<Registration> newList = new ArrayList<>(registrations);
20+
newList.add(registration);
21+
return new Registrations(newList);
22+
}
23+
24+
private void validateDuplicateRegistration(Registration registration) {
25+
if (isAlreadyRegistered(registration.getStudentId())) {
26+
throw new IllegalArgumentException("์ด๋ฏธ ์ˆ˜๊ฐ•์‹ ์ฒญํ•œ ํ•™์ƒ์ž…๋‹ˆ๋‹ค.");
27+
}
28+
}
29+
30+
public boolean isAlreadyRegistered(long studentId) {
31+
return registrations.stream()
32+
.anyMatch(registration -> registration.getStudentId().equals(studentId));
33+
}
34+
35+
public void validateCapacity(int maxCapacity) {
36+
if (count() > maxCapacity) {
37+
throw new IllegalStateException("์ตœ๋Œ€ ์ˆ˜๊ฐ• ์ธ์›์„ ์ดˆ๊ณผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.");
38+
}
39+
}
40+
41+
public int count() {
42+
return registrations.size();
43+
}
3344
}

โ€Žsrc/main/java/nextstep/courses/domain/session/Enrollment.javaโ€Ž

Lines changed: 19 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,33 @@
11
package nextstep.courses.domain.session;
22

3-
import nextstep.courses.domain.session.type.FreeType;
4-
import nextstep.courses.domain.session.type.SessionType;
3+
import nextstep.courses.domain.registration.Registration;
4+
import nextstep.courses.domain.registration.Registrations;
55

66
public class Enrollment {
7-
private SessionState state;
8-
private SessionType type;
9-
10-
public Enrollment() {
11-
this(SessionState.PREPARING, new FreeType());
12-
}
13-
14-
public Enrollment(SessionType type) {
15-
this(SessionState.PREPARING, type);
16-
}
17-
18-
public Enrollment(SessionState state, SessionType type) {
7+
private final Session session;
8+
private final SessionState state;
9+
private final SessionPolicy policy;
10+
private final Registrations registrations;
11+
12+
public Enrollment(Session session, SessionState state, SessionPolicy policy, Registrations registrations) {
13+
validateState(state);
14+
this.session = session;
1915
this.state = state;
20-
this.type = type;
16+
this.policy = policy;
17+
this.registrations = registrations;
2118
}
2219

23-
public void enroll(long payAmount) {
24-
validateState();
25-
this.type = type.enroll(payAmount);
26-
}
20+
public Registration enroll(long payAmount, long userId) {
21+
if (registrations.isAlreadyRegistered(userId)) {
22+
throw new IllegalArgumentException("์ด๋ฏธ ์ˆ˜๊ฐ•์‹ ์ฒญํ•œ ํ•™์ƒ์ž…๋‹ˆ๋‹ค.");
23+
}
2724

28-
public void open() {
29-
this.state = state.open();
30-
}
25+
policy.validate(payAmount, registrations);
3126

32-
public void close() {
33-
this.state = state.close();
27+
return new Registration(session.getId(), userId);
3428
}
3529

36-
private void validateState() {
30+
private void validateState(SessionState state) {
3731
if (!state.canEnroll()) {
3832
throw new IllegalStateException("๋ชจ์ง‘์ค‘์ธ ๊ฐ•์˜๋งŒ ์ˆ˜๊ฐ•์‹ ์ฒญ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.");
3933
}
Lines changed: 67 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,74 @@
11
package nextstep.courses.domain.session;
22

3+
import java.util.List;
34
import nextstep.courses.domain.BaseEntity;
4-
import nextstep.courses.domain.course.Course;
55
import nextstep.courses.domain.image.SessionCoverImage;
6+
import nextstep.courses.domain.registration.Registration;
7+
import nextstep.courses.domain.registration.Registrations;
68

79
public class Session extends BaseEntity {
8-
private final Course course;
9-
private final Term term;
10-
private final SessionCoverImage cover;
11-
private final SessionPeriod period;
12-
private final Enrollment enrollment;
13-
14-
public Session(Course course, int term, SessionCoverImage cover, String startDay, String endDay) {
15-
this(null, course, new Term(term), cover, new SessionPeriod(startDay, endDay), new Enrollment());
16-
}
17-
18-
public Session(Long id, Course course, Term term, SessionCoverImage cover, SessionPeriod period, Enrollment enrollment) {
19-
super(id);
20-
this.course = course;
21-
this.term = term;
22-
this.cover = cover;
23-
this.period = period;
24-
this.enrollment = enrollment;
25-
}
26-
27-
public void enroll(long payAmount) {
28-
enrollment.enroll(payAmount);
29-
}
30-
31-
public void open() {
32-
enrollment.open();
33-
}
34-
35-
public void close() {
36-
enrollment.close();
37-
}
10+
private final Long courseId;
11+
private final Term term;
12+
private final SessionPeriod period;
13+
private final SessionCoverImage coverImage;
14+
private final SessionPolicy sessionPolicy;
15+
private SessionState state;
16+
17+
public Session(Long courseId, int term, String startDay, String endDay, SessionCoverImage coverImage) {
18+
this(null, courseId, new Term(term), new SessionPeriod(startDay, endDay), SessionState.PREPARING, new SessionPolicy(), coverImage);
19+
}
20+
21+
public Session(Long courseId, int term, String startDay, String endDay, SessionPolicy sessionPolicy, SessionCoverImage coverImage) {
22+
this(null, courseId, new Term(term), new SessionPeriod(startDay, endDay), SessionState.PREPARING, sessionPolicy, coverImage);
23+
}
24+
25+
public Session(Long id, Long courseId, Term term, SessionPeriod period, SessionState state, SessionPolicy sessionPolicy, SessionCoverImage coverImage) {
26+
super(id);
27+
this.courseId = courseId;
28+
this.term = term;
29+
this.period = period;
30+
this.state = state;
31+
this.sessionPolicy = sessionPolicy;
32+
this.coverImage = coverImage;
33+
}
34+
35+
public Enrollment enrollment(Registrations registrations) {
36+
return new Enrollment(this, state, sessionPolicy, registrations);
37+
}
38+
39+
public Enrollment enrollment(List<Registration> registrations) {
40+
return new Enrollment(this, state, sessionPolicy, new Registrations(registrations));
41+
}
42+
43+
public void open() {
44+
this.state = state.open();
45+
}
46+
47+
public void close() {
48+
this.state = state.close();
49+
}
50+
51+
public Long getCourseId() {
52+
return courseId;
53+
}
54+
55+
public Term getTerm() {
56+
return term;
57+
}
58+
59+
public SessionPeriod getPeriod() {
60+
return period;
61+
}
62+
63+
public SessionState getState() {
64+
return state;
65+
}
66+
67+
public SessionPolicy getSessionPolicy() {
68+
return sessionPolicy;
69+
}
70+
71+
public SessionCoverImage getCoverImage() {
72+
return coverImage;
73+
}
3874
}

โ€Žsrc/main/java/nextstep/courses/domain/session/SessionPeriod.javaโ€Ž

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,12 @@ private void validate(LocalDate startDay, LocalDate endDay) {
2121
throw new IllegalArgumentException("์‹œ์ž‘์ผ์€ ์ข…๋ฃŒ์ผ๋ณด๋‹ค ์ด์ „์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.");
2222
}
2323
}
24+
25+
public LocalDate startDay() {
26+
return startDay;
27+
}
28+
29+
public LocalDate endDay() {
30+
return endDay;
31+
}
2432
}

0 commit comments

Comments
ย (0)