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
Next Next commit
[feat] 과정에 강의 추가를 추가하라
과정에 강의가 새롭게 추가되므로 강의를 추가하는 로직을 만듭니다
  • Loading branch information
sunggyupaik committed Dec 8, 2023
commit 740212cfdd07b5afd48322f327cf15c4f1209380
16 changes: 15 additions & 1 deletion src/main/java/nextstep/courses/domain/course/Course.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package nextstep.courses.domain.course;

import nextstep.courses.domain.course.session.Session;
import nextstep.courses.domain.course.session.Sessions;

import java.time.LocalDateTime;
@@ -11,7 +12,7 @@ public class Course {

private Long creatorId;

private Sessions sessions;
private Sessions sessions = new Sessions();

private LocalDateTime createdAt;

@@ -30,6 +31,19 @@ public Course(Long id, String title, Long creatorId, LocalDateTime createdAt, Lo
this.creatorId = creatorId;
this.createdAt = createdAt;
this.updatedAt = updatedAt;
this.sessions = new Sessions();
}

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

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

public Long getId() {
return id;
}

public String getTitle() {
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
package nextstep.courses.domain.course.session;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Sessions implements Iterable<Session> {
private final List<Session> sessions;

public Sessions() {
this(new ArrayList<>());
}

public Sessions(List<Session> sessions) {
validate(sessions);

@@ -22,8 +27,16 @@ private void checkSessionsSizeIsValid(List<Session> sessions) {
}
}

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

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

@Override
public Iterator<Session> iterator() {
return null;
return this.sessions.iterator();
}
}
23 changes: 23 additions & 0 deletions src/main/java/nextstep/courses/service/CourseService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package nextstep.courses.service;

import nextstep.courses.domain.course.Course;
import nextstep.courses.domain.course.CourseRepository;
import nextstep.courses.domain.course.session.Session;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

@Service("courseService")
public class CourseService {
@Resource(name = "courseRepository")
private CourseRepository courseRepository;

public void addSession(long courseId, Session session) {
Course course = getCourse(courseId);
course.addSession(session);
}

private Course getCourse(long courseId) {
return courseRepository.findById(courseId);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package nextstep.courses.domain.course.service;

import nextstep.courses.domain.course.Course;
import nextstep.courses.domain.course.CourseRepository;
import nextstep.courses.domain.course.image.Image;
import nextstep.courses.domain.course.session.Applicants;
import nextstep.courses.domain.course.session.Duration;
import nextstep.courses.domain.course.session.Session;
import nextstep.courses.domain.course.session.SessionRepository;
import nextstep.courses.service.CourseService;
import nextstep.courses.service.SessionService;
import nextstep.payments.domain.Payment;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Optional;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.when;

@ExtendWith(MockitoExtension.class)
public class CourseServiceTest {
private Image image;
private Payment payment;
private LocalDate localDate;
private LocalDateTime localDateTime;
private Duration duration;
private Course course;
private Session session;

@BeforeEach
void setUp() {
course = new Course("math", 1L);
image = new Image(1000, "jpeg", Image.WIDTH_MIN, Image.HEIGHT_MIN);
payment = new Payment("1", 1L, 3L, 1000L);
localDate = LocalDate.of(2023, 12, 5);
localDateTime = LocalDateTime.of(2023, 12, 5, 12, 0);
duration = new Duration(localDate, localDate);
session = new Session(1L, image, duration, Session.Type.FREE, 1000L,
10, new Applicants(), Session.Status.RECRUIT, localDateTime, localDateTime);
}

@Mock
private SessionRepository sessionRepository;

@Mock
private CourseRepository courseRepository;

@InjectMocks
private CourseService courseService;

@Test
@DisplayName("주어진 강의를 과정에 추가하면 과정에 강의가 추가된다.")
void addSession_success() {
when(courseRepository.findById(course.getId())).thenReturn(course);
assertThat(course.sessionSize()).isEqualTo(0);

courseService.addSession(course.getId(), session);
assertThat(course.sessionSize()).isEqualTo(1);
}
}