diff --git a/README.md b/README.md index 5743fc362..41bb0a75e 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,7 @@ - [πŸš€ 1단계 - λ ˆκ±°μ‹œ μ½”λ“œ λ¦¬νŒ©ν„°λ§](./docs/01-refactoring.md) - [πŸš€ 2단계 - μˆ˜κ°•μ‹ μ²­(도메인 λͺ¨λΈ)](./docs/02-lms-domain-model.md) - [πŸš€ 3단계 - μˆ˜κ°•μ‹ μ²­(DB 적용)](./docs/03-lms-db.md) +- [πŸš€ 4단계 - μˆ˜κ°•μ‹ μ²­(μš”κ΅¬μ‚¬ν•­ λ³€κ²½)](./docs/04-lms-refactor.md) ## μ§„ν–‰ 방법 * ν•™μŠ΅ 관리 μ‹œμŠ€ν…œμ˜ μˆ˜κ°•μ‹ μ²­ μš”κ΅¬μ‚¬ν•­μ„ νŒŒμ•…ν•œλ‹€. diff --git a/docs/04-lms-refactor.md b/docs/04-lms-refactor.md new file mode 100644 index 000000000..605a7b121 --- /dev/null +++ b/docs/04-lms-refactor.md @@ -0,0 +1,43 @@ +# πŸš€ 4단계 - μˆ˜κ°•μ‹ μ²­(μš”κ΅¬μ‚¬ν•­ λ³€κ²½) + +*** + +## μ½”λ“œ 리뷰 + +> PR 링크 : [#808](https://github.com/next-step/java-lms/pull/808) + +## λ‚˜μ˜ ν•™μŠ΅ λͺ©ν‘œ + +### 1. 컴파일 였λ₯˜κ°€ λ°œμƒν•˜μ§€ μ•Šλ„λ‘ λ¦¬νŒ©ν„°λ§ν•˜μž. + +- ν”„λ‘œκ·Έλž˜λ° μš”κ΅¬μ‚¬ν•­μ—μ„œμ™€ 같이 λ¦¬νŒ©ν„°λ§ν•  λ•Œ 컴파일 μ—λŸ¬κ°€ μ΅œλŒ€ν•œ λ°œμƒν•˜μ§€ μ•Šλ„λ‘ κ΅¬ν˜„ν•œλ‹€. +- 이 λͺ©ν‘œλ₯Ό μ§€ν‚€λ €λ©΄ κΈ°μ‘΄ μ½”λ“œλ₯Ό λ°”λ‘œ μˆ˜μ •ν•˜λŠ” 것이 μ•„λ‹Œ κΈ°μ‘΄ μ½”λ“œλ₯Ό λ³΅μ‚¬ν•œ λ’€ μ μ§„μ μœΌλ‘œ μ½”λ“œλ₯Ό μˆ˜μ •ν•΄ λ‚˜μ•„κ°„λ‹€. + +## 핡심 ν•™μŠ΅ λͺ©ν‘œ + +- DB ν…Œμ΄λΈ”μ΄ 변경될 λ•Œλ„ μŠ€νŠΈλž­κΈ€λŸ¬ νŒ¨ν„΄μ„ μ μš©ν•΄ 점진적인 λ¦¬νŒ©ν„°λ§μ„ μ—°μŠ΅ν•œλ‹€. + - [μŠ€νŠΈλž­κΈ€λŸ¬(κ΅μ‚΄μž) νŒ¨ν„΄ - λ§ˆν‹΄ 파울러](https://martinfowler.com/bliki/StranglerFigApplication.html) + - [μŠ€νŠΈλž­κΈ€λŸ¬ 무화과 νŒ¨ν„΄](https://learn.microsoft.com/ko-kr/azure/architecture/patterns/strangler-fig) + +## λ³€κ²½λœ κΈ°λŠ₯ μš”κ΅¬μ‚¬ν•­ + +### κ°•μ˜ μˆ˜κ°•μ‹ μ²­μ€ κ°•μ˜ μƒνƒœκ°€ λͺ¨μ§‘쀑일 λ•Œλ§Œ κ°€λŠ₯ν•˜λ‹€. + +- κ°•μ˜κ°€ μ§„ν–‰ 쀑인 μƒνƒœμ—μ„œλ„ μˆ˜κ°•μ‹ μ²­μ΄ κ°€λŠ₯ν•΄μ•Ό ν•œλ‹€. + - κ°•μ˜ μ§„ν–‰ μƒνƒœ(쀀비쀑, 진행쀑, μ’…λ£Œ)와 λͺ¨μ§‘ μƒνƒœ(λΉ„λͺ¨μ§‘쀑, λͺ¨μ§‘쀑)둜 μƒνƒœ 값을 뢄리해야 ν•œλ‹€. + +### κ°•μ˜λŠ” κ°•μ˜ 컀버 이미지 정보λ₯Ό κ°€μ§„λ‹€. + +- κ°•μ˜λŠ” ν•˜λ‚˜ μ΄μƒμ˜ 컀버 이미지λ₯Ό κ°€μ§ˆ 수 μžˆλ‹€. + +### 강사가 μŠΉμΈν•˜μ§€ μ•Šμ•„λ„ μˆ˜κ°• μ‹ μ²­ν•˜λŠ” λͺ¨λ“  μ‚¬λžŒμ΄ μˆ˜κ°• κ°€λŠ₯ν•˜λ‹€. + +- μš°μ•„ν•œν…Œν¬μ½”μŠ€(무료), μš°μ•„ν•œν…Œν¬μΊ ν”„ Pro(유료)와 같이 μ„ λ°œλœ μΈμ›λ§Œ μˆ˜κ°• κ°€λŠ₯ν•΄μ•Ό ν•œλ‹€. + - κ°•μ‚¬λŠ” μˆ˜κ°•μ‹ μ²­ν•œ μ‚¬λžŒ 쀑 μ„ λ°œλœ 인원에 λŒ€ν•΄μ„œλ§Œ μˆ˜κ°• 승인이 κ°€λŠ₯ν•΄μ•Ό ν•œλ‹€. + - κ°•μ‚¬λŠ” μˆ˜κ°•μ‹ μ²­ν•œ μ‚¬λžŒ 쀑 μ„ λ°œλ˜μ§€ μ•Šμ€ μ‚¬λžŒμ€ μˆ˜κ°•μ„ μ·¨μ†Œν•  수 μžˆμ–΄μ•Ό ν•œλ‹€. + +## ν”„λ‘œκ·Έλž˜λ° μš”κ΅¬μ‚¬ν•­ + +- λ¦¬νŒ©ν„°λ§ν•  λ•Œ 컴파일 μ—λŸ¬μ™€ 기쑴의 λ‹¨μœ„ ν…ŒμŠ€νŠΈμ˜ μ‹€νŒ¨λ₯Ό μ΅œμ†Œν™”ν•˜λ©΄μ„œ 점진적인 λ¦¬νŒ©ν„°λ§μ΄ κ°€λŠ₯ν•˜λ„λ‘ ν•œλ‹€. +- DB ν…Œμ΄λΈ”μ— 데이터가 μ‘΄μž¬ν•œλ‹€λŠ” κ°€μ •ν•˜μ— λ¦¬νŒ©ν„°λ§ν•΄μ•Ό ν•œλ‹€. + - 즉, 기쑴에 μŒ“μΈ 데이터λ₯Ό μ œκ±°ν•˜μ§€ μ•Šμ€ μƒνƒœλ‘œ λ¦¬νŒ©ν„°λ§ ν•΄μ•Ό ν•œλ‹€. \ No newline at end of file diff --git a/src/main/java/nextstep/courses/domain/Course.java b/src/main/java/nextstep/courses/domain/Course.java index 966093b63..65516c654 100644 --- a/src/main/java/nextstep/courses/domain/Course.java +++ b/src/main/java/nextstep/courses/domain/Course.java @@ -1,47 +1,35 @@ package nextstep.courses.domain; +import nextstep.courses.domain.session.BaseEntity; import nextstep.courses.domain.session.Session; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; -public class Course { - private Long id; +public class Course extends BaseEntity { private String title; private Long creatorId; - private LocalDateTime createdAt; - - private LocalDateTime updatedAt; - private List sessions = new ArrayList<>(); - public Course() { - } public Course(String title, Long creatorId) { this(0L, title, creatorId, LocalDateTime.now(), null); } public Course(Long id, String title, Long creatorId, LocalDateTime createdAt, LocalDateTime updatedAt) { - this.id = id; + super(id, createdAt, updatedAt); this.title = title; this.creatorId = creatorId; - this.createdAt = createdAt; - this.updatedAt = updatedAt; } public void addSession(Session session) { this.sessions.add(session); } - public Long getId() { - return id; - } - public String getTitle() { return title; } @@ -50,18 +38,12 @@ public Long getCreatorId() { return creatorId; } - public LocalDateTime getCreatedAt() { - return createdAt; - } @Override public String toString() { return "Course{" + - "id=" + id + - ", title='" + title + '\'' + + " title='" + title + '\'' + ", creatorId=" + creatorId + - ", createdAt=" + createdAt + - ", updatedAt=" + updatedAt + '}'; } } diff --git a/src/main/java/nextstep/courses/domain/image/CoverImage.java b/src/main/java/nextstep/courses/domain/image/CoverImage.java index 2f16273e0..e0979eaaa 100644 --- a/src/main/java/nextstep/courses/domain/image/CoverImage.java +++ b/src/main/java/nextstep/courses/domain/image/CoverImage.java @@ -7,6 +7,7 @@ public class CoverImage { public static final double MAX_FILE_SIZE = 1024 * 1024; // 1MB private Long id; + private final long sessionId; private final long size; private final ImageType type; private final ImageDimentsion dimentsion; @@ -15,21 +16,22 @@ public CoverImage(long size, String type, int width, int height) { this(size, ImageType.fromName(type.toUpperCase()), width, height); } - public CoverImage(Long id, long size, String type, int width, int height) { - this(id, size, ImageType.fromName(type.toUpperCase()), width, height); + public CoverImage(Long id, Long sessionId, long size, String type, int width, int height) { + this(id, sessionId, size, ImageType.fromName(type.toUpperCase()), width, height); } - public CoverImage(long size, ImageType type, int width, int height) { - this(0L, size, type, new ImageDimentsion(width, height)); + public CoverImage(long size, ImageType type, int width, int height) { + this(0L, 0L, size, type, new ImageDimentsion(width, height)); } - public CoverImage(Long id, long size, ImageType type, int width, int height) { - this(id, size, type, new ImageDimentsion(width, height)); + public CoverImage(Long id, Long sessionId,long size, ImageType type, int width, int height) { + this(id, sessionId, size, type, new ImageDimentsion(width, height)); } - public CoverImage(Long id, long size, ImageType type, ImageDimentsion dimentsion) { + public CoverImage(Long id, Long sessionId, long size, ImageType type, ImageDimentsion dimentsion) { validateFileSize(size); this.id = id; + this.sessionId = sessionId; this.size = size; this.type = type; this.dimentsion = dimentsion; diff --git a/src/main/java/nextstep/courses/domain/image/CoverImageRepository.java b/src/main/java/nextstep/courses/domain/image/CoverImageRepository.java index cbe21b3a7..2c75886e3 100644 --- a/src/main/java/nextstep/courses/domain/image/CoverImageRepository.java +++ b/src/main/java/nextstep/courses/domain/image/CoverImageRepository.java @@ -1,8 +1,10 @@ package nextstep.courses.domain.image; +import java.util.List; + public interface CoverImageRepository { int save(CoverImage coverImage); - CoverImage findById(Long id); + List findBySessionId(Long id); } diff --git a/src/main/java/nextstep/courses/domain/image/CoverImages.java b/src/main/java/nextstep/courses/domain/image/CoverImages.java new file mode 100644 index 000000000..393c203a4 --- /dev/null +++ b/src/main/java/nextstep/courses/domain/image/CoverImages.java @@ -0,0 +1,34 @@ +package nextstep.courses.domain.image; + +import java.util.ArrayList; +import java.util.List; + +public class CoverImages { + + private List coverImages; + + public CoverImages() { + this.coverImages = new ArrayList<>(); + } + + public CoverImages(CoverImage... coverImage) { + this.coverImages = List.of(coverImage); + } + + public CoverImages(List coverImages) { + this.coverImages = coverImages; + } + + public void add(CoverImage coverImage) { + coverImages.add(coverImage); + } + + public int size() { + return coverImages.size(); + } + + public List getCoverImages() { + return coverImages; + } + +} diff --git a/src/main/java/nextstep/courses/domain/service/SessionService.java b/src/main/java/nextstep/courses/domain/service/SessionService.java index 34190bed5..83e86bc50 100644 --- a/src/main/java/nextstep/courses/domain/service/SessionService.java +++ b/src/main/java/nextstep/courses/domain/service/SessionService.java @@ -4,9 +4,12 @@ import nextstep.courses.domain.CourseRepository; import nextstep.courses.domain.image.CoverImage; import nextstep.courses.domain.image.CoverImageRepository; +import nextstep.courses.domain.image.CoverImages; import nextstep.courses.domain.session.Enrollment; +import nextstep.courses.domain.session.EnrollmentApply; import nextstep.courses.domain.session.Enrollments; import nextstep.courses.domain.session.Session; +import nextstep.courses.domain.session.mapper.SessionMapper; import nextstep.courses.domain.session.repository.EnrollmentRepository; import nextstep.courses.domain.session.repository.SessionRepository; import nextstep.courses.record.EnrollmentRecord; @@ -22,7 +25,7 @@ import java.util.Optional; @Service -public class SessionService { +public class SessionService { private final SessionRepository sessionRepository; private final CoverImageRepository coverImageRepository; @@ -47,26 +50,29 @@ public SessionService(SessionRepository sessionRepository, public Session findById(Long id) { SessionRecord sessionRecord = sessionRepository.findById(id); - CoverImage saveCoverImage = coverImageRepository.findById(sessionRecord.getCoverImageId()); + List saveCoverImages = coverImageRepository.findBySessionId(id); Course saveCourse = courseRepository.findById(sessionRecord.getCourseId()); List enrollmentRecords = enrollmentRepository.findBySessionId(id); Enrollments enrollments = toEnrollments(enrollmentRecords); - return sessionRecord.toSession(saveCourse, saveCoverImage, enrollments); + return SessionMapper.toDomain(sessionRecord, saveCourse, saveCoverImages, enrollments); } @Transactional public int save(Session session) { - coverImageRepository.save(session.getCoverImage()); - return sessionRepository.save(session.toSessionRecord()); + for (CoverImage coverImage : session.getCoverImages()) { + coverImageRepository.save(coverImage); + } + + return sessionRepository.save(SessionMapper.toEntity(session)); } @Transactional - public int saveEnrollment(Enrollment enrollment, Payment payment) { - SessionRecord sessionRecord = sessionRepository.findById(enrollment.getSessionId()); - List enrollmentRecords = enrollmentRepository.findBySessionId(enrollment.getSessionId()); - Session session = sessionRecord.toSession(null, null, toEnrollments(enrollmentRecords)); - session.addEnrollment(enrollment, payment); + public int saveEnrollment(NsUser user, Long sessionId, Payment payment) { + SessionRecord sessionRecord = sessionRepository.findById(sessionId); + List enrollmentRecords = enrollmentRepository.findBySessionId(sessionId); + EnrollmentApply enrollmentApply = new EnrollmentApply(toEnrollments(enrollmentRecords), payment, sessionRecord.createdSessionCore()); + Enrollment enrollment = enrollmentApply.enroll(user, sessionId); paymentRepository.save(payment); @@ -84,5 +90,4 @@ private Enrollments toEnrollments(List enrollmentRecords) { return enrollments; } - } diff --git a/src/main/java/nextstep/courses/domain/session/BaseEntity.java b/src/main/java/nextstep/courses/domain/session/BaseEntity.java new file mode 100644 index 000000000..c0ccec250 --- /dev/null +++ b/src/main/java/nextstep/courses/domain/session/BaseEntity.java @@ -0,0 +1,28 @@ +package nextstep.courses.domain.session; + +import java.time.LocalDateTime; + +public abstract class BaseEntity { + + private final Long id; + private final LocalDateTime createdAt; + private final LocalDateTime updatedAt; + + public BaseEntity(Long id, LocalDateTime createdAt, LocalDateTime updatedAt) { + this.id = id; + this.createdAt = createdAt; + this.updatedAt = updatedAt; + } + + public Long getId() { + return id; + } + + public LocalDateTime getCreatedAt() { + return createdAt; + } + + public LocalDateTime getUpdatedAt() { + return updatedAt; + } +} diff --git a/src/main/java/nextstep/courses/domain/session/Enrollment.java b/src/main/java/nextstep/courses/domain/session/Enrollment.java index 04f9263d2..1aa2de5b5 100644 --- a/src/main/java/nextstep/courses/domain/session/Enrollment.java +++ b/src/main/java/nextstep/courses/domain/session/Enrollment.java @@ -1,27 +1,40 @@ package nextstep.courses.domain.session; +import nextstep.courses.domain.session.constant.EnrollmentStatus; +import nextstep.courses.domain.session.constant.SelectionStatus; import nextstep.users.domain.NsUser; +import java.time.LocalDateTime; import java.util.Objects; -public class Enrollment { - - private final Long id; +public class Enrollment extends BaseEntity { private final NsUser user; private final Long sessionId; + private SelectionStatus selectionStatus; + private EnrollmentStatus enrollmentStatus; public Enrollment(NsUser user, Long sessionId) { - this(0L, user, sessionId); + this(user, sessionId, LocalDateTime.now(), null); } - public Enrollment(Long id, NsUser user, Long sessionId) { - this.id = id; - this.user = user; - this.sessionId = sessionId; + public Enrollment(NsUser user, Long sessionId, LocalDateTime createdAt, LocalDateTime updatedAt) { + this(0L, user, sessionId, createdAt, updatedAt, SelectionStatus.PENDING, EnrollmentStatus.WAITING); } - public Long getId() { - return id; + public Enrollment(Long id, NsUser user, Long sessionId, LocalDateTime createdAt, LocalDateTime updatedAt, String selectionStatus, String enrollmentStatus) { + this(id, user, sessionId, createdAt, updatedAt, SelectionStatus.valueOf(selectionStatus.toUpperCase()), EnrollmentStatus.valueOf(enrollmentStatus.toUpperCase())); + } + + public Enrollment(NsUser user, Long sessionId, LocalDateTime createdAt, LocalDateTime updatedAt, SelectionStatus selectionStatus, EnrollmentStatus enrollmentStatus) { + this(0L, user, sessionId, createdAt, updatedAt, selectionStatus, enrollmentStatus); + } + + public Enrollment(Long id, NsUser user, Long sessionId, LocalDateTime createdAt, LocalDateTime updatedAt, SelectionStatus selectionStatus, EnrollmentStatus enrollmentStatus) { + super(id, createdAt, updatedAt); + this.user = user; + this.sessionId = sessionId; + this.selectionStatus = selectionStatus; + this.enrollmentStatus = enrollmentStatus; } public NsUser getUser() { @@ -32,6 +45,44 @@ public Long getSessionId() { return sessionId; } + public void updateEnrollmentStatus(EnrollmentStatus enrollmentStatus) { + validateEnrollmentStatus(enrollmentStatus); + this.enrollmentStatus = enrollmentStatus; + } + + private void validateEnrollmentStatus(EnrollmentStatus enrollmentStatus) { + validateNotSeletedAndApproved(enrollmentStatus); + validateSelectedAndCancelled(enrollmentStatus); + } + + private void validateSelectedAndCancelled(EnrollmentStatus enrollmentStatus) { + if (isSelectedAndCancelled(enrollmentStatus)) { + throw new IllegalArgumentException("μ„ λ°œλœ 인원은 κ°•μ˜ μ·¨μ†Œκ°€ λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€."); + } + } + + private void validateNotSeletedAndApproved(EnrollmentStatus enrollmentStatus) { + if (isNotSelectedAndApproved(enrollmentStatus)) { + throw new IllegalArgumentException("λ―Έμ„ λ°œλœ 인원은 κ°•μ˜ 승인이 λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€."); + } + } + + private boolean isSelectedAndCancelled(EnrollmentStatus enrollmentStatus) { + return this.selectionStatus.isSelected() && enrollmentStatus.isCancled(); + } + + private boolean isNotSelectedAndApproved(EnrollmentStatus enrollmentStatus) { + return this.selectionStatus.isNotSelected() && enrollmentStatus.isApproved(); + } + + public SelectionStatus getSelectionStatus() { + return selectionStatus; + } + + public EnrollmentStatus getEnrollmentStatus() { + return enrollmentStatus; + } + @Override public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) return false; @@ -47,8 +98,7 @@ public int hashCode() { @Override public String toString() { return "Enrollment{" + - "id=" + id + - ", user=" + user + + " user=" + user + ", sessionId=" + sessionId + '}'; } diff --git a/src/main/java/nextstep/courses/domain/session/EnrollmentApply.java b/src/main/java/nextstep/courses/domain/session/EnrollmentApply.java new file mode 100644 index 000000000..9dc555707 --- /dev/null +++ b/src/main/java/nextstep/courses/domain/session/EnrollmentApply.java @@ -0,0 +1,36 @@ +package nextstep.courses.domain.session; + +import nextstep.payments.domain.Payment; +import nextstep.users.domain.NsUser; + +import java.time.LocalDateTime; +import java.util.List; + +public class EnrollmentApply { + private SessionCore sessionCore; + private Payment payment; + private Enrollments enrollments; + + public EnrollmentApply(Enrollments enrollments, Payment payment, SessionCore sessionCore) { + this.enrollments = enrollments; + this.payment = payment; + this.sessionCore = sessionCore; + } + + public Enrollment enroll(NsUser user, Long sessionId) { + sessionCore.validatePaymentAmount(payment); + sessionCore.validateNotFull(this.enrollments); + sessionCore.validateSessionStatus(); + sessionCore.validateRecruitmentStatus(); + enrollments.validateNotDuplicate(new Enrollment(user, sessionId)); + + Enrollment enrollment = new Enrollment(user, sessionId, LocalDateTime.now(), null); + enrollments.add(enrollment); + + return enrollment; + } + + public List getEnrollments() { + return enrollments.getEnrollments(); + } +} diff --git a/src/main/java/nextstep/courses/domain/session/Enrollments.java b/src/main/java/nextstep/courses/domain/session/Enrollments.java index 9d39202ea..df51d596e 100644 --- a/src/main/java/nextstep/courses/domain/session/Enrollments.java +++ b/src/main/java/nextstep/courses/domain/session/Enrollments.java @@ -2,11 +2,22 @@ import java.util.ArrayList; import java.util.List; +import java.util.Objects; public class Enrollments { private final List enrollments = new ArrayList<>(); + public Enrollments() {} + + public Enrollments(Enrollment... enrollment) { + this.enrollments.addAll(List.of(enrollment)); + } + + public Enrollments(List enrollments) { + this.enrollments.addAll(enrollments); + } + public void add(Enrollment enrollment) { validateNotDuplicate(enrollment); this.enrollments.add(enrollment); @@ -16,7 +27,7 @@ public int size() { return this.enrollments.size(); } - private void validateNotDuplicate(Enrollment enrollment) { + public void validateNotDuplicate(Enrollment enrollment) { if (this.enrollments.contains(enrollment)) { throw new IllegalArgumentException("이미 μ‹ μ²­ν•œ κ°•μ˜μž…λ‹ˆλ‹€."); } diff --git a/src/main/java/nextstep/courses/domain/session/Session.java b/src/main/java/nextstep/courses/domain/session/Session.java index 37c53f627..d5b3f8957 100644 --- a/src/main/java/nextstep/courses/domain/session/Session.java +++ b/src/main/java/nextstep/courses/domain/session/Session.java @@ -2,23 +2,22 @@ import nextstep.courses.domain.Course; import nextstep.courses.domain.image.CoverImage; +import nextstep.courses.domain.image.CoverImages; +import nextstep.courses.domain.session.constant.SessionRecruitmentStatus; import nextstep.courses.domain.session.constant.SessionStatus; import nextstep.courses.domain.session.constant.SessionType; -import nextstep.courses.record.SessionRecord; import nextstep.payments.domain.Payment; import java.time.LocalDateTime; import java.util.List; import java.util.Objects; -public class Session extends SessionCore { +public class Session extends BaseEntity { - private final Long id; private Course course; - private final CoverImage coverImage; + private CoverImages coverImages; private final Enrollments enrollments; - private LocalDateTime createdAt; - private LocalDateTime updatedAt; + private final SessionCore sessionCore; public Session(Long id, LocalDateTime startDate, LocalDateTime endDate, String sessionType, String sessionStatus, CoverImage coverImage) { this(id, startDate, endDate, sessionType, Integer.MAX_VALUE, 0L, sessionStatus, coverImage); @@ -37,90 +36,67 @@ public Session(Long id, SessionRange sessionRange, SessionType sessionType, Capa } public Session(Long id, SessionRange sessionRange, SessionPolicy sessionPolicy, SessionStatus sessionStatus, CoverImage coverImage) { - this(id, null, sessionRange, sessionPolicy, sessionStatus, coverImage, new Enrollments(), LocalDateTime.now(), null); + this(id, null, new CoverImages(coverImage), new Enrollments(), LocalDateTime.now(), null, new SessionCore(sessionRange, sessionPolicy, sessionStatus, SessionRecruitmentStatus.RECRUITING)); } - public Session(Long id, Course course, SessionRange sessionRange, SessionPolicy sessionPolicy, SessionStatus sessionStatus, CoverImage coverImage, Enrollments enrollments) { - this(id, course, sessionRange, sessionPolicy, sessionStatus, coverImage, enrollments, LocalDateTime.now(), null); + public Session(Long id, Course course, SessionRange sessionRange, SessionPolicy sessionPolicy, SessionStatus sessionStatus, List coverImages, Enrollments enrollments, SessionRecruitmentStatus sessionRecruitmentStatus) { + this(id, course, new CoverImages(coverImages), enrollments, LocalDateTime.now(), null, new SessionCore(sessionRange, sessionPolicy, sessionStatus, sessionRecruitmentStatus)); } - public Session(Long id, Course course, SessionRange sessionRange, SessionPolicy sessionPolicy, SessionStatus sessionStatus, CoverImage coverImage, Enrollments enrollments, LocalDateTime createdAt, LocalDateTime updatedAt) { - super(sessionRange, sessionPolicy, sessionStatus); - this.id = id; + public Session(Long id, Course course, CoverImages coverImages, Enrollments enrollments, LocalDateTime createdAt, LocalDateTime updatedAt, SessionCore sessionCore) { + super(id, createdAt, updatedAt); this.course = course; - this.coverImage = coverImage; + this.coverImages = coverImages; this.enrollments = enrollments; - this.createdAt = createdAt; - this.updatedAt = updatedAt; + this.sessionCore = sessionCore; } + public void addEnrollment(Enrollment enrollment, Payment payment) { - validatePaymentAmount(payment); - validateNotFull(this.enrollments); - validateSessionStatus(); + sessionCore.validatePaymentAmount(payment); + sessionCore.validateNotFull(this.enrollments); + sessionCore.validateSessionStatus(); + sessionCore.validateRecruitmentStatus(); this.enrollments.add(enrollment); } - public Long getId() { - return id; - } public Course getCourse() { return course; } - public CoverImage getCoverImage() { - return coverImage; - } - - public LocalDateTime getCreatedAt() { - return createdAt; + public List getCoverImages() { + return coverImages.getCoverImages(); } - public LocalDateTime getUpdatedAt() { - return updatedAt; + public SessionCore getSessionCore() { + return sessionCore; } public List getEnrollments() { return enrollments.getEnrollments(); } - public SessionRecord toSessionRecord() { - return new SessionRecord( - this.id, - this.course.getId(), - this.coverImage.getId(), - this.getSessionRange().getStartDate(), - this.getSessionRange().getEndDate(), - this.getMaxCapacity(), - this.getTuition(), - this.getSessionType(), - this.getSessionStatus().toString(), - this.createdAt, - this.updatedAt - ); - } @Override public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) return false; Session session = (Session) o; - return Objects.equals(id, session.id) && Objects.equals(coverImage, session.coverImage) && Objects.equals(enrollments, session.enrollments); + return Objects.equals(getCourse(), session.getCourse()) && Objects.equals(getCoverImages(), session.getCoverImages()) && Objects.equals(getEnrollments(), session.getEnrollments()) && Objects.equals(getSessionCore(), session.getSessionCore()); } @Override public int hashCode() { - return Objects.hash(id, coverImage, enrollments); + return Objects.hash(getCourse(), getCoverImages(), getEnrollments(), getSessionCore()); } @Override public String toString() { return "Session{" + - "id=" + id + - ", coverImage=" + coverImage + + "course=" + course + + ", coverImages=" + coverImages + ", enrollments=" + enrollments + + ", sessionCore=" + sessionCore + '}'; } - - } diff --git a/src/main/java/nextstep/courses/domain/session/SessionCore.java b/src/main/java/nextstep/courses/domain/session/SessionCore.java index ab5040a75..2aeb15fe0 100644 --- a/src/main/java/nextstep/courses/domain/session/SessionCore.java +++ b/src/main/java/nextstep/courses/domain/session/SessionCore.java @@ -1,38 +1,46 @@ package nextstep.courses.domain.session; +import nextstep.courses.domain.session.constant.SessionRecruitmentStatus; import nextstep.courses.domain.session.constant.SessionStatus; import nextstep.payments.domain.Payment; import java.time.LocalDateTime; - -public abstract class SessionCore { +public class SessionCore { private final SessionRange sessionRange; private final SessionPolicy sessionPolicy; private final SessionStatus sessionStatus; + private final SessionRecruitmentStatus sessionRecruitmentStatus; - public SessionCore(SessionRange sessionRange, SessionPolicy sessionPolicy, SessionStatus sessionStatus) { + public SessionCore(SessionRange sessionRange, SessionPolicy sessionPolicy, SessionStatus sessionStatus, SessionRecruitmentStatus sessionRecruitmentStatus) { this.sessionRange = sessionRange; this.sessionPolicy = sessionPolicy; this.sessionStatus = sessionStatus; + this.sessionRecruitmentStatus = sessionRecruitmentStatus; } - protected void validatePaymentAmount(Payment payment) { + public void validatePaymentAmount(Payment payment) { if (this.sessionPolicy.isSessionType()) { sessionPolicy.matchAmount(payment); } } - protected void validateNotFull(Enrollments enrollments) { + public void validateNotFull(Enrollments enrollments) { if (this.sessionPolicy.matchSize(enrollments.size())) { throw new IllegalArgumentException("μˆ˜κ°•μΈμ›μ΄ μ΄ˆκ³Όν–ˆμŠ΅λ‹ˆλ‹€."); } } - protected void validateSessionStatus() { - if (!this.sessionStatus.equals(SessionStatus.ACTIVE)) { - throw new IllegalArgumentException("ν˜„μž¬λŠ” κ°•μ˜ λͺ¨μ§‘쀑이 μ•„λ‹™λ‹ˆλ‹€."); + public void validateSessionStatus() { + if (this.sessionStatus.equals(SessionStatus.FINISHED)) { + throw new IllegalArgumentException("μ’…λ£Œλœ κ°•μ˜μž…λ‹ˆλ‹€."); + } + } + + public void validateRecruitmentStatus() { + if(this.sessionRecruitmentStatus.equals(SessionRecruitmentStatus.NOT_RECRUITING)) { + throw new IllegalArgumentException("ν˜„μž¬λŠ” λͺ¨μ§‘기간이 μ•„λ‹™λ‹ˆλ‹€."); } } @@ -67,4 +75,8 @@ public SessionRange getSessionRange() { public SessionStatus getSessionStatus() { return sessionStatus; } + + public SessionRecruitmentStatus getSessionRecruitmentStatus() { + return sessionRecruitmentStatus; + } } diff --git a/src/main/java/nextstep/courses/domain/session/constant/EnrollmentStatus.java b/src/main/java/nextstep/courses/domain/session/constant/EnrollmentStatus.java new file mode 100644 index 000000000..8364fc25d --- /dev/null +++ b/src/main/java/nextstep/courses/domain/session/constant/EnrollmentStatus.java @@ -0,0 +1,34 @@ +package nextstep.courses.domain.session.constant; + +import java.util.Arrays; + +public enum EnrollmentStatus { + WAITING("λŒ€κΈ°"), + APPROVED("승인"), + CANCELLED("μ·¨μ†Œ"); + + private final String value; + + EnrollmentStatus(String value) { + this.value = value; + } + + public static EnrollmentStatus from(String name){ + return Arrays.stream(EnrollmentStatus.values()) + .filter(status -> status.matchStatus(name)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("μƒνƒœλͺ…을 잘λͺ» μž…λ ₯ν•˜μ˜€μŠ΅λ‹ˆλ‹€.")); + } + + private boolean matchStatus(String value) { + return this.value.equals(value); + } + + public boolean isCancled() { + return this.equals(CANCELLED); + } + + public boolean isApproved() { + return this.equals(APPROVED); + } +} diff --git a/src/main/java/nextstep/courses/domain/session/constant/SelectionStatus.java b/src/main/java/nextstep/courses/domain/session/constant/SelectionStatus.java new file mode 100644 index 000000000..6ff9c292d --- /dev/null +++ b/src/main/java/nextstep/courses/domain/session/constant/SelectionStatus.java @@ -0,0 +1,38 @@ +package nextstep.courses.domain.session.constant; + +import java.util.Arrays; + +public enum SelectionStatus { + PENDING("μ„ λ°œ λŒ€κΈ°"), + SELECTED("μ„ λ°œ"), + NOT_SELECTED("λ―Έμ„ λ°œ"); + + private final String value; + + SelectionStatus(String value) { + this.value = value; + } + + public String getValue() { + return value; + } + + public static SelectionStatus from(String name) { + return Arrays.stream(SelectionStatus.values()) + .filter(status -> status.matchStatus(name)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("μƒνƒœλͺ…을 잘λͺ» μž…λ ₯ν•˜μ˜€μŠ΅λ‹ˆλ‹€.")); + } + + private boolean matchStatus(String value) { + return this.value.equals(value); + } + + public boolean isSelected() { + return this.equals(SELECTED); + } + + public boolean isNotSelected() { + return this.equals(NOT_SELECTED); + } +} diff --git a/src/main/java/nextstep/courses/domain/session/constant/SessionRecruitmentStatus.java b/src/main/java/nextstep/courses/domain/session/constant/SessionRecruitmentStatus.java new file mode 100644 index 000000000..3e93293ac --- /dev/null +++ b/src/main/java/nextstep/courses/domain/session/constant/SessionRecruitmentStatus.java @@ -0,0 +1,28 @@ +package nextstep.courses.domain.session.constant; + +import java.util.Arrays; + +public enum SessionRecruitmentStatus { + + NOT_RECRUITING("λΉ„λͺ¨μ§‘쀑"), + RECRUITING("λͺ¨μ§‘쀑"); + + private String status; + + SessionRecruitmentStatus(String status) { + this.status = status; + } + + + public static SessionRecruitmentStatus from(String value) { + return Arrays.stream(SessionRecruitmentStatus.values()) + .filter(status -> status.matchStatus(value)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("λͺ¨μ§‘쀑, λΉ„λͺ¨μ§‘쀑 2κ°€μ§€ μƒνƒœλ‘œλ§Œ 생성 κ°€λŠ₯ν•©λ‹ˆλ‹€.")); + } + + private boolean matchStatus(String value) { + return this.name().equals(value); + } + +} diff --git a/src/main/java/nextstep/courses/domain/session/constant/SessionStatus.java b/src/main/java/nextstep/courses/domain/session/constant/SessionStatus.java index d35253271..db813a472 100644 --- a/src/main/java/nextstep/courses/domain/session/constant/SessionStatus.java +++ b/src/main/java/nextstep/courses/domain/session/constant/SessionStatus.java @@ -11,7 +11,7 @@ public static SessionStatus from(String value) { return Arrays.stream(SessionStatus.values()) .filter(status -> status.matchStatus(value)) .findFirst() - .orElseThrow(() -> new IllegalArgumentException("쀀비쀑, λͺ¨μ§‘쀑, μ’…λ£Œ 3κ°€μ§€ μƒνƒœλ‘œλ§Œ 생성 κ°€λŠ₯ν•©λ‹ˆλ‹€.")); + .orElseThrow(() -> new IllegalArgumentException("쀀비쀑, 진행쀑, μ’…λ£Œ 3κ°€μ§€ μƒνƒœλ‘œλ§Œ 생성 κ°€λŠ₯ν•©λ‹ˆλ‹€.")); } private boolean matchStatus(String value) { diff --git a/src/main/java/nextstep/courses/domain/session/mapper/EnrollmentMapper.java b/src/main/java/nextstep/courses/domain/session/mapper/EnrollmentMapper.java new file mode 100644 index 000000000..aca34b4aa --- /dev/null +++ b/src/main/java/nextstep/courses/domain/session/mapper/EnrollmentMapper.java @@ -0,0 +1,34 @@ +package nextstep.courses.domain.session.mapper; + +import nextstep.courses.domain.session.Enrollment; +import nextstep.courses.domain.session.constant.EnrollmentStatus; +import nextstep.courses.domain.session.constant.SelectionStatus; +import nextstep.courses.record.EnrollmentRecord; +import nextstep.users.domain.NsUser; + +public class EnrollmentMapper { + + public static EnrollmentRecord toEntity(Enrollment enrollment) { + return new EnrollmentRecord( + enrollment.getId(), + enrollment.getUser().getId(), + enrollment.getSessionId(), + enrollment.getSelectionStatus().name(), + enrollment.getEnrollmentStatus().name(), + enrollment.getCreatedAt(), + enrollment.getUpdatedAt() + ); + } + + public static Enrollment toDomain(EnrollmentRecord record, NsUser user) { + return new Enrollment( + record.getId(), + user, + record.getSessionId(), + record.getCreatedAt(), + record.getUpdatedAt(), + SelectionStatus.from(record.getEnrollmentStatus()), + EnrollmentStatus.from(record.getEnrollmentStatus()) + ); + } +} diff --git a/src/main/java/nextstep/courses/domain/session/mapper/SessionMapper.java b/src/main/java/nextstep/courses/domain/session/mapper/SessionMapper.java new file mode 100644 index 000000000..7cce76b27 --- /dev/null +++ b/src/main/java/nextstep/courses/domain/session/mapper/SessionMapper.java @@ -0,0 +1,43 @@ +package nextstep.courses.domain.session.mapper; + +import nextstep.courses.domain.Course; +import nextstep.courses.domain.image.CoverImage; +import nextstep.courses.domain.session.Enrollments; +import nextstep.courses.domain.session.Session; +import nextstep.courses.domain.session.constant.SessionRecruitmentStatus; +import nextstep.courses.domain.session.constant.SessionStatus; +import nextstep.courses.record.SessionRecord; + +import java.util.List; + +public class SessionMapper { + + public static SessionRecord toEntity(Session session) { + return new SessionRecord( + session.getId(), + session.getCourse().getId(), + session.getSessionCore().getStartDate(), + session.getSessionCore().getEndDate(), + session.getSessionCore().getMaxCapacity(), + session.getSessionCore().getTuition(), + session.getSessionCore().getSessionType(), + session.getSessionCore().getSessionStatus().name(), + session.getSessionCore().getSessionRecruitmentStatus().name(), + session.getCreatedAt(), + session.getUpdatedAt() + ); + } + + public static Session toDomain(SessionRecord record, Course course, List coverImages, Enrollments enrollments) { + return new Session( + record.getId(), + course, + record.createdSessionRange(), + record.createdSessionPolicy(), + SessionStatus.from(record.getSessionStatus()), + coverImages, + enrollments, + SessionRecruitmentStatus.from(record.getRecruitmentStatus()) + ); + } +} diff --git a/src/main/java/nextstep/courses/infrastructure/JdbcCoverImageRespository.java b/src/main/java/nextstep/courses/infrastructure/JdbcCoverImageRespository.java index 898069a63..3308d0b18 100644 --- a/src/main/java/nextstep/courses/infrastructure/JdbcCoverImageRespository.java +++ b/src/main/java/nextstep/courses/infrastructure/JdbcCoverImageRespository.java @@ -5,6 +5,9 @@ import org.springframework.jdbc.core.JdbcOperations; import org.springframework.stereotype.Repository; +import java.util.Collections; +import java.util.List; + @Repository("coverImageRepository") public class JdbcCoverImageRespository implements CoverImageRepository { private JdbcOperations jdbcTemplate; @@ -24,16 +27,17 @@ public int save(CoverImage coverImage) { } @Override - public CoverImage findById(Long id) { - String sql = "select * from cover_image where id = ?"; - return jdbcTemplate.queryForObject(sql, (rs, rowNum) -> { + public List findBySessionId(Long sessionId) { + String sql = "select * from cover_image where session_id = ?"; + return jdbcTemplate.query(sql, (rs, rowNum) -> { return new CoverImage( rs.getLong("id"), + rs.getLong("session_id"), rs.getLong("size"), rs.getString("type"), rs.getInt("width"), rs.getInt("height") ); - }, id); + }, sessionId); } } diff --git a/src/main/java/nextstep/courses/infrastructure/JdbcEnrollmentRespository.java b/src/main/java/nextstep/courses/infrastructure/JdbcEnrollmentRespository.java index 2cc762205..ccd5cc43c 100644 --- a/src/main/java/nextstep/courses/infrastructure/JdbcEnrollmentRespository.java +++ b/src/main/java/nextstep/courses/infrastructure/JdbcEnrollmentRespository.java @@ -6,6 +6,8 @@ import org.springframework.jdbc.core.JdbcOperations; import org.springframework.stereotype.Repository; +import java.sql.Timestamp; +import java.time.LocalDateTime; import java.util.List; @Repository("enrollmentRepository") @@ -19,8 +21,15 @@ public JdbcEnrollmentRespository(JdbcOperations jdbcTemplate) { @Override public int save(Enrollment enrollment) { - String sql = "insert into enrollment (session_id, user_id) values (?, ?)"; - return jdbcTemplate.update(sql, enrollment.getSessionId(), enrollment.getUser().getId()); + String sql = "insert into enrollment (session_id, user_id, selection_status, enrollment_status, created_at)" + + " values (?, ?, ?, ?, ?)"; + return jdbcTemplate.update(sql, + enrollment.getSessionId(), + enrollment.getUser().getId(), + enrollment.getSelectionStatus().name(), + enrollment.getEnrollmentStatus().name(), + enrollment.getCreatedAt() + ); } @Override @@ -30,8 +39,19 @@ public List findBySessionId(Long sessionId) { return new EnrollmentRecord( rs.getLong("id"), rs.getLong("user_id"), - rs.getLong("session_id") + rs.getLong("session_id"), + rs.getString("selection_status"), + rs.getString("enrollment_status"), + toLocalDateTime(rs.getTimestamp("created_at")), + toLocalDateTime(rs.getTimestamp("updated_at")) ); }, sessionId); } + + private LocalDateTime toLocalDateTime(Timestamp timestamp) { + if (timestamp == null) { + return null; + } + return timestamp.toLocalDateTime(); + } } diff --git a/src/main/java/nextstep/courses/infrastructure/JdbcSessionRespository.java b/src/main/java/nextstep/courses/infrastructure/JdbcSessionRespository.java index 444d4348a..70c12dd36 100644 --- a/src/main/java/nextstep/courses/infrastructure/JdbcSessionRespository.java +++ b/src/main/java/nextstep/courses/infrastructure/JdbcSessionRespository.java @@ -19,17 +19,17 @@ public JdbcSessionRespository(JdbcOperations jdbcTemplate) { @Override public int save(SessionRecord sessionRecord) { String sql = "insert into session" + - " (course_id, cover_image_id, start_date, end_date, max_capacity, tuition, session_type, session_status, created_at)" + + " (course_id, start_date, end_date, max_capacity, tuition, session_type, session_status, recruitment_status, created_at)" + " values (?, ?, ?, ?, ?, ?, ?, ?, ?)"; return jdbcTemplate.update(sql, sessionRecord.getCourseId(), - sessionRecord.getCoverImageId(), sessionRecord.getStartDate(), sessionRecord.getEndDate(), sessionRecord.getMaxCapacity(), sessionRecord.getTuition(), sessionRecord.getSessionType(), sessionRecord.getSessionStatus(), + sessionRecord.getRecruitmentStatus(), sessionRecord.getCreatedAt()); } @@ -40,13 +40,13 @@ public SessionRecord findById(Long id) { return new SessionRecord( rs.getLong("id"), rs.getLong("course_id"), - rs.getLong("cover_image_id"), toLocalDateTime(rs.getTimestamp("start_date")), toLocalDateTime(rs.getTimestamp("end_date")), rs.getInt("max_capacity"), rs.getLong("tuition"), rs.getString("session_type"), rs.getString("session_status"), + rs.getString("recruitment_status"), toLocalDateTime(rs.getTimestamp("created_at")), toLocalDateTime(rs.getTimestamp("updated_at")) ); diff --git a/src/main/java/nextstep/courses/record/EnrollmentRecord.java b/src/main/java/nextstep/courses/record/EnrollmentRecord.java index bfac04bf9..7eae8cd0b 100644 --- a/src/main/java/nextstep/courses/record/EnrollmentRecord.java +++ b/src/main/java/nextstep/courses/record/EnrollmentRecord.java @@ -1,22 +1,36 @@ package nextstep.courses.record; import nextstep.courses.domain.session.Enrollment; +import nextstep.courses.domain.session.constant.EnrollmentStatus; +import nextstep.courses.domain.session.constant.SelectionStatus; import nextstep.users.domain.NsUser; +import java.time.LocalDateTime; + public class EnrollmentRecord { private Long id; private Long userId; private Long sessionId; + private String selectionStatus; + private String enrollmentStatus; + private LocalDateTime createdAt; + private LocalDateTime updatedAt; - public EnrollmentRecord(Long id, Long userId, Long sessionId) { + public EnrollmentRecord(Long id, Long userId, Long sessionId, String selectionStatus, String enrollmentStatus, LocalDateTime createdAt, LocalDateTime updatedAt) { this.id = id; this.userId = userId; this.sessionId = sessionId; + this.selectionStatus = selectionStatus; + this.enrollmentStatus = enrollmentStatus; + this.createdAt = createdAt; + this.updatedAt = updatedAt; } public Enrollment toEnrollment(NsUser user) { - return new Enrollment(this.id, user, this.sessionId); + return new Enrollment(this.id, user, this.sessionId, + this.createdAt, this.updatedAt, + this.selectionStatus, this.enrollmentStatus); } public Long getId() { @@ -30,4 +44,20 @@ public Long getUserId() { public Long getSessionId() { return sessionId; } + + public String getSelectionStatus() { + return selectionStatus; + } + + public String getEnrollmentStatus() { + return enrollmentStatus; + } + + public LocalDateTime getCreatedAt() { + return createdAt; + } + + public LocalDateTime getUpdatedAt() { + return updatedAt; + } } diff --git a/src/main/java/nextstep/courses/record/SessionRecord.java b/src/main/java/nextstep/courses/record/SessionRecord.java index 51d1e893e..300413e5a 100644 --- a/src/main/java/nextstep/courses/record/SessionRecord.java +++ b/src/main/java/nextstep/courses/record/SessionRecord.java @@ -1,63 +1,67 @@ package nextstep.courses.record; -import nextstep.courses.domain.Course; -import nextstep.courses.domain.image.CoverImage; import nextstep.courses.domain.session.*; +import nextstep.courses.domain.session.constant.SessionRecruitmentStatus; import nextstep.courses.domain.session.constant.SessionStatus; import java.time.LocalDateTime; +import java.util.List; public class SessionRecord { private Long id; private Long courseId; - private Long coverImageId; private LocalDateTime startDate; private LocalDateTime endDate; private int maxCapacity; private Long tuition; private String sessionType; private String sessionStatus; + private String recruitmentStatus; private LocalDateTime createdAt; private LocalDateTime updatedAt; - public SessionRecord(Long id, Long courseId, Long coverImageId, + public SessionRecord(Long id, Long courseId, LocalDateTime startDate, LocalDateTime endDate, int maxCapacity, Long tuition, - String sessionType, String sessionStatus, + String sessionType, String sessionStatus, String recruitmentStatus, LocalDateTime createdAt, LocalDateTime updatedAt) { this.id = id; this.courseId = courseId; - this.coverImageId = coverImageId; this.startDate = startDate; this.endDate = endDate; this.maxCapacity = maxCapacity; this.tuition = tuition; this.sessionType = sessionType; this.sessionStatus = sessionStatus; + this.recruitmentStatus = recruitmentStatus; this.createdAt = createdAt; this.updatedAt = updatedAt; } - public Session toSession(Course course, CoverImage coverImage, Enrollments enrollments) { - return new Session(this.id, course, createdSessionRange(), createdSessionPolicy(), - SessionStatus.from(this.sessionStatus), coverImage, enrollments); - } - - private SessionRange createdSessionRange() { + public SessionRange createdSessionRange() { return new SessionRange(this.startDate, this.endDate); } - private SessionPolicy createdSessionPolicy() { + public SessionPolicy createdSessionPolicy() { return new SessionPolicy(this.maxCapacity, this.tuition, this.sessionType); } - public Long getCourseId() { - return courseId; + public SessionCore createdSessionCore() { + return new SessionCore( + createdSessionRange(), + createdSessionPolicy(), + SessionStatus.from(this.sessionStatus), + SessionRecruitmentStatus.from(this.recruitmentStatus) + ); } - public Long getCoverImageId() { - return coverImageId; + public Long getId() { + return id; + } + + public Long getCourseId() { + return courseId; } public int getMaxCapacity() { @@ -91,4 +95,9 @@ public LocalDateTime getCreatedAt() { public LocalDateTime getUpdatedAt() { return updatedAt; } + + public String getRecruitmentStatus() { + return recruitmentStatus; + } + } diff --git a/src/main/resources/data.sql b/src/main/resources/data.sql index 26559d7a5..a777f6c5d 100644 --- a/src/main/resources/data.sql +++ b/src/main/resources/data.sql @@ -11,13 +11,13 @@ INSERT INTO question (id, writer_id, title, contents, created_at, deleted) VALUE INSERT INTO course (id, title, creator_id, created_at) VALUES (1, 'TDD, 클린 μ½”λ“œ with Java', 1, CURRENT_TIMESTAMP()); -INSERT INTO session(id, course_id, cover_image_id, start_date, end_date, max_capacity, tuition, session_type, session_status, created_at) -VALUES (1, 1, 1,CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP(), 100, 300000, 'PAID', 'ACTIVE', CURRENT_TIMESTAMP() ); +INSERT INTO session(id, course_id, start_date, end_date, max_capacity, tuition, session_type, session_status, created_at) +VALUES (1, 1, CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP(), 100, 300000, 'PAID', 'ACTIVE', CURRENT_TIMESTAMP() ); -INSERT INTO session(id, course_id, cover_image_id, start_date, end_date, max_capacity, tuition, session_type, session_status, created_at) -VALUES (2, 1, 1,CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP(), 100, 300000, 'PAID', 'ACTIVE', CURRENT_TIMESTAMP() ); +INSERT INTO session(id, course_id, start_date, end_date, max_capacity, tuition, session_type, session_status, created_at) +VALUES (2, 1,CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP(), 100, 300000, 'PAID', 'ACTIVE', CURRENT_TIMESTAMP() ); -INSERT INTO cover_image (id, size, type, width, height) VALUES (1, 1, 'png', 300, 200); +INSERT INTO cover_image (id, session_id, size, type, width, height) VALUES (1, 1, 1, 'png', 300, 200); -INSERT INTO enrollment (id, user_id, session_id) VALUES (1, 1, 1); -INSERT INTO enrollment (id, user_id, session_id) VALUES (2, 2, 1); \ No newline at end of file +INSERT INTO enrollment (id, user_id, session_id, selection_status, enrollment_status, created_at) VALUES (1, 1, 1, 'PENDING','WAITING',CURRENT_TIMESTAMP()); +INSERT INTO enrollment (id, user_id, session_id, selection_status, enrollment_status, created_at) VALUES (2, 2, 1, 'SELECTED','WAITING',CURRENT_TIMESTAMP()); \ No newline at end of file diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql index 842cfb707..d1292ab99 100644 --- a/src/main/resources/schema.sql +++ b/src/main/resources/schema.sql @@ -52,13 +52,14 @@ create table delete_history ( create table session ( id bigint not null generated by default as identity(start with 1000), course_id bigint not null, - cover_image_id bigint, start_date timestamp not null, end_date timestamp not null, max_capacity int not null, tuition bigint not null, + recruit varchar(30), session_type varchar(30), session_status varchar(30), + recruitment_status varchar(30), created_at timestamp not null, updated_at timestamp, primary key (id) @@ -66,6 +67,7 @@ create table session ( create table cover_image ( id bigint not null generated by default as identity(start with 1000), + session_id bigint not null, size bigint, type varchar(30), width int, @@ -77,6 +79,10 @@ create table enrollment ( id bigint not null generated by default as identity(start with 1000), session_id bigint not null, user_id bigint not null, + selection_status varchar(30), + enrollment_status varchar(30), + created_at timestamp not null, + updated_at timestamp, primary key (id) ); diff --git a/src/test/java/nextstep/courses/domain/image/CoverImagesTest.java b/src/test/java/nextstep/courses/domain/image/CoverImagesTest.java new file mode 100644 index 000000000..a1f82f62b --- /dev/null +++ b/src/test/java/nextstep/courses/domain/image/CoverImagesTest.java @@ -0,0 +1,19 @@ +package nextstep.courses.domain.image; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; + + +class CoverImagesTest { + + @Test + void μ—¬λŸ¬_이미지_등둝(){ + CoverImages coverImages = new CoverImages(); + CoverImage coverImage = new CoverImage(1L, "png", 300, 200); + CoverImage coverImage2 = new CoverImage(1L, "png", 300, 200); + coverImages.add(coverImage); + coverImages.add(coverImage2); + Assertions.assertThat(coverImages.size()).isEqualTo(2); + } + +} \ No newline at end of file diff --git a/src/test/java/nextstep/courses/domain/session/EnrollmentApplyTest.java b/src/test/java/nextstep/courses/domain/session/EnrollmentApplyTest.java new file mode 100644 index 000000000..fffe674ac --- /dev/null +++ b/src/test/java/nextstep/courses/domain/session/EnrollmentApplyTest.java @@ -0,0 +1,28 @@ +package nextstep.courses.domain.session; + +import nextstep.courses.domain.session.builder.SessionBuilder; +import nextstep.payments.domain.Payment; +import nextstep.users.domain.NsUser; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.*; + + +public class EnrollmentApplyTest { + + private NsUser U1 = new NsUser(1L, "chanani", "password", "μ΄μ°¬ν•œ", "aa@aa.aa"); + private Session S1 = new SessionBuilder().build(); + + @Test + void μˆ˜κ°•μ‹ μ²­_κ°€λŠ₯(){ + EnrollmentApply enrollmentApply = new EnrollmentApply( + new Enrollments(), + new Payment(1L, 1L, 300_000L), + S1.getSessionCore() + ); + + Enrollment enrollment = enrollmentApply.enroll(U1, 1L); + + assertThat(enrollment.getSessionId()).isEqualTo(1L); + } +} diff --git a/src/test/java/nextstep/courses/domain/session/EnrollmentTest.java b/src/test/java/nextstep/courses/domain/session/EnrollmentTest.java index 977f22349..ad886690f 100644 --- a/src/test/java/nextstep/courses/domain/session/EnrollmentTest.java +++ b/src/test/java/nextstep/courses/domain/session/EnrollmentTest.java @@ -1,16 +1,49 @@ package nextstep.courses.domain.session; +import nextstep.courses.domain.session.builder.EnrollmentBuilder; +import nextstep.courses.domain.session.constant.EnrollmentStatus; +import nextstep.courses.domain.session.constant.SelectionStatus; import nextstep.users.domain.NsUserTest; import org.junit.jupiter.api.Test; +import java.time.LocalDateTime; + import static org.assertj.core.api.Assertions.*; class EnrollmentTest { @Test void μˆ˜κ°•μ‹ μ²­_정상_생성() { - Enrollment enrollment = new Enrollment(NsUserTest.JAVAJIGI, 1L); + Enrollment enrollment = new Enrollment(NsUserTest.JAVAJIGI, 1L, LocalDateTime.now(), null); assertThat(enrollment).isNotNull(); } + @Test + void μ„ λ°œλœμΈμ›_μˆ˜κ°•μ‹ μ²­_승인(){ + Enrollment enrollment = new EnrollmentBuilder().withSelectionStatus(SelectionStatus.from("μ„ λ°œ")).build(); + enrollment.updateEnrollmentStatus(EnrollmentStatus.from("승인")); + assertThat(enrollment.getEnrollmentStatus()).isEqualTo(EnrollmentStatus.from("승인")); + } + + @Test + void λ―Έμ„ λ°œμΈμ›_μŠΉμΈμ‹œ_μ—λŸ¬λ°œμƒ(){ + Enrollment enrollment = new EnrollmentBuilder().withSelectionStatus(SelectionStatus.from("λ―Έμ„ λ°œ")).build(); + assertThatThrownBy(() -> enrollment.updateEnrollmentStatus(EnrollmentStatus.from("승인"))) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + void λ―Έμ„ λ°œμΈμ›_μˆ˜κ°•μ·¨μ†Œ(){ + Enrollment enrollment = new EnrollmentBuilder().withSelectionStatus(SelectionStatus.from("λ―Έμ„ λ°œ")).build(); + enrollment.updateEnrollmentStatus(EnrollmentStatus.from("μ·¨μ†Œ")); + assertThat(enrollment.getEnrollmentStatus()).isEqualTo(EnrollmentStatus.from("μ·¨μ†Œ")); + } + + @Test + void μ„ λ°œμΈμ›_μˆ˜κ°•μ·¨μ†Œ_μ—λŸ¬λ°œμƒ(){ + Enrollment enrollment = new EnrollmentBuilder().withSelectionStatus(SelectionStatus.from("μ„ λ°œ")).build(); + assertThatThrownBy(() -> enrollment.updateEnrollmentStatus(EnrollmentStatus.from("μ·¨μ†Œ"))) + .isInstanceOf(IllegalArgumentException.class); + } + } \ No newline at end of file diff --git a/src/test/java/nextstep/courses/domain/session/EnrollmentsTest.java b/src/test/java/nextstep/courses/domain/session/EnrollmentsTest.java index d7cc00e32..d9d651fcb 100644 --- a/src/test/java/nextstep/courses/domain/session/EnrollmentsTest.java +++ b/src/test/java/nextstep/courses/domain/session/EnrollmentsTest.java @@ -6,11 +6,12 @@ import nextstep.payments.domain.Payment; import org.junit.jupiter.api.Test; - import static org.assertj.core.api.Assertions.assertThatThrownBy; class EnrollmentsTest { + private static final Enrollment E1 = new EnrollmentBuilder().build(); + @Test void 쀑볡_μˆ˜κ°•μ‹ μ²­μ‹œ_μ˜ˆμ™Έλ°œμƒ() { Session session = new SessionBuilder() @@ -18,10 +19,9 @@ class EnrollmentsTest { .withSessionStatus(SessionStatus.ACTIVE) .build(); - Enrollment newEnrollment = new EnrollmentBuilder().build(); - + EnrollmentApply enrollmentApply = new EnrollmentApply(new Enrollments(E1), new Payment(1L, 1L, 300_000L), session.getSessionCore()); - assertThatThrownBy(() -> session.addEnrollment(newEnrollment, new Payment(1L, 1L, 300_000L))) + assertThatThrownBy(() -> enrollmentApply.enroll(E1.getUser(), session.getId())) .isInstanceOf(IllegalArgumentException.class) .hasMessageContaining("이미 μ‹ μ²­ν•œ κ°•μ˜μž…λ‹ˆλ‹€."); } diff --git a/src/test/java/nextstep/courses/domain/session/SessionCoreTest.java b/src/test/java/nextstep/courses/domain/session/SessionCoreTest.java new file mode 100644 index 000000000..841adb252 --- /dev/null +++ b/src/test/java/nextstep/courses/domain/session/SessionCoreTest.java @@ -0,0 +1,33 @@ +package nextstep.courses.domain.session; + +import nextstep.courses.domain.session.builder.EnrollmentBuilder; +import nextstep.courses.domain.session.builder.SessionBuilder; +import nextstep.courses.domain.session.constant.SessionRecruitmentStatus; +import nextstep.payments.domain.Payment; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.*; + +class SessionCoreTest { + + + @Test + void κ°•μ˜μ‹ μ²­μ‹œ_λΉ„λͺ¨μ§‘μƒνƒœ_μ—λŸ¬λ°œμƒ(){ + Session session = new SessionBuilder().withRecruit(SessionRecruitmentStatus.NOT_RECRUITING).build(); + Enrollment enrollment = new EnrollmentBuilder().build(); + EnrollmentApply enrollmentApply = new EnrollmentApply(new Enrollments(enrollment), new Payment(1L, 1L, 300_000L), session.getSessionCore()); + + assertThatThrownBy(() -> enrollmentApply.enroll(enrollment.getUser(), session.getId())) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + void κ°•μ˜μ‹ μ²­μ‹œ_λͺ¨μ§‘μƒνƒœ_정상_μ‹ μ²­(){ + Session session = new SessionBuilder().withRecruit(SessionRecruitmentStatus.RECRUITING).build(); + Enrollment enrollment = new EnrollmentBuilder().build(); + EnrollmentApply enrollmentApply = new EnrollmentApply(new Enrollments(), new Payment(1L, 1L, 300_000L), session.getSessionCore()); + enrollmentApply.enroll(enrollment.getUser(), session.getId()); + + assertThat(enrollmentApply.getEnrollments()).hasSize(1); + } +} \ No newline at end of file diff --git a/src/test/java/nextstep/courses/domain/session/SessionTest.java b/src/test/java/nextstep/courses/domain/session/SessionTest.java index 08b6c5959..91a598d0c 100644 --- a/src/test/java/nextstep/courses/domain/session/SessionTest.java +++ b/src/test/java/nextstep/courses/domain/session/SessionTest.java @@ -4,6 +4,7 @@ import nextstep.courses.domain.session.builder.EnrollmentBuilder; import nextstep.courses.domain.session.builder.SessionBuilder; import nextstep.courses.domain.session.builder.SessionPolicyBuilder; +import nextstep.courses.domain.session.constant.SessionRecruitmentStatus; import nextstep.courses.domain.session.constant.SessionStatus; import nextstep.courses.domain.session.constant.SessionType; import nextstep.payments.domain.Payment; @@ -24,30 +25,29 @@ public class SessionTest { void 유료_κ°•μ˜_정상_생성() { Session sessionBuilder = new SessionBuilder().build(); - assertThat(sessionBuilder.getSessionPolicy().getSessionType()).isEqualTo(SessionType.PAID); - assertThat(sessionBuilder.getSessionPolicy().getTuition()).isEqualTo(new Tuition(300_000L)); - assertThat(sessionBuilder.getSessionStatus()).isEqualTo(SessionStatus.PENDING); - assertThat(sessionBuilder.getSessionPolicy().getMaxCapacity()).isEqualTo(new Capacity(100)); + assertThat(sessionBuilder.getSessionCore().getSessionPolicy().getSessionType()).isEqualTo(SessionType.PAID); + assertThat(sessionBuilder.getSessionCore().getSessionPolicy().getTuition()).isEqualTo(new Tuition(300_000L)); + assertThat(sessionBuilder.getSessionCore().getSessionStatus()).isEqualTo(SessionStatus.PENDING); + assertThat(sessionBuilder.getSessionCore().getSessionPolicy().getMaxCapacity()).isEqualTo(new Capacity(100)); } @Test void 무료_κ°•μ˜_정상_생성() { Session session = new Session(1L, START_DATE, END_DATE, "free", "pending", COVER_IMAGE); - assertThat(session.getSessionPolicy().getSessionType()).isEqualTo(SessionType.FREE); - assertThat(session.getSessionPolicy().getMaxCapacity()).isEqualTo(new Capacity(Integer.MAX_VALUE)); - assertThat(session.getSessionPolicy().getTuition()).isEqualTo(new Tuition(0L)); + assertThat(session.getSessionCore().getSessionPolicy().getSessionType()).isEqualTo(SessionType.FREE); + assertThat(session.getSessionCore().getSessionPolicy().getMaxCapacity()).isEqualTo(new Capacity(Integer.MAX_VALUE)); + assertThat(session.getSessionCore().getSessionPolicy().getTuition()).isEqualTo(new Tuition(0L)); } @Test void μˆ˜κ°•μ‹ μ²­μ‹œ_λͺ¨μ§‘쀑이_μ•„λ‹κ²½μš°_μ˜ˆμ™Έλ°œμƒ() { - Session session = new SessionBuilder().withSessionStatus(SessionStatus.PENDING).build(); + Session session = new SessionBuilder().withSessionStatus(SessionStatus.PENDING).withRecruit(SessionRecruitmentStatus.NOT_RECRUITING).build(); Enrollment enrollment = new EnrollmentBuilder().build(); - Payment payment = new Payment(1L, 1L, 300_000L); + EnrollmentApply enrollmentApply = new EnrollmentApply(new Enrollments(enrollment), new Payment(1L, 1L, 300_000L), session.getSessionCore()); - assertThatThrownBy(() -> session.addEnrollment(enrollment, payment)) - .isInstanceOf(IllegalArgumentException.class) - .hasMessageContaining("ν˜„μž¬λŠ” κ°•μ˜ λͺ¨μ§‘쀑이 μ•„λ‹™λ‹ˆλ‹€."); + assertThatThrownBy(() -> enrollmentApply.enroll(enrollment.getUser(), session.getId())) + .isInstanceOf(IllegalArgumentException.class); } @Test @@ -58,12 +58,22 @@ public class SessionTest { .withEnrollment(new EnrollmentBuilder().build()) .build(); - Enrollment newEnrollment = new Enrollment(NsUserTest.SANJIGI, 1L); - Payment payment = new Payment(1L, 1L, 300_000L); + Enrollment enrollment = new Enrollment(NsUserTest.SANJIGI, 1L, LocalDateTime.now(), null); + EnrollmentApply enrollmentApply = new EnrollmentApply(new Enrollments(enrollment), new Payment(1L, 1L, 300_000L), session.getSessionCore()); - assertThatThrownBy(() -> session.addEnrollment(newEnrollment, payment)) + assertThatThrownBy(() -> enrollmentApply.enroll(NsUserTest.SANJIGI, session.getId())) .isInstanceOf(IllegalArgumentException.class) .hasMessageContaining("μˆ˜κ°•μΈμ›μ΄ μ΄ˆκ³Όν–ˆμŠ΅λ‹ˆλ‹€."); } + @Test + void λͺ¨μ§‘정보_μΆ”κ°€ν•˜μ—¬_κ°•μ˜_생성() { + Session sessionBuilder = new SessionBuilder().build(); + + assertThat(sessionBuilder.getSessionCore().getSessionPolicy().getSessionType()).isEqualTo(SessionType.PAID); + assertThat(sessionBuilder.getSessionCore().getSessionPolicy().getTuition()).isEqualTo(new Tuition(300_000L)); + assertThat(sessionBuilder.getSessionCore().getSessionStatus()).isEqualTo(SessionStatus.PENDING); + assertThat(sessionBuilder.getSessionCore().getSessionPolicy().getMaxCapacity()).isEqualTo(new Capacity(100)); + } + } diff --git a/src/test/java/nextstep/courses/domain/session/builder/EnrollmentBuilder.java b/src/test/java/nextstep/courses/domain/session/builder/EnrollmentBuilder.java index e1805c560..ec7c9c8c3 100644 --- a/src/test/java/nextstep/courses/domain/session/builder/EnrollmentBuilder.java +++ b/src/test/java/nextstep/courses/domain/session/builder/EnrollmentBuilder.java @@ -1,13 +1,18 @@ package nextstep.courses.domain.session.builder; import nextstep.courses.domain.session.Enrollment; -import nextstep.payments.domain.Payment; +import nextstep.courses.domain.session.constant.EnrollmentStatus; +import nextstep.courses.domain.session.constant.SelectionStatus; import nextstep.users.domain.NsUser; +import java.time.LocalDateTime; + public class EnrollmentBuilder { private NsUser user = new NsUser(1L, "javajigi", "password", "name", "javajigi@slipp.net"); - private Long sessionId = 1L; + private Long sessionId = 23334L; + private SelectionStatus selectionStatus = SelectionStatus.PENDING; + private EnrollmentStatus enrollmentStatus = EnrollmentStatus.WAITING; public EnrollmentBuilder withUser(NsUser user) { this.user = user; @@ -19,9 +24,19 @@ public EnrollmentBuilder withSessionId(Long sessionId) { return this; } + public EnrollmentBuilder withSelectionStatus(SelectionStatus selectionStatus) { + this.selectionStatus = selectionStatus; + return this; + } + + public EnrollmentBuilder withEnrollmentStatus(EnrollmentStatus enrollmentStatus) { + this.enrollmentStatus = enrollmentStatus; + return this; + } + public Enrollment build() { - return new Enrollment(user, sessionId); + return new Enrollment(user, sessionId, LocalDateTime.now(), null, selectionStatus, enrollmentStatus); } } diff --git a/src/test/java/nextstep/courses/domain/session/builder/SessionBuilder.java b/src/test/java/nextstep/courses/domain/session/builder/SessionBuilder.java index 5c1c54df9..64e30e3ce 100644 --- a/src/test/java/nextstep/courses/domain/session/builder/SessionBuilder.java +++ b/src/test/java/nextstep/courses/domain/session/builder/SessionBuilder.java @@ -2,7 +2,9 @@ import nextstep.courses.domain.Course; import nextstep.courses.domain.image.CoverImage; +import nextstep.courses.domain.image.CoverImages; import nextstep.courses.domain.session.*; +import nextstep.courses.domain.session.constant.SessionRecruitmentStatus; import nextstep.courses.domain.session.constant.SessionStatus; import java.time.LocalDateTime; @@ -12,13 +14,14 @@ public class SessionBuilder { private Long id = 23334L; private Course course = new Course("TDD, 클린 μ½”λ“œ with Java", 1L); - private CoverImage coverImage = new CoverImage(2L, "png", 300, 200); + private CoverImages coverImages = new CoverImages(new CoverImage(2L, "png", 300, 200)); private SessionRange sessionRange = new SessionRangeBuilder().build(); private SessionPolicy sessionPolicy = new SessionPolicyBuilder().build(); private SessionStatus sessionStatus = SessionStatus.PENDING; private Enrollments enrollments = new Enrollments(); private LocalDateTime createdAt = LocalDateTime.now(); private LocalDateTime updatedAt; + private SessionRecruitmentStatus recruit = SessionRecruitmentStatus.RECRUITING; public SessionBuilder withId(Long id) { this.id = id; @@ -30,8 +33,8 @@ public SessionBuilder withCourse(Course course) { return this; } - public SessionBuilder withCoverImage(CoverImage coverImage) { - this.coverImage = coverImage; + public SessionBuilder withCoverImages(CoverImages coverImages) { + this.coverImages = coverImages; return this; } @@ -65,8 +68,17 @@ public SessionBuilder withUpdatedAt(LocalDateTime updatedAt) { return this; } + public SessionBuilder withRecruit(SessionRecruitmentStatus recruit) { + this.recruit = recruit; + return this; + } + + private SessionCore createdSessionCore() { + return new SessionCore(this.sessionRange, this.sessionPolicy, this.sessionStatus, recruit); + } + public Session build() { - return new Session(id, course, sessionRange, sessionPolicy, sessionStatus, coverImage, enrollments, createdAt, updatedAt); + return new Session(id, course, coverImages, enrollments, createdAt, updatedAt, createdSessionCore()); } } diff --git a/src/test/java/nextstep/courses/infrastructure/EnrollmentRepositoryTest.java b/src/test/java/nextstep/courses/infrastructure/EnrollmentRepositoryTest.java index acc8b125d..6889e8b54 100644 --- a/src/test/java/nextstep/courses/infrastructure/EnrollmentRepositoryTest.java +++ b/src/test/java/nextstep/courses/infrastructure/EnrollmentRepositoryTest.java @@ -3,7 +3,6 @@ import nextstep.courses.domain.session.Enrollment; import nextstep.courses.domain.session.repository.EnrollmentRepository; import nextstep.courses.record.EnrollmentRecord; -import nextstep.payments.domain.Payment; import nextstep.users.domain.NsUserTest; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -13,6 +12,7 @@ import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest; import org.springframework.jdbc.core.JdbcTemplate; +import java.time.LocalDateTime; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; @@ -33,7 +33,7 @@ void setUp() { @Test void crud() { - int count = enrollmentRepository.save(new Enrollment(NsUserTest.JAVAJIGI, 1L)); + int count = enrollmentRepository.save(new Enrollment(NsUserTest.JAVAJIGI, 1L, LocalDateTime.now(), null)); assertThat(count).isEqualTo(1); List enrollments = enrollmentRepository.findBySessionId(1L); diff --git a/src/test/java/nextstep/courses/infrastructure/SessionRepositoryTest.java b/src/test/java/nextstep/courses/infrastructure/SessionRepositoryTest.java index f3cd618fb..892789d03 100644 --- a/src/test/java/nextstep/courses/infrastructure/SessionRepositoryTest.java +++ b/src/test/java/nextstep/courses/infrastructure/SessionRepositoryTest.java @@ -1,6 +1,7 @@ package nextstep.courses.infrastructure; import nextstep.courses.domain.session.Session; +import nextstep.courses.domain.session.mapper.SessionMapper; import nextstep.courses.domain.session.repository.SessionRepository; import nextstep.courses.domain.session.builder.SessionBuilder; import nextstep.courses.record.SessionRecord; @@ -31,7 +32,7 @@ void setUp() { @Test void crud(){ Session session = new SessionBuilder().withId(2L).build(); - int count = sessionRepository.save(session.toSessionRecord()); + int count = sessionRepository.save(SessionMapper.toEntity(session)); assertThat(count).isEqualTo(1); SessionRecord sessionRecord = sessionRepository.findById(1000L);