Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Step4] 수강신청(요구사항 변경) #512

Open
wants to merge 24 commits into
base: danden1
Choose a base branch
from
Open
Changes from 1 commit
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
4825879
refact: 피드백 반영
Danden1 Apr 14, 2024
7db46f5
feat: 강의 DB에 저장하고 조회하는 기능 추가
Danden1 Apr 14, 2024
82afb5f
feat: 과정/강의 DB에 저장하고 조회하는 기능 추가
Danden1 Apr 14, 2024
690897c
refact: 피드백 반영
Danden1 Apr 15, 2024
372a860
refact: 불필요한 메서드 제거
Danden1 Apr 15, 2024
977df36
refact: 생성자 변경
Danden1 Apr 16, 2024
cb8eb42
docs: 기능 목록
Danden1 Apr 16, 2024
c81b977
feat: 이미지 여러장 저장 기능 추가
Danden1 Apr 16, 2024
9f9f537
docs: 체크 박스 표시
Danden1 Apr 16, 2024
44ed16a
feat: 강의가 진행 중인 상태에서도 수강신청 가능하도록 하는 기능 구현
Danden1 Apr 17, 2024
b9b560a
feat: 승인된 유저만 수강승인 하는 기능 추가
Danden1 Apr 17, 2024
1c0881a
refact: Free/Pay Session Repository 분리
Danden1 Apr 17, 2024
bad0ea4
conflict 해결
Danden1 Apr 17, 2024
c2213de
fix: conflict 해결
Danden1 Apr 14, 2024
e8faf76
fix: conflict 해결
Danden1 Apr 14, 2024
df34cef
fix: conflict 해결
Danden1 Apr 15, 2024
f01b24a
refact: 불필요한 메서드 제거
Danden1 Apr 15, 2024
747c740
refact: 생성자 변경
Danden1 Apr 16, 2024
8ce5938
conflict 해결
Danden1 Apr 16, 2024
fe7d691
fix: conflict 해결
Danden1 Apr 16, 2024
34b4074
docs: 체크 박스 표시
Danden1 Apr 16, 2024
46b8d46
fix: conflict 해결
Danden1 Apr 17, 2024
bd50aa3
feat: 승인된 유저만 수강승인 하는 기능 추가
Danden1 Apr 17, 2024
7da41fc
refact: Free/Pay Session Repository 분리
Danden1 Apr 17, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
feat: 강의가 진행 중인 상태에서도 수강신청 가능하도록 하는 기능 구현
  • Loading branch information
Danden1 committed Apr 17, 2024
commit 44ed16ab775210e69f7f617d5c54591e60f8d029
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -38,7 +38,7 @@

### 기능 목록
- [x] 강의는 하나 이상 강의 이미지를 가질 수 있다.
- [ ] 강의가 진행 중인 상태에서도 수강신청이 가능하다.
- [x] 강의가 진행 중인 상태에서도 수강신청이 가능하다.
- 강의 진행 상태(준비중, 진행중, 종료)와 모집 상태(비모집중, 모집중)로 상태 분리 필요.
- [ ] 강사는 수강신청한 사람 중, 선발된 인원에 대해서만 수강 승인이 가능해야 한다.
- [ ] 강사는 수강신청한 사람 중, 선발되지 않은 사람은 수강 취소할 수 있다.
4 changes: 4 additions & 0 deletions src/main/java/nextstep/courses/domain/FreeSession.java
Original file line number Diff line number Diff line change
@@ -15,6 +15,10 @@ public FreeSession(Long id, List<SessionImage> sessionImage, RecruitStatus recru
super(id, sessionImage, recruitStatus, sessionDate, students);
}

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


@Override
protected void assertSatisfiedCondition(NsUser user, Payment payment) {
8 changes: 8 additions & 0 deletions src/main/java/nextstep/courses/domain/PaySession.java
Original file line number Diff line number Diff line change
@@ -29,6 +29,14 @@ public PaySession(Long id, List<SessionImage> sessionImage, RecruitStatus recrui
this.maximumStudents = maximumStudents;
}

public PaySession(Long id, List<SessionImage> sessionImage, RecruitStatus recruitStatus, SessionProgressStatus sessionProgressStatus, SessionDate sessionDate, Set<NsUser> students, int maximumStudents, long amount) {
super(id, sessionImage, recruitStatus, sessionProgressStatus, sessionDate, students);
assertValidMaximumStudents(maximumStudents);
assertValidAmount(amount);
this.amount = amount;
this.maximumStudents = maximumStudents;
}

private void assertValidMaximumStudents(int maximumStudents) {
String errorMessage = "최대 수강생은 1명 이상으로 등록해야 합니다.";

25 changes: 24 additions & 1 deletion src/main/java/nextstep/courses/domain/Session.java
Original file line number Diff line number Diff line change
@@ -14,17 +14,28 @@ public abstract class Session {
private final Long id;
private final List<SessionImage> sessionImage;
private RecruitStatus recruitStatus;
private SessionProgressStatus sessionProgressStatus;
private final Set<NsUser> students;
private final SessionDate sessionDate;


public Session(Long id, List<SessionImage> sessionImage, RecruitStatus recruitStatus, SessionDate sessionDate) {
this(id, sessionImage, recruitStatus, sessionDate, new HashSet<>());
}

public Session(Long id, List<SessionImage> sessionImage, RecruitStatus recruitStatus, SessionProgressStatus sessionProgressStatus, SessionDate sessionDate) {
this(id, sessionImage, recruitStatus, sessionProgressStatus, sessionDate, new HashSet<>());
}

public Session(Long id, List<SessionImage> sessionImage, RecruitStatus recruitStatus, SessionDate sessionDate, Set<NsUser> students) {
this(id, sessionImage, recruitStatus, SessionProgressStatus.PREPARE, sessionDate, students);
}

public Session(Long id, List<SessionImage> sessionImage, RecruitStatus recruitStatus, SessionProgressStatus sessionProgressStatus, SessionDate sessionDate, Set<NsUser> students) {
this.id = id;
this.sessionImage = sessionImage;
this.recruitStatus = recruitStatus;
this.sessionProgressStatus = sessionProgressStatus;
this.sessionDate = sessionDate;
this.students = students;
}
@@ -61,14 +72,26 @@ public List<SessionImage> getSessionImage() {
return sessionImage;
}

public RecruitStatus getSessionStatus() {
public RecruitStatus getRecruitStatus() {
return recruitStatus;
}

public SessionProgressStatus getSessionProgressStatus() {
return sessionProgressStatus;
}

public SessionDate getSessionDate() {
return sessionDate;
}

public void changeProgressStatus(SessionProgressStatus sessionProgressStatus) {
this.sessionProgressStatus = sessionProgressStatus;
}

public void changeRecruitStatus(RecruitStatus recruitStatus) {
this.recruitStatus = recruitStatus;
}


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

11 changes: 11 additions & 0 deletions src/main/java/nextstep/courses/domain/SessionProgressStatus.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package nextstep.courses.domain;

public enum SessionProgressStatus {
PREPARE,
RUN,
END;

public static SessionProgressStatus findByName(String name) {
return SessionProgressStatus.valueOf(name.toUpperCase());
}
}
Original file line number Diff line number Diff line change
@@ -56,7 +56,7 @@ public <T> Optional<Session> findBySessionId(Long sessionId, Class<T> type) {
}

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

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

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

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

@@ -86,10 +87,11 @@ private Optional<Session> findPaySessionById(Long sessionId) {
new PaySession(rs.getLong(1),
sessionImage,
RecruitStatus.findByName(rs.getString(2)),
new SessionDate(toLocalDate(rs.getTimestamp(5)), toLocalDate(rs.getTimestamp(6))),
SessionProgressStatus.findByName(rs.getString(3)),
new SessionDate(toLocalDate(rs.getTimestamp(6)), toLocalDate(rs.getTimestamp(7))),
students,
rs.getInt(4),
rs.getInt(3)
rs.getInt(5),
rs.getInt(4)
);

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

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

jdbcTemplate.update(sql,
paySession.getId(),
paySession.getSessionStatus().name(),
paySession.getSessionProgressStatus().name(),
paySession.getRecruitStatus().name(),
paySession.getAmount(),
paySession.getMaximumStudents(),
paySession.getSessionDate().getStartDate(),
@@ -129,13 +132,14 @@ private void savePaySession(PaySession paySession, Long courseId) {
}

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

jdbcTemplate.update(sql,
freeSession.getId(),
freeSession.getSessionStatus().name(),
freeSession.getSessionProgressStatus().name(),
freeSession.getRecruitStatus().name(),
freeSession.getSessionDate().getStartDate(),
freeSession.getSessionDate().getEndDate(),
courseId);
7 changes: 7 additions & 0 deletions src/main/resources/schema.sql
Original file line number Diff line number Diff line change
@@ -108,3 +108,10 @@ create table delete_history (
deleted_by_id bigint,
primary key (id)
);


alter table pay_session rename column session_status to recruit_status;
alter table free_session rename column session_status to recruit_status;

alter table pay_session add column progress_status varchar(20) default 'PREPARE';
alter table free_session add column progress_status varchar(20) default 'PREPARE';
10 changes: 10 additions & 0 deletions src/test/java/nextstep/courses/domain/SessionTest.java
Original file line number Diff line number Diff line change
@@ -48,4 +48,14 @@ void testManyImage() {
assertThat(testSession.getSessionImage()).hasSize(2)
.containsExactlyInAnyOrderElementsOf(sessionImages);
}

@Test
@DisplayName("진행 중인 강의 수강신청")
void testEnrollmentWhenSessionRun() {
Session testSession = TestSessionFactory.recruitStatusSession(sessionId);
testSession.changeProgressStatus(SessionProgressStatus.RUN);
testSession.enrollmentUser(student, new Payment());

assertThat(testSession.getStudents()).hasSize(1);
}
}
Original file line number Diff line number Diff line change
@@ -53,7 +53,7 @@ void testFreeSession() {
assertThat(findSession.getId()).isEqualTo(1L);

assertThat(findSession.getSessionImage().get(0).getId()).isEqualTo(sessionImages.get(0).getId());

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

sessionRepository.saveSession(paySession, courseId);

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

assertThat(findSession.getSessionImage().get(0).getId()).isEqualTo(sessionImages.get(0).getId());

assertThat(findSession.getSessionProgressStatus()).isEqualTo(SessionProgressStatus.PREPARE);
assertThat(findSession.getStudents()).hasSize(2)
.extracting(NsUser::getUserId)
.containsAll(students.stream().map(NsUser::getUserId).collect(Collectors.toUnmodifiableList()));