Skip to content

Commit 44ed16a

Browse files
committed
feat: 강의가 진행 중인 상태에서도 수강신청 가능하도록 하는 기능 구현
1 parent 9f9f537 commit 44ed16a

File tree

9 files changed

+82
-15
lines changed

9 files changed

+82
-15
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838

3939
### 기능 목록
4040
- [x] 강의는 하나 이상 강의 이미지를 가질 수 있다.
41-
- [ ] 강의가 진행 중인 상태에서도 수강신청이 가능하다.
41+
- [x] 강의가 진행 중인 상태에서도 수강신청이 가능하다.
4242
- 강의 진행 상태(준비중, 진행중, 종료)와 모집 상태(비모집중, 모집중)로 상태 분리 필요.
4343
- [ ] 강사는 수강신청한 사람 중, 선발된 인원에 대해서만 수강 승인이 가능해야 한다.
4444
- [ ] 강사는 수강신청한 사람 중, 선발되지 않은 사람은 수강 취소할 수 있다.

src/main/java/nextstep/courses/domain/FreeSession.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ public FreeSession(Long id, List<SessionImage> sessionImage, RecruitStatus recru
1515
super(id, sessionImage, recruitStatus, sessionDate, students);
1616
}
1717

18+
public FreeSession(Long id, List<SessionImage> sessionImage, RecruitStatus recruitStatus, SessionProgressStatus sessionProgressStatus, SessionDate sessionDate, Set<NsUser> students) {
19+
super(id, sessionImage, recruitStatus, sessionProgressStatus, sessionDate, students);
20+
}
21+
1822

1923
@Override
2024
protected void assertSatisfiedCondition(NsUser user, Payment payment) {

src/main/java/nextstep/courses/domain/PaySession.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,14 @@ public PaySession(Long id, List<SessionImage> sessionImage, RecruitStatus recrui
2929
this.maximumStudents = maximumStudents;
3030
}
3131

32+
public PaySession(Long id, List<SessionImage> sessionImage, RecruitStatus recruitStatus, SessionProgressStatus sessionProgressStatus, SessionDate sessionDate, Set<NsUser> students, int maximumStudents, long amount) {
33+
super(id, sessionImage, recruitStatus, sessionProgressStatus, sessionDate, students);
34+
assertValidMaximumStudents(maximumStudents);
35+
assertValidAmount(amount);
36+
this.amount = amount;
37+
this.maximumStudents = maximumStudents;
38+
}
39+
3240
private void assertValidMaximumStudents(int maximumStudents) {
3341
String errorMessage = "최대 수강생은 1명 이상으로 등록해야 합니다.";
3442

src/main/java/nextstep/courses/domain/Session.java

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,28 @@ public abstract class Session {
1414
private final Long id;
1515
private final List<SessionImage> sessionImage;
1616
private RecruitStatus recruitStatus;
17+
private SessionProgressStatus sessionProgressStatus;
1718
private final Set<NsUser> students;
1819
private final SessionDate sessionDate;
1920

21+
2022
public Session(Long id, List<SessionImage> sessionImage, RecruitStatus recruitStatus, SessionDate sessionDate) {
2123
this(id, sessionImage, recruitStatus, sessionDate, new HashSet<>());
2224
}
2325

26+
public Session(Long id, List<SessionImage> sessionImage, RecruitStatus recruitStatus, SessionProgressStatus sessionProgressStatus, SessionDate sessionDate) {
27+
this(id, sessionImage, recruitStatus, sessionProgressStatus, sessionDate, new HashSet<>());
28+
}
29+
2430
public Session(Long id, List<SessionImage> sessionImage, RecruitStatus recruitStatus, SessionDate sessionDate, Set<NsUser> students) {
31+
this(id, sessionImage, recruitStatus, SessionProgressStatus.PREPARE, sessionDate, students);
32+
}
33+
34+
public Session(Long id, List<SessionImage> sessionImage, RecruitStatus recruitStatus, SessionProgressStatus sessionProgressStatus, SessionDate sessionDate, Set<NsUser> students) {
2535
this.id = id;
2636
this.sessionImage = sessionImage;
2737
this.recruitStatus = recruitStatus;
38+
this.sessionProgressStatus = sessionProgressStatus;
2839
this.sessionDate = sessionDate;
2940
this.students = students;
3041
}
@@ -61,14 +72,26 @@ public List<SessionImage> getSessionImage() {
6172
return sessionImage;
6273
}
6374

64-
public RecruitStatus getSessionStatus() {
75+
public RecruitStatus getRecruitStatus() {
6576
return recruitStatus;
6677
}
6778

79+
public SessionProgressStatus getSessionProgressStatus() {
80+
return sessionProgressStatus;
81+
}
82+
6883
public SessionDate getSessionDate() {
6984
return sessionDate;
7085
}
7186

87+
public void changeProgressStatus(SessionProgressStatus sessionProgressStatus) {
88+
this.sessionProgressStatus = sessionProgressStatus;
89+
}
90+
91+
public void changeRecruitStatus(RecruitStatus recruitStatus) {
92+
this.recruitStatus = recruitStatus;
93+
}
94+
7295

7396
abstract protected void assertSatisfiedCondition(NsUser user, Payment payment);
7497

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package nextstep.courses.domain;
2+
3+
public enum SessionProgressStatus {
4+
PREPARE,
5+
RUN,
6+
END;
7+
8+
public static SessionProgressStatus findByName(String name) {
9+
return SessionProgressStatus.valueOf(name.toUpperCase());
10+
}
11+
}

src/main/java/nextstep/courses/infrastructure/JdbcSessionRepository.java

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public <T> Optional<Session> findBySessionId(Long sessionId, Class<T> type) {
5656
}
5757

5858
private Optional<Session> findFreeSessionById(Long sessionId) {
59-
String paySessionSql = "select id, session_status, start_date, end_date from free_session where id = ?";
59+
String paySessionSql = "select id, recruit_status, progress_status, start_date, end_date from free_session where id = ?";
6060
String sessionImageTableName = "free_session_image";
6161
String studentsTableName = "free_session_students";
6262

@@ -67,15 +67,16 @@ private Optional<Session> findFreeSessionById(Long sessionId) {
6767
new FreeSession(rs.getLong(1),
6868
sessionImage,
6969
RecruitStatus.findByName(rs.getString(2)),
70-
new SessionDate(toLocalDate(rs.getTimestamp(3)), toLocalDate(rs.getTimestamp(4))),
70+
SessionProgressStatus.findByName(rs.getString(3)),
71+
new SessionDate(toLocalDate(rs.getTimestamp(4)), toLocalDate(rs.getTimestamp(5))),
7172
students
7273
);
7374

7475
return Optional.ofNullable(jdbcTemplate.queryForObject(paySessionSql, sessionMapper, sessionId));
7576
}
7677

7778
private Optional<Session> findPaySessionById(Long sessionId) {
78-
String paySessionSql = "select id, session_status, amount, maximum_students, start_date, end_date from pay_session where id = ?";
79+
String paySessionSql = "select id, recruit_status, progress_status, amount, maximum_students, start_date, end_date from pay_session where id = ?";
7980
String sessionImageTableName = "pay_session_image";
8081
String studentsTableName = "pay_session_students";
8182

@@ -86,10 +87,11 @@ private Optional<Session> findPaySessionById(Long sessionId) {
8687
new PaySession(rs.getLong(1),
8788
sessionImage,
8889
RecruitStatus.findByName(rs.getString(2)),
89-
new SessionDate(toLocalDate(rs.getTimestamp(5)), toLocalDate(rs.getTimestamp(6))),
90+
SessionProgressStatus.findByName(rs.getString(3)),
91+
new SessionDate(toLocalDate(rs.getTimestamp(6)), toLocalDate(rs.getTimestamp(7))),
9092
students,
91-
rs.getInt(4),
92-
rs.getInt(3)
93+
rs.getInt(5),
94+
rs.getInt(4)
9395
);
9496

9597
return Optional.ofNullable(jdbcTemplate.queryForObject(paySessionSql, sessionMapper, sessionId));
@@ -111,13 +113,14 @@ public void saveSession(Session session, Long courseId) {
111113
}
112114

113115
private void savePaySession(PaySession paySession, Long courseId) {
114-
String sql = "insert into pay_session (id, session_status, amount, maximum_students, start_date, end_date, course_id) values (?, ?, ?, ?, ?, ?, ?)";
116+
String sql = "insert into pay_session (id, progress_status, recruit_status, amount, maximum_students, start_date, end_date, course_id) values (?, ?, ?, ?, ?, ?, ?, ?)";
115117
String studentsTableName = "pay_session_students";
116118
String sessionImageTableName = "pay_session_image";
117119

118120
jdbcTemplate.update(sql,
119121
paySession.getId(),
120-
paySession.getSessionStatus().name(),
122+
paySession.getSessionProgressStatus().name(),
123+
paySession.getRecruitStatus().name(),
121124
paySession.getAmount(),
122125
paySession.getMaximumStudents(),
123126
paySession.getSessionDate().getStartDate(),
@@ -129,13 +132,14 @@ private void savePaySession(PaySession paySession, Long courseId) {
129132
}
130133

131134
private void saveFreeSession(FreeSession freeSession, Long courseId) {
132-
String sql = "insert into free_session (id, session_status, start_date, end_date, course_id) values (?, ?, ?, ?, ?)";
135+
String sql = "insert into free_session (id, progress_status, recruit_status, start_date, end_date, course_id) values (?, ?, ?, ?, ?, ?)";
133136
String studentsTableName = "free_session_students";
134137
String sessionImageTableName = "free_session_image";
135138

136139
jdbcTemplate.update(sql,
137140
freeSession.getId(),
138-
freeSession.getSessionStatus().name(),
141+
freeSession.getSessionProgressStatus().name(),
142+
freeSession.getRecruitStatus().name(),
139143
freeSession.getSessionDate().getStartDate(),
140144
freeSession.getSessionDate().getEndDate(),
141145
courseId);

src/main/resources/schema.sql

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,3 +108,10 @@ create table delete_history (
108108
deleted_by_id bigint,
109109
primary key (id)
110110
);
111+
112+
113+
alter table pay_session rename column session_status to recruit_status;
114+
alter table free_session rename column session_status to recruit_status;
115+
116+
alter table pay_session add column progress_status varchar(20) default 'PREPARE';
117+
alter table free_session add column progress_status varchar(20) default 'PREPARE';

src/test/java/nextstep/courses/domain/SessionTest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,14 @@ void testManyImage() {
4848
assertThat(testSession.getSessionImage()).hasSize(2)
4949
.containsExactlyInAnyOrderElementsOf(sessionImages);
5050
}
51+
52+
@Test
53+
@DisplayName("진행 중인 강의 수강신청")
54+
void testEnrollmentWhenSessionRun() {
55+
Session testSession = TestSessionFactory.recruitStatusSession(sessionId);
56+
testSession.changeProgressStatus(SessionProgressStatus.RUN);
57+
testSession.enrollmentUser(student, new Payment());
58+
59+
assertThat(testSession.getStudents()).hasSize(1);
60+
}
5161
}

src/test/java/nextstep/courses/infrastructure/SessionRepositoryTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ void testFreeSession() {
5353
assertThat(findSession.getId()).isEqualTo(1L);
5454

5555
assertThat(findSession.getSessionImage().get(0).getId()).isEqualTo(sessionImages.get(0).getId());
56-
56+
assertThat(findSession.getSessionProgressStatus()).isEqualTo(SessionProgressStatus.PREPARE);
5757
assertThat(findSession.getStudents()).hasSize(2)
5858
.extracting(NsUser::getUserId)
5959
.containsAll(students.stream().map(NsUser::getUserId).collect(Collectors.toUnmodifiableList()));
@@ -63,7 +63,7 @@ void testFreeSession() {
6363
@DisplayName("유료 강의 db에 넣고 조회 테스트")
6464
void testPaySession() {
6565
int amount = 1000;
66-
PaySession paySession = new PaySession(1L, sessionImages, RecruitStatus.RECRUIT, SessionDateTest.of(), students, 2, amount);
66+
PaySession paySession = new PaySession(1L, sessionImages,RecruitStatus.RECRUIT, SessionDateTest.of(), students, 2, amount);
6767

6868
sessionRepository.saveSession(paySession, courseId);
6969

@@ -72,7 +72,7 @@ void testPaySession() {
7272
assertThat(findSession.getId()).isEqualTo(1L);
7373

7474
assertThat(findSession.getSessionImage().get(0).getId()).isEqualTo(sessionImages.get(0).getId());
75-
75+
assertThat(findSession.getSessionProgressStatus()).isEqualTo(SessionProgressStatus.PREPARE);
7676
assertThat(findSession.getStudents()).hasSize(2)
7777
.extracting(NsUser::getUserId)
7878
.containsAll(students.stream().map(NsUser::getUserId).collect(Collectors.toUnmodifiableList()));

0 commit comments

Comments
 (0)