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

4단계 - 수강신청(요구사항 변경) #402

Open
wants to merge 63 commits into
base: master
Choose a base branch
from
Open
Changes from 1 commit
Commits
Show all changes
63 commits
Select commit Hold shift + click to select a range
a932353
요구사항 정리
sunggyupaik Nov 25, 2023
e69ca97
[refactor] 질문 삭제를 Question 도메인으로 이동하라
sunggyupaik Nov 28, 2023
0796c54
[refactor] Question 답변 삭제 유효성을 Answer로 옮겨라
sunggyupaik Nov 28, 2023
452ffbf
[refactor] 질문 삭제 서비스 메서드를 리팩토링 하라
sunggyupaik Nov 28, 2023
d80f72f
[refactor] 삭제이력 생성을 개선하라
sunggyupaik Nov 29, 2023
83f217b
[refactor] 질문, 답변, 삭제 이력 각자의 책임을 부여하라
sunggyupaik Nov 29, 2023
7f07967
[refactor] 테스트에 사용히 필요없는 상수를 제거하라
sunggyupaik Nov 29, 2023
53416b6
[refactor] 생성시간, 수정시간을 클래스로 분리하라
sunggyupaik Nov 29, 2023
86fff7c
[refactor] 질문의 답변을 일급 컬렉션으로 개선하라
sunggyupaik Nov 29, 2023
3dfd1cb
[refactor] 답변을 질문 도메인에서 관리하라
sunggyupaik Dec 4, 2023
55a8469
[refactor] 삭제 이력의 의존을 변경하라
sunggyupaik Dec 4, 2023
e83f398
[refactor] 질문 도메인에서 삭제 이력을 관리하라
sunggyupaik Dec 4, 2023
6a649b1
[feat] 삭제이력 일급 컬렉션을 추가하라
sunggyupaik Dec 4, 2023
48a14e3
Merge pull request #262 from sunggyupaik/step1
ohtaeg Dec 5, 2023
b7e8fc7
기능 요구사항 정리
sunggyupaik Dec 5, 2023
32b07f3
[feat] 강의와 이미지 도메인을 생성하라
sunggyupaik Dec 5, 2023
861343b
[feat] 이미지정보 유효성을 추가하라
sunggyupaik Dec 5, 2023
e0f9865
[feat] 강의에 유효성 검증을 추가하라
sunggyupaik Dec 5, 2023
3ddfe50
[test] 강의와 이미지 테스트를 추가하라
sunggyupaik Dec 5, 2023
335ebea
[refactor] 강의의 필드를 개선하라
sunggyupaik Dec 6, 2023
f681082
[feat] 강의 신청 서비스 레이어를 생성하라
sunggyupaik Dec 7, 2023
95dcaa4
[refactor] 도메인 유효성 검증을 메서드로 분리하라
sunggyupaik Dec 7, 2023
e75bbd3
[feat] 강의 신청자를 일급 컬렉션으로 감싸라
sunggyupaik Dec 7, 2023
c30d294
[test] 이미지 타입 조회 테스트를 추가하라
sunggyupaik Dec 7, 2023
fd6e104
[feat] 강의 시작과 종료날짜를 클래스로 분리하라
sunggyupaik Dec 7, 2023
ac45f24
[style] 강의의 enum 위치를 조정하라
sunggyupaik Dec 7, 2023
740212c
[feat] 과정에 강의 추가를 추가하라
sunggyupaik Dec 8, 2023
967ae5b
[feat] 중복 신청 유효성 검사를 추가하라
sunggyupaik Dec 8, 2023
51396ae
[feat] 강의 금액과 지불내역이 다른 유효성을 추가하라
sunggyupaik Dec 8, 2023
7bc23b2
[feat] 강의 도메인 수강상태 변경 유효성을 추가하라
sunggyupaik Dec 8, 2023
82773e1
[feat] 수강생 클래스에 정원 수를 추가하라
sunggyupaik Dec 9, 2023
33d3d6b
[feat] 강의 상태 변경을 서비스 레이어에 추가하라
sunggyupaik Dec 9, 2023
1a558de
[refactor] 수강생과 강의의 의존성을 제거하라
sunggyupaik Dec 9, 2023
328ed9f
[refactor] 과정의 공통 속성을 상속으로 개선하라
sunggyupaik Dec 9, 2023
c1527cd
[refactor] 강의의 공통 속성을 별도 클래스로 분리하라
sunggyupaik Dec 9, 2023
3a1be5a
[fix] 강의 도메인의 강의 상태를 분리하라
sunggyupaik Dec 9, 2023
15f8086
[feat] 강의 상태에 따른 유효성 검사를 추가하라
sunggyupaik Dec 9, 2023
f37bcb7
[fix] 이미지 도메인에 공통 속성 상속을 추가하라
sunggyupaik Dec 9, 2023
8104100
[fix] 도메인 생성자에 일시 매개변수를 추가하라
sunggyupaik Dec 9, 2023
db78578
[feat] 테이블 스키마를 추가하라
sunggyupaik Dec 10, 2023
6289f40
[fix] 과정 저장소 저장 테스트를 수정하라
sunggyupaik Dec 10, 2023
4e4dae1
[feat] 이미지 jdbc 조회 및 저장을 추가하라
sunggyupaik Dec 10, 2023
ef4e541
[feat] 수강생 저장소와 조회를 추가하라
sunggyupaik Dec 11, 2023
d11dc41
[feat] 강의 저장소의 조회와 저장을 추가하라
sunggyupaik Dec 11, 2023
140fc40
[feat] 강의 신청 저장을 추가하라
sunggyupaik Dec 11, 2023
55be725
[feat] 강의 저장소에 수정을 추가하라
sunggyupaik Dec 11, 2023
794f346
[feat] 과정과 강의의 서비스에 저장소를 추가하라
sunggyupaik Dec 11, 2023
055544e
[refactor] 과정 조회에 강의가 포함되도록 개선하라
sunggyupaik Dec 11, 2023
9e538ee
[feat] 과정에 강의 추가를 저장소에서 구현하라
sunggyupaik Dec 11, 2023
a9e7b4f
[feat] 수강 지원에 apply를 사용하라
sunggyupaik Dec 11, 2023
fa78818
[fix] 강의 수정 테스트를 개선하라
sunggyupaik Dec 12, 2023
f8fdd94
[style] 쿼리를 적절한 길이에서 줄바꿈 하라
sunggyupaik Dec 12, 2023
4ff1895
[feat] 강의 서비스 테스트를 추가하라
sunggyupaik Dec 12, 2023
e5984d3
[fix] apply 생성자를 객체 중심으로 개선하라
sunggyupaik Dec 12, 2023
7520aeb
[fix] 생성시간이 not null이라면 null 검사를 제외하라
sunggyupaik Dec 12, 2023
3fcf81e
기능 요구사항 정리
sunggyupaik Dec 12, 2023
abaf303
[fix] 강의에 1개 이상의 이미지를 가지도록 개선하라
sunggyupaik Dec 13, 2023
4a469cf
[feat] 모집중/비모집중을 추가하고 Session 구조를 개선하라
sunggyupaik Dec 13, 2023
427adf8
[feat] 수강신청 유효성을 개선하라
sunggyupaik Dec 13, 2023
f85a1b0
[feat] 강사의 수강신청 승인 및 취소를 추가하라
sunggyupaik Dec 13, 2023
b02d9fe
[refactor] 강의를 리팩토링 하라
sunggyupaik Dec 22, 2023
f8386a4
[feat] 엔티티를 최대한 살리고 비지니스는 클래스로 분리하라
sunggyupaik Dec 26, 2023
0545826
[refactor] 비지니스 로직과 엔티티를 리팩토링 하라
sunggyupaik Dec 27, 2023
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
[refactor] 비지니스 로직과 엔티티를 리팩토링 하라
강의 상태 변경 같은 간단한 경우에는 엔티티에서 해결하고
수강신청, 승인 및 취소는 별도 클래스에서 비지니스 로직을 수행합니다.

getter와 setter를 제거하고 모든 변수에 final을 추가합니다.
sunggyupaik committed Dec 27, 2023
commit 05458266a4527f6e3a9e4938731e814a0e84ebb0
16 changes: 6 additions & 10 deletions src/main/java/nextstep/courses/domain/BaseEntity.java
Original file line number Diff line number Diff line change
@@ -3,31 +3,27 @@
import java.time.LocalDateTime;

public class BaseEntity {
private Long creatorId;
private final Long creatorId;

private LocalDateTime createdAt;
private final LocalDateTime createdAt;

private LocalDateTime updatedAt;
private final LocalDateTime updatedAt;

public BaseEntity(Long creatorId, LocalDateTime createdAt, LocalDateTime updatedAt) {
this.creatorId = creatorId;
this.createdAt = createdAt;
this.updatedAt = updatedAt;
}

public Long getCreatorId() {
public Long creatorId() {
return creatorId;
}

public LocalDateTime getCreatedAt() {
public LocalDateTime createdAt() {
return createdAt;
}

public LocalDateTime getUpdatedAt() {
public LocalDateTime updatedAt() {
return updatedAt;
}

public void setUpdatedAt(LocalDateTime updatedAt) {
this.updatedAt = updatedAt;
}
}
22 changes: 9 additions & 13 deletions src/main/java/nextstep/courses/domain/course/Course.java
Original file line number Diff line number Diff line change
@@ -7,13 +7,13 @@
import java.time.LocalDateTime;

public class Course extends BaseEntity {
private Long id;
private final Long id;

private String title;
private final String title;

private int ordering;
private final int ordering;

private Sessions sessions;
private final Sessions sessions;

public Course(String title, int ordering, Long creatorId, LocalDateTime date) {
this(0L, title, ordering, new Sessions(), creatorId, date, null);
@@ -28,28 +28,24 @@ public Course(Long id, String title, int ordering, Sessions sessions,
this.sessions = sessions;
}

public int sessionSize() {
return this.sessions.size();
}

public void addSession(Session session) {
this.sessions.add(session);
}

public Long getId() {
public Long id() {
return id;
}

public String getTitle() {
public String title() {
return title;
}

public int getOrdering() {
public int ordering() {
return this.ordering;
}

public Long getCreatorId() {
return super.getCreatorId();
public Sessions sessions() {
return this.sessions;
}

@Override
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package nextstep.courses.domain.course;

public interface CourseRepository {
int save(Course course);
Course save(Course course);

Course findById(Long id);
}
38 changes: 0 additions & 38 deletions src/main/java/nextstep/courses/domain/course/session/Approve.java

This file was deleted.

38 changes: 0 additions & 38 deletions src/main/java/nextstep/courses/domain/course/session/Cancel.java

This file was deleted.

Original file line number Diff line number Diff line change
@@ -2,28 +2,22 @@

import nextstep.courses.domain.course.session.apply.Applies;
import nextstep.courses.domain.course.session.apply.Apply;
import nextstep.courses.domain.course.session.apply.ApprovalStatus;
import nextstep.payments.domain.Payment;

import java.time.LocalDateTime;

public class Enrollment {
private Long sessionId;
private final Long sessionId;

private Applies applies;
private final Applies applies;

private SessionState sessionState;
private final SessionDetail sessionDetail;

private SessionProgressStatus sessionProgressStatus;

private SessionRecruitStatus sessionRecruitStatus;

public Enrollment(Long sessionId, Applies applies, SessionState sessionState,
SessionProgressStatus sessionProgressStatus, SessionRecruitStatus sessionRecruitStatus) {
public Enrollment(Long sessionId, Applies applies, SessionDetail sessionDetail) {
this.sessionId = sessionId;
this.applies = applies;
this.sessionState = sessionState;
this.sessionProgressStatus = sessionProgressStatus;
this.sessionRecruitStatus = sessionRecruitStatus;
this.sessionDetail = sessionDetail;
}

public Apply apply(Long nsUserId, Payment payment, LocalDateTime date) {
@@ -33,77 +27,48 @@ public Apply apply(Long nsUserId, Payment payment, LocalDateTime date) {
checkChargedAndApplySizeIsValid();
checkApplicantAlreadyExisted(nsUserId);

return new Apply(sessionId, nsUserId, false, date);
return new Apply(sessionId, nsUserId, ApprovalStatus.WAIT, date);
}

private void checkPaymentIsPaid(Long nsUserId, Payment payment) {
if (this.charged()) {
if (this.sessionDetail.charged()) {
checkPaymentIsValid(nsUserId, payment);
}
}

public boolean charged() {
return this.sessionState.getSessionType().charged();
}

private void checkPaymentIsValid(Long nsUserId, Payment payment) {
if (payment == null ||
!payment.isPaid(
nsUserId,
sessionId,
sessionState.getAmount()
this.sessionDetail.getAmount()
)
) {
throw new IllegalArgumentException("결제를 다시 확인하세요.");
}
}

private void checkStatusOnRecruit() {
if (this.notRecruiting()) {
if (this.sessionDetail.notRecruiting()) {
throw new IllegalArgumentException("강의 신청은 모집 중일 때만 가능 합니다.");
}
}

private void checkStatusOnReadyOrOnGoing() {
if (this.notReadyOrOnGoing()) {
if (this.sessionDetail.notReadyOrOnGoing()) {
throw new IllegalArgumentException("강의 신청은 준비, 진행중일 때만 가능 합니다.");
}
}

private void checkChargedAndApplySizeIsValid() {
if(chargedAndFull()) {
if(this.sessionDetail.chargedAndFull(applies.size())) {
throw new IllegalArgumentException("수강 신청 인원이 초과 되었습니다.");
}
}

private boolean chargedAndFull() {
return this.charged() && applySizeFull();
}

private boolean applySizeFull() {
return this.sessionState.getQuota() == applies.size();
}

private void checkApplicantAlreadyExisted(Long nsUserId) {
if (this.containsUserId(nsUserId)) {
if (this.applies.containsUserId(nsUserId)) {
throw new IllegalArgumentException("이미 수강 신청 이력이 있습니다.");
}
}

public boolean containsUserId(Long nsUserId) {
return this.applies.getApplies().stream()
.anyMatch(apply -> apply.isSameWithUserId(nsUserId));
}

public int size() {
return this.applies.size();
}

public boolean notRecruiting() {
return this.sessionRecruitStatus.notRecruiting();
}

public boolean notReadyOrOnGoing() {
return this.sessionProgressStatus.notReadyOrOnGoing();
}
}
Loading