From 7576ecd225c0b7e0f3115a089bda3ea1ee199eb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EC=A7=80=EC=9B=85?= Date: Sun, 12 May 2024 19:16:58 +0900 Subject: [PATCH 01/12] =?UTF-8?q?[feat]=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?= =?UTF-8?q?=EC=9A=A9=EB=9F=89=EC=9D=80=201MB=20=EC=9D=B4=ED=95=98=EC=97=AC?= =?UTF-8?q?=EC=95=BC=20=ED=95=9C=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../courses/domain/Image/ImageCapacity.java | 23 +++++++++++++++++++ .../domain/image/ImageCapacityTest.java | 17 ++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 src/main/java/nextstep/courses/domain/Image/ImageCapacity.java create mode 100644 src/test/java/nextstep/courses/domain/image/ImageCapacityTest.java diff --git a/src/main/java/nextstep/courses/domain/Image/ImageCapacity.java b/src/main/java/nextstep/courses/domain/Image/ImageCapacity.java new file mode 100644 index 000000000..700d31805 --- /dev/null +++ b/src/main/java/nextstep/courses/domain/Image/ImageCapacity.java @@ -0,0 +1,23 @@ +package nextstep.courses.domain.Image; + +import nextstep.courses.OutOfImageCapacityException; + +public class ImageCapacity { + + private final int capacity; + + /** + * kilobyte 기준으로 작성하였습니다. + * @param capacity + */ + public ImageCapacity(int capacity) throws OutOfImageCapacityException { + validCapacity(capacity); + this.capacity = capacity; + } + + private void validCapacity(int capacity) throws OutOfImageCapacityException { + if (capacity > 1000) { + throw new OutOfImageCapacityException("이미지 용량은 1MB 이하여야 합니다."); + } + } +} diff --git a/src/test/java/nextstep/courses/domain/image/ImageCapacityTest.java b/src/test/java/nextstep/courses/domain/image/ImageCapacityTest.java new file mode 100644 index 000000000..10bd8e695 --- /dev/null +++ b/src/test/java/nextstep/courses/domain/image/ImageCapacityTest.java @@ -0,0 +1,17 @@ +package nextstep.courses.domain.image; + +import nextstep.courses.OutOfImageCapacityException; +import nextstep.courses.domain.Image.ImageCapacity; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; + +public class ImageCapacityTest { + + @Test + void 이미지_용량은_1MB_이하() { + int capacity = 2_000; + Assertions.assertThatThrownBy(() -> new ImageCapacity(capacity)) + .isInstanceOf(OutOfImageCapacityException.class); + } + +} From 90d9f98d69f0f11ffd64b2eb3bee090e4b35f0d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EC=A7=80=EC=9B=85?= Date: Sun, 12 May 2024 20:27:21 +0900 Subject: [PATCH 02/12] =?UTF-8?q?[feat]=20=ED=97=88=EC=9A=A9=EB=90=98?= =?UTF-8?q?=EB=8A=94=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20=ED=83=80=EC=9E=85?= =?UTF-8?q?=EC=9D=80=20=EC=A0=9C=ED=95=9C=EB=90=98=EC=96=B4=20=EC=9E=88?= =?UTF-8?q?=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../NotAcceptedImageTypeException.java | 9 +++++++++ .../courses/OutOfImageCapacityException.java | 9 +++++++++ .../courses/domain/Image/ImageType.java | 19 +++++++++++++++++++ .../courses/domain/image/ImageTypeTest.java | 16 ++++++++++++++++ 4 files changed, 53 insertions(+) create mode 100644 src/main/java/nextstep/courses/NotAcceptedImageTypeException.java create mode 100644 src/main/java/nextstep/courses/OutOfImageCapacityException.java create mode 100644 src/main/java/nextstep/courses/domain/Image/ImageType.java create mode 100644 src/test/java/nextstep/courses/domain/image/ImageTypeTest.java diff --git a/src/main/java/nextstep/courses/NotAcceptedImageTypeException.java b/src/main/java/nextstep/courses/NotAcceptedImageTypeException.java new file mode 100644 index 000000000..85948bca8 --- /dev/null +++ b/src/main/java/nextstep/courses/NotAcceptedImageTypeException.java @@ -0,0 +1,9 @@ +package nextstep.courses; + +public class NotAcceptedImageTypeException extends Exception{ + private static final long serialVersionUID = 1L; + + public NotAcceptedImageTypeException(String message) { + super(message); + } +} diff --git a/src/main/java/nextstep/courses/OutOfImageCapacityException.java b/src/main/java/nextstep/courses/OutOfImageCapacityException.java new file mode 100644 index 000000000..2a0c9f069 --- /dev/null +++ b/src/main/java/nextstep/courses/OutOfImageCapacityException.java @@ -0,0 +1,9 @@ +package nextstep.courses; + +public class OutOfImageCapacityException extends Exception{ + private static final long serialVersionUID = 1L; + + public OutOfImageCapacityException(String message) { + super(message); + } +} diff --git a/src/main/java/nextstep/courses/domain/Image/ImageType.java b/src/main/java/nextstep/courses/domain/Image/ImageType.java new file mode 100644 index 000000000..15307bf1b --- /dev/null +++ b/src/main/java/nextstep/courses/domain/Image/ImageType.java @@ -0,0 +1,19 @@ +package nextstep.courses.domain.Image; + +import java.util.Arrays; +import nextstep.courses.NotAcceptedImageTypeException; + +public enum ImageType { + GIF, + JPG, + JPEG, + PNG, + SVG; + + public static ImageType of(String type) throws NotAcceptedImageTypeException { + return Arrays.stream(ImageType.values()) + .filter(value -> value.name().equals(type)) + .findFirst() + .orElseThrow(() -> new NotAcceptedImageTypeException("허용되지 않는 이미지 타입입니다.")); + } +} diff --git a/src/test/java/nextstep/courses/domain/image/ImageTypeTest.java b/src/test/java/nextstep/courses/domain/image/ImageTypeTest.java new file mode 100644 index 000000000..f3c37fad7 --- /dev/null +++ b/src/test/java/nextstep/courses/domain/image/ImageTypeTest.java @@ -0,0 +1,16 @@ +package nextstep.courses.domain.image; + +import nextstep.courses.NotAcceptedImageTypeException; +import nextstep.courses.domain.Image.ImageType; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; + +public class ImageTypeTest { + + @Test + void 이미지_타입_에러_테스트(){ + String type = "bmp"; + Assertions.assertThatThrownBy(()->ImageType.of(type)) + .isInstanceOf(NotAcceptedImageTypeException.class); + } +} From 9092248d46e616c233f01c857e5cc82d56098457 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EC=A7=80=EC=9B=85?= Date: Sun, 12 May 2024 20:48:57 +0900 Subject: [PATCH 03/12] =?UTF-8?q?[feat]=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?= =?UTF-8?q?=ED=81=AC=EA=B8=B0=EC=99=80=20=EB=B9=84=EC=9C=A8=EC=9D=B4=20?= =?UTF-8?q?=EB=A7=9E=EC=A7=80=20=EC=95=8A=EC=9C=BC=EB=A9=B4=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=20=EB=B0=9C=EC=83=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../courses/ImageSizeRangeException.java | 9 +++++ .../courses/ImageSizeRatioException.java | 10 ++++++ .../courses/domain/Image/ImageSize.java | 33 +++++++++++++++++++ .../courses/domain/image/ImageSizeTest.java | 29 ++++++++++++++++ 4 files changed, 81 insertions(+) create mode 100644 src/main/java/nextstep/courses/ImageSizeRangeException.java create mode 100644 src/main/java/nextstep/courses/ImageSizeRatioException.java create mode 100644 src/main/java/nextstep/courses/domain/Image/ImageSize.java create mode 100644 src/test/java/nextstep/courses/domain/image/ImageSizeTest.java diff --git a/src/main/java/nextstep/courses/ImageSizeRangeException.java b/src/main/java/nextstep/courses/ImageSizeRangeException.java new file mode 100644 index 000000000..133a2f2bb --- /dev/null +++ b/src/main/java/nextstep/courses/ImageSizeRangeException.java @@ -0,0 +1,9 @@ +package nextstep.courses; + +public class ImageSizeRangeException extends Exception{ + private static final long serialVersionUID = 1L; + + public ImageSizeRangeException(String message) { + super(message); + } +} diff --git a/src/main/java/nextstep/courses/ImageSizeRatioException.java b/src/main/java/nextstep/courses/ImageSizeRatioException.java new file mode 100644 index 000000000..69fd2a015 --- /dev/null +++ b/src/main/java/nextstep/courses/ImageSizeRatioException.java @@ -0,0 +1,10 @@ +package nextstep.courses; + +public class ImageSizeRatioException extends Exception{ + private static final long serialVersionUID = 1L; + + public ImageSizeRatioException(String message) { + super(message); + } + +} diff --git a/src/main/java/nextstep/courses/domain/Image/ImageSize.java b/src/main/java/nextstep/courses/domain/Image/ImageSize.java new file mode 100644 index 000000000..29707a6ab --- /dev/null +++ b/src/main/java/nextstep/courses/domain/Image/ImageSize.java @@ -0,0 +1,33 @@ +package nextstep.courses.domain.Image; + +import nextstep.courses.ImageSizeRangeException; +import nextstep.courses.ImageSizeRatioException; + +public class ImageSize { + + private static int WIDTH_RATIO = 3; + private static int HEIGHT_RATIO = 2; + + private final int width; + private final int height; + + public ImageSize(int width, int height) throws Exception { + validSizeRange(width, height); + validSizeRatio(width, height); + this.width = width; + this.height = height; + } + + private void validSizeRange(int width, int height) throws ImageSizeRangeException { + if (width < 300 || height < 200) { + throw new ImageSizeRangeException("가로 300 이상 세로 200 이상이어야 합니다."); + } + } + + private void validSizeRatio(int width, int height) throws ImageSizeRatioException { + if (width * HEIGHT_RATIO != height * WIDTH_RATIO) { + throw new ImageSizeRatioException( + "가로 세로 비율은 " + WIDTH_RATIO + " : " + HEIGHT_RATIO + "입니다"); + } + } +} diff --git a/src/test/java/nextstep/courses/domain/image/ImageSizeTest.java b/src/test/java/nextstep/courses/domain/image/ImageSizeTest.java new file mode 100644 index 000000000..3d46c69ef --- /dev/null +++ b/src/test/java/nextstep/courses/domain/image/ImageSizeTest.java @@ -0,0 +1,29 @@ +package nextstep.courses.domain.image; + +import nextstep.courses.ImageSizeRangeException; +import nextstep.courses.ImageSizeRatioException; +import nextstep.courses.domain.Image.ImageSize; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; + +public class ImageSizeTest { + + @Test + void 이미지_크기는_가로_300_높이_200_이상이어야_합니다() { + int width = 299; + int height = 200; + + Assertions.assertThatThrownBy(() -> new ImageSize(width, height)) + .isInstanceOf(ImageSizeRangeException.class); + } + + @Test + void 이미지_비율은_가로_3_세로_2_어야_합니다() { + int width = 400; + int height = 200; + + Assertions.assertThatThrownBy(() -> new ImageSize(width, height)) + .isInstanceOf(ImageSizeRatioException.class); + } + +} From 803f52eaca39954754836e827430edcb8cf4999a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EC=A7=80=EC=9B=85?= Date: Mon, 13 May 2024 19:58:58 +0900 Subject: [PATCH 04/12] =?UTF-8?q?[feat]=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/nextstep/courses/domain/Image/Image.java | 13 +++++++++++++ .../courses/domain/Image/ImageCapacity.java | 3 ++- 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 src/main/java/nextstep/courses/domain/Image/Image.java diff --git a/src/main/java/nextstep/courses/domain/Image/Image.java b/src/main/java/nextstep/courses/domain/Image/Image.java new file mode 100644 index 000000000..839cb75dd --- /dev/null +++ b/src/main/java/nextstep/courses/domain/Image/Image.java @@ -0,0 +1,13 @@ +package nextstep.courses.domain.Image; + +public class Image { + private final ImageCapacity capacity; + private final ImageType type; + private final ImageSize size; + + public Image(ImageCapacity capacity, ImageType type, ImageSize size) { + this.capacity = capacity; + this.type = type; + this.size = size; + } +} diff --git a/src/main/java/nextstep/courses/domain/Image/ImageCapacity.java b/src/main/java/nextstep/courses/domain/Image/ImageCapacity.java index 700d31805..25193a40b 100644 --- a/src/main/java/nextstep/courses/domain/Image/ImageCapacity.java +++ b/src/main/java/nextstep/courses/domain/Image/ImageCapacity.java @@ -3,6 +3,7 @@ import nextstep.courses.OutOfImageCapacityException; public class ImageCapacity { + private final int LIMIT_CAPACITY = 1024; private final int capacity; @@ -16,7 +17,7 @@ public ImageCapacity(int capacity) throws OutOfImageCapacityException { } private void validCapacity(int capacity) throws OutOfImageCapacityException { - if (capacity > 1000) { + if (capacity > LIMIT_CAPACITY) { throw new OutOfImageCapacityException("이미지 용량은 1MB 이하여야 합니다."); } } From fb85cd978161f98d9201777d9d6fe94bb8210247 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EC=A7=80=EC=9B=85?= Date: Mon, 13 May 2024 20:00:07 +0900 Subject: [PATCH 05/12] =?UTF-8?q?[feat]=20=EA=B0=95=EC=9D=98=EB=8A=94=20?= =?UTF-8?q?=EC=8B=9C=EC=9E=91=EC=9D=BC=EA=B3=BC=20=EC=A2=85=EB=A3=8C?= =?UTF-8?q?=EC=9D=BC=EC=9D=84=20=EA=B0=80=EC=A7=84=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nextstep/courses/domain/session/Period.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/main/java/nextstep/courses/domain/session/Period.java diff --git a/src/main/java/nextstep/courses/domain/session/Period.java b/src/main/java/nextstep/courses/domain/session/Period.java new file mode 100644 index 000000000..4b311e6cc --- /dev/null +++ b/src/main/java/nextstep/courses/domain/session/Period.java @@ -0,0 +1,13 @@ +package nextstep.courses.domain.session; + +import java.time.LocalDateTime; + +public class Period { + private final LocalDateTime startDate; + private final LocalDateTime endDate; + + public Period(LocalDateTime startDate, LocalDateTime endDate) { + this.startDate = startDate; + this.endDate = endDate; + } +} From 1e8a01e62e750b6898f31ce778f63b9b5ba80a09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EC=A7=80=EC=9B=85?= Date: Mon, 13 May 2024 20:01:33 +0900 Subject: [PATCH 06/12] =?UTF-8?q?[feat]=20=EC=9C=A0=EB=A3=8C=20=EA=B0=95?= =?UTF-8?q?=EC=9D=98=EB=8A=94=20=EA=B0=95=EC=9D=98=EB=A3=8C=EB=A5=BC=20?= =?UTF-8?q?=EC=A7=80=EB=B6=88=ED=95=B4=EC=95=BC=20=ED=95=98=EA=B3=A0=20?= =?UTF-8?q?=EC=88=98=EA=B0=95=EC=9D=B8=EC=9B=90=20=EC=A0=9C=ED=95=9C?= =?UTF-8?q?=EC=9D=B4=20=EC=9E=88=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../courses/CanNotApplyException.java | 9 ++++ .../courses/domain/session/PaidSession.java | 35 +++++++++++++++ .../domain/session/PaidSessionTest.java | 45 +++++++++++++++++++ 3 files changed, 89 insertions(+) create mode 100644 src/main/java/nextstep/courses/CanNotApplyException.java create mode 100644 src/main/java/nextstep/courses/domain/session/PaidSession.java create mode 100644 src/test/java/nextstep/courses/domain/session/PaidSessionTest.java diff --git a/src/main/java/nextstep/courses/CanNotApplyException.java b/src/main/java/nextstep/courses/CanNotApplyException.java new file mode 100644 index 000000000..ba4b4d1c4 --- /dev/null +++ b/src/main/java/nextstep/courses/CanNotApplyException.java @@ -0,0 +1,9 @@ +package nextstep.courses; + +public class CanNotApplyException extends Exception{ + private static final long serialVersionUID = 1L; + + public CanNotApplyException(String message) { + super(message); + } +} diff --git a/src/main/java/nextstep/courses/domain/session/PaidSession.java b/src/main/java/nextstep/courses/domain/session/PaidSession.java new file mode 100644 index 000000000..16d196e83 --- /dev/null +++ b/src/main/java/nextstep/courses/domain/session/PaidSession.java @@ -0,0 +1,35 @@ +package nextstep.courses.domain.session; + +import nextstep.courses.CanNotApplyException; +import nextstep.courses.domain.Image.Image; + +public class PaidSession extends Session { + + private final int fee; + private final int limit; + + public PaidSession(Image image, Period period, SessionStatus status, int fee, int limit) { + super(image, period, status); + this.fee = fee; + this.limit = limit; + } + + @Override + public boolean isAppliable(int pay, int order) throws CanNotApplyException { + validPay(pay); + validStudentsLimit(order); + return fee == pay && order <= limit; + } + + private void validStudentsLimit(int order) throws CanNotApplyException { + if(order > limit){ + throw new CanNotApplyException("수강생이_꽉_찼습니다"); + } + } + + private void validPay(int pay) throws CanNotApplyException { + if(pay != fee){ + throw new CanNotApplyException("수강료를 잘 못 내셨습니다."); + } + } +} diff --git a/src/test/java/nextstep/courses/domain/session/PaidSessionTest.java b/src/test/java/nextstep/courses/domain/session/PaidSessionTest.java new file mode 100644 index 000000000..ae4b431fd --- /dev/null +++ b/src/test/java/nextstep/courses/domain/session/PaidSessionTest.java @@ -0,0 +1,45 @@ +package nextstep.courses.domain.session; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import java.time.LocalDateTime; +import nextstep.courses.CanNotApplyException; +import nextstep.courses.domain.Image.Image; +import nextstep.courses.domain.Image.ImageCapacity; +import nextstep.courses.domain.Image.ImageSize; +import nextstep.courses.domain.Image.ImageType; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public class PaidSessionTest { + + PaidSession session; + + @BeforeEach + void init() throws Exception { + Image image = new Image(new ImageCapacity(1000), ImageType.JPG, new ImageSize(300, 200)); + Period period = new Period( + LocalDateTime.of(2024, 5, 1, 13, 0), + LocalDateTime.of(2024, 6, 1, 14, 0)); + SessionStatus status = SessionStatus.READY; + + int fee = 20000; + int limit = 10; + session = new PaidSession(image, period, status, fee, limit); + } + + @Test + void 지불한_수강료와_강의료가_같아야합니다() { + int pay = 10000; + assertThatThrownBy(() -> session.isAppliable(pay, 1)) + .isInstanceOf(CanNotApplyException.class); + } + + @Test + void 수강인원이_꽉_차면_에러가_발생합니다() { + int pay = 20_000; + int order = 11; + assertThatThrownBy(() -> session.isAppliable(pay, order)) + .isInstanceOf(CanNotApplyException.class); + } +} From d34226cfd08899d1dc5b7424ad39998db72c0a58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EC=A7=80=EC=9B=85?= Date: Mon, 13 May 2024 20:02:02 +0900 Subject: [PATCH 07/12] =?UTF-8?q?[feat]=20=EB=AC=B4=EB=A3=8C=20=EA=B0=95?= =?UTF-8?q?=EC=9D=98=EB=8A=94=20=EB=8F=88=EA=B3=BC=20=EC=88=98=EA=B0=95?= =?UTF-8?q?=EC=83=9D=20=EC=A0=9C=ED=95=9C=EC=9D=B4=20=EC=97=86=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../courses/domain/session/FreeSession.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 src/main/java/nextstep/courses/domain/session/FreeSession.java diff --git a/src/main/java/nextstep/courses/domain/session/FreeSession.java b/src/main/java/nextstep/courses/domain/session/FreeSession.java new file mode 100644 index 000000000..0a1190ae7 --- /dev/null +++ b/src/main/java/nextstep/courses/domain/session/FreeSession.java @@ -0,0 +1,24 @@ +package nextstep.courses.domain.session; + +import nextstep.courses.CanNotApplyException; +import nextstep.courses.domain.Image.Image; + +public class FreeSession extends Session{ + private static final int FREE_COST = 0; + + public FreeSession(Image image, Period period, SessionStatus status) { + super(image, period, status); + } + + @Override + public boolean isAppliable(int pay, int order) throws CanNotApplyException { + validPay(pay); + return true; + } + + private static void validPay(int pay) throws CanNotApplyException { + if(pay != FREE_COST){ + throw new CanNotApplyException("무료 강의입니다."); + } + } +} From 9c2642fa94b30e9b07a77775025c4d125324474e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EC=A7=80=EC=9B=85?= Date: Mon, 13 May 2024 20:02:36 +0900 Subject: [PATCH 08/12] =?UTF-8?q?[feat]=20=EA=B0=95=EC=9D=98=20=EC=83=81?= =?UTF-8?q?=ED=83=9C=EB=8A=94=20=EC=A4=80=EB=B9=84,=20=EB=AA=A8=EC=A7=91,?= =?UTF-8?q?=20=EB=A7=88=EA=B0=90=EC=9C=BC=EB=A1=9C=20=EC=9D=B4=EB=A3=A8?= =?UTF-8?q?=EC=96=B4=EC=A7=84=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nextstep/courses/domain/session/SessionStatus.java | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/main/java/nextstep/courses/domain/session/SessionStatus.java diff --git a/src/main/java/nextstep/courses/domain/session/SessionStatus.java b/src/main/java/nextstep/courses/domain/session/SessionStatus.java new file mode 100644 index 000000000..fe9fb97a0 --- /dev/null +++ b/src/main/java/nextstep/courses/domain/session/SessionStatus.java @@ -0,0 +1,7 @@ +package nextstep.courses.domain.session; + +public enum SessionStatus { + READY, + RECRUIT, + END +} From 500f8d6a405a0b14f88f60013b1a11d6ae736b2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EC=A7=80=EC=9B=85?= Date: Mon, 13 May 2024 20:08:38 +0900 Subject: [PATCH 09/12] =?UTF-8?q?[feat]=20=EC=88=98=EA=B0=95=EC=8B=A0?= =?UTF-8?q?=EC=B2=AD=ED=95=9C=20=EC=9C=A0=EC=A0=80=EB=93=A4=EC=9D=84=20?= =?UTF-8?q?=EB=8B=B4=EB=8A=94=20Users=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EA=B0=9C=EB=B0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nextstep/courses/domain/user/NsUsers.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/main/java/nextstep/courses/domain/user/NsUsers.java diff --git a/src/main/java/nextstep/courses/domain/user/NsUsers.java b/src/main/java/nextstep/courses/domain/user/NsUsers.java new file mode 100644 index 000000000..07ced830e --- /dev/null +++ b/src/main/java/nextstep/courses/domain/user/NsUsers.java @@ -0,0 +1,20 @@ +package nextstep.courses.domain.user; + +import java.util.ArrayList; +import java.util.List; +import nextstep.users.domain.NsUser; + +public class NsUsers { + private final List users = new ArrayList<>(); + + public NsUsers() { + } + + public int numberOfUsers(){ + return users.size(); + } + + public void add(NsUser user){ + users.add(user); + } +} From 373c0cefaa125c9a3e4d064fc85b498cb0ce466a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EC=A7=80=EC=9B=85?= Date: Mon, 13 May 2024 20:08:57 +0900 Subject: [PATCH 10/12] =?UTF-8?q?[feat]=20=EA=B0=95=EC=9D=98=20=EC=88=98?= =?UTF-8?q?=EA=B0=95=EC=8B=A0=EC=B2=AD=20=EA=B8=B0=EB=8A=A5=20=EA=B0=9C?= =?UTF-8?q?=EB=B0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../courses/domain/session/Session.java | 40 +++++++++++++ .../courses/domain/session/SessionTest.java | 57 +++++++++++++++++++ 2 files changed, 97 insertions(+) create mode 100644 src/main/java/nextstep/courses/domain/session/Session.java create mode 100644 src/test/java/nextstep/courses/domain/session/SessionTest.java diff --git a/src/main/java/nextstep/courses/domain/session/Session.java b/src/main/java/nextstep/courses/domain/session/Session.java new file mode 100644 index 000000000..cffd7002d --- /dev/null +++ b/src/main/java/nextstep/courses/domain/session/Session.java @@ -0,0 +1,40 @@ +package nextstep.courses.domain.session; + +import nextstep.courses.CanNotApplyException; +import nextstep.courses.domain.Image.Image; +import nextstep.courses.domain.user.NsUsers; +import nextstep.users.domain.NsUser; + +public abstract class Session { + + private final Image image; + private final Period period; + private final SessionStatus status; + private final NsUsers users; + + public Session(Image image, Period period, SessionStatus status) { + this.image = image; + this.period = period; + this.status = status; + this.users = new NsUsers(); + } + + public NsUsers getUsers() { + return users; + } + + public abstract boolean isAppliable(int pay, int order) throws CanNotApplyException; + + public void apply(int pay, NsUser user) throws Exception { + validSessionStatus(); + isAppliable(pay, users.numberOfUsers() + 1); + users.add(user); + } + + public void validSessionStatus() throws Exception { + if(!status.equals(SessionStatus.RECRUIT)){ + throw new CanNotApplyException("모집 중인 강의가 아닙니다."); + } + } + +} diff --git a/src/test/java/nextstep/courses/domain/session/SessionTest.java b/src/test/java/nextstep/courses/domain/session/SessionTest.java new file mode 100644 index 000000000..3deced5c9 --- /dev/null +++ b/src/test/java/nextstep/courses/domain/session/SessionTest.java @@ -0,0 +1,57 @@ +package nextstep.courses.domain.session; + +import java.time.LocalDateTime; +import nextstep.courses.CanNotApplyException; +import nextstep.courses.domain.Image.Image; +import nextstep.courses.domain.Image.ImageCapacity; +import nextstep.courses.domain.Image.ImageSize; +import nextstep.courses.domain.Image.ImageType; +import nextstep.users.domain.NsUser; +import nextstep.users.domain.NsUserTest; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public class SessionTest { + + Image image; + Period period; + SessionStatus status; + + Session session; + + @BeforeEach + void init() throws Exception { + image = new Image(new ImageCapacity(1000), ImageType.JPG, new ImageSize(300, 200)); + period = new Period( + LocalDateTime.of(2024, 5, 1, 13, 0), + LocalDateTime.of(2024, 6, 1, 14, 0)); + status = SessionStatus.RECRUIT; + } + + @Test + void 수강신청은_모집중일때만() { + SessionStatus endStatus = SessionStatus.END; + session = new FreeSession(image, period, endStatus); + NsUser user = NsUserTest.JAVAJIGI; + Assertions.assertThatThrownBy(() -> session.apply(0, user)) + .isInstanceOf(CanNotApplyException.class); + } + + @Test + void 무료_수강신청_성공() throws Exception { + session = new FreeSession(image, period, status); + NsUser user = NsUserTest.JAVAJIGI; + session.apply(0, user); + Assertions.assertThat(session.getUsers().numberOfUsers()).isEqualTo(1); + } + + @Test + void 유료_수강신청_성공() throws Exception { + session = new PaidSession(image, period, status, 20_000, 10); + NsUser user = NsUserTest.JAVAJIGI; + session.apply(20_000, user); + Assertions.assertThat(session.getUsers().numberOfUsers()).isEqualTo(1); + } + +} From 4dd46211cbe60aba0d1d8df18e4dbcc34bef15e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EC=A7=80=EC=9B=85?= Date: Mon, 13 May 2024 20:33:03 +0900 Subject: [PATCH 11/12] =?UTF-8?q?[feat]=20Course,=20Session=20=EB=A7=B5?= =?UTF-8?q?=ED=95=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/courses/domain/Course.java | 4 ++++ .../nextstep/courses/domain/session/FreeSession.java | 5 +++-- .../nextstep/courses/domain/session/PaidSession.java | 10 ++++++---- .../java/nextstep/courses/domain/session/Session.java | 5 ++++- .../courses/domain/session/PaidSessionTest.java | 4 +++- .../nextstep/courses/domain/session/SessionTest.java | 9 ++++++--- 6 files changed, 26 insertions(+), 11 deletions(-) diff --git a/src/main/java/nextstep/courses/domain/Course.java b/src/main/java/nextstep/courses/domain/Course.java index 0f6971604..277eed320 100644 --- a/src/main/java/nextstep/courses/domain/Course.java +++ b/src/main/java/nextstep/courses/domain/Course.java @@ -1,6 +1,8 @@ package nextstep.courses.domain; import java.time.LocalDateTime; +import java.util.List; +import nextstep.courses.domain.session.Session; public class Course { private Long id; @@ -13,6 +15,8 @@ public class Course { private LocalDateTime updatedAt; + private List sessions; + public Course() { } diff --git a/src/main/java/nextstep/courses/domain/session/FreeSession.java b/src/main/java/nextstep/courses/domain/session/FreeSession.java index 0a1190ae7..a93ca7602 100644 --- a/src/main/java/nextstep/courses/domain/session/FreeSession.java +++ b/src/main/java/nextstep/courses/domain/session/FreeSession.java @@ -1,13 +1,14 @@ package nextstep.courses.domain.session; import nextstep.courses.CanNotApplyException; +import nextstep.courses.domain.Course; import nextstep.courses.domain.Image.Image; public class FreeSession extends Session{ private static final int FREE_COST = 0; - public FreeSession(Image image, Period period, SessionStatus status) { - super(image, period, status); + public FreeSession(Image image, Period period, SessionStatus status, Course course) { + super(image, period, status, course); } @Override diff --git a/src/main/java/nextstep/courses/domain/session/PaidSession.java b/src/main/java/nextstep/courses/domain/session/PaidSession.java index 16d196e83..fecc133de 100644 --- a/src/main/java/nextstep/courses/domain/session/PaidSession.java +++ b/src/main/java/nextstep/courses/domain/session/PaidSession.java @@ -1,6 +1,7 @@ package nextstep.courses.domain.session; import nextstep.courses.CanNotApplyException; +import nextstep.courses.domain.Course; import nextstep.courses.domain.Image.Image; public class PaidSession extends Session { @@ -8,8 +9,9 @@ public class PaidSession extends Session { private final int fee; private final int limit; - public PaidSession(Image image, Period period, SessionStatus status, int fee, int limit) { - super(image, period, status); + public PaidSession(Image image, Period period, SessionStatus status, Course course, int fee, + int limit) { + super(image, period, status, course); this.fee = fee; this.limit = limit; } @@ -22,13 +24,13 @@ public boolean isAppliable(int pay, int order) throws CanNotApplyException { } private void validStudentsLimit(int order) throws CanNotApplyException { - if(order > limit){ + if (order > limit) { throw new CanNotApplyException("수강생이_꽉_찼습니다"); } } private void validPay(int pay) throws CanNotApplyException { - if(pay != fee){ + if (pay != fee) { throw new CanNotApplyException("수강료를 잘 못 내셨습니다."); } } diff --git a/src/main/java/nextstep/courses/domain/session/Session.java b/src/main/java/nextstep/courses/domain/session/Session.java index cffd7002d..deb6bb12c 100644 --- a/src/main/java/nextstep/courses/domain/session/Session.java +++ b/src/main/java/nextstep/courses/domain/session/Session.java @@ -1,6 +1,7 @@ package nextstep.courses.domain.session; import nextstep.courses.CanNotApplyException; +import nextstep.courses.domain.Course; import nextstep.courses.domain.Image.Image; import nextstep.courses.domain.user.NsUsers; import nextstep.users.domain.NsUser; @@ -11,11 +12,13 @@ public abstract class Session { private final Period period; private final SessionStatus status; private final NsUsers users; + private final Course course; - public Session(Image image, Period period, SessionStatus status) { + public Session(Image image, Period period, SessionStatus status, Course course) { this.image = image; this.period = period; this.status = status; + this.course = course; this.users = new NsUsers(); } diff --git a/src/test/java/nextstep/courses/domain/session/PaidSessionTest.java b/src/test/java/nextstep/courses/domain/session/PaidSessionTest.java index ae4b431fd..5bc4f05a9 100644 --- a/src/test/java/nextstep/courses/domain/session/PaidSessionTest.java +++ b/src/test/java/nextstep/courses/domain/session/PaidSessionTest.java @@ -4,6 +4,7 @@ import java.time.LocalDateTime; import nextstep.courses.CanNotApplyException; +import nextstep.courses.domain.Course; import nextstep.courses.domain.Image.Image; import nextstep.courses.domain.Image.ImageCapacity; import nextstep.courses.domain.Image.ImageSize; @@ -22,10 +23,11 @@ void init() throws Exception { LocalDateTime.of(2024, 5, 1, 13, 0), LocalDateTime.of(2024, 6, 1, 14, 0)); SessionStatus status = SessionStatus.READY; + Course course = new Course("tdd", 1L); int fee = 20000; int limit = 10; - session = new PaidSession(image, period, status, fee, limit); + session = new PaidSession(image, period, status, course, fee, limit); } @Test diff --git a/src/test/java/nextstep/courses/domain/session/SessionTest.java b/src/test/java/nextstep/courses/domain/session/SessionTest.java index 3deced5c9..a5784370d 100644 --- a/src/test/java/nextstep/courses/domain/session/SessionTest.java +++ b/src/test/java/nextstep/courses/domain/session/SessionTest.java @@ -2,6 +2,7 @@ import java.time.LocalDateTime; import nextstep.courses.CanNotApplyException; +import nextstep.courses.domain.Course; import nextstep.courses.domain.Image.Image; import nextstep.courses.domain.Image.ImageCapacity; import nextstep.courses.domain.Image.ImageSize; @@ -17,6 +18,7 @@ public class SessionTest { Image image; Period period; SessionStatus status; + Course course; Session session; @@ -27,12 +29,13 @@ void init() throws Exception { LocalDateTime.of(2024, 5, 1, 13, 0), LocalDateTime.of(2024, 6, 1, 14, 0)); status = SessionStatus.RECRUIT; + course = new Course("tdd", 1L); } @Test void 수강신청은_모집중일때만() { SessionStatus endStatus = SessionStatus.END; - session = new FreeSession(image, period, endStatus); + session = new FreeSession(image, period, endStatus, course); NsUser user = NsUserTest.JAVAJIGI; Assertions.assertThatThrownBy(() -> session.apply(0, user)) .isInstanceOf(CanNotApplyException.class); @@ -40,7 +43,7 @@ void init() throws Exception { @Test void 무료_수강신청_성공() throws Exception { - session = new FreeSession(image, period, status); + session = new FreeSession(image, period, status, course); NsUser user = NsUserTest.JAVAJIGI; session.apply(0, user); Assertions.assertThat(session.getUsers().numberOfUsers()).isEqualTo(1); @@ -48,7 +51,7 @@ void init() throws Exception { @Test void 유료_수강신청_성공() throws Exception { - session = new PaidSession(image, period, status, 20_000, 10); + session = new PaidSession(image, period, status, course, 20_000, 10); NsUser user = NsUserTest.JAVAJIGI; session.apply(20_000, user); Assertions.assertThat(session.getUsers().numberOfUsers()).isEqualTo(1); From 80b91d5700b55de954fa669e9fe47572e17a5e75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EC=A7=80=EC=9B=85?= Date: Mon, 13 May 2024 21:39:27 +0900 Subject: [PATCH 12/12] =?UTF-8?q?[feat]=20payment=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nextstep/courses/domain/session/Session.java | 15 +++++++++++++-- .../java/nextstep/payments/domain/Payments.java | 16 ++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 src/main/java/nextstep/payments/domain/Payments.java diff --git a/src/main/java/nextstep/courses/domain/session/Session.java b/src/main/java/nextstep/courses/domain/session/Session.java index deb6bb12c..6a82981ea 100644 --- a/src/main/java/nextstep/courses/domain/session/Session.java +++ b/src/main/java/nextstep/courses/domain/session/Session.java @@ -4,22 +4,28 @@ import nextstep.courses.domain.Course; import nextstep.courses.domain.Image.Image; import nextstep.courses.domain.user.NsUsers; +import nextstep.payments.domain.Payment; +import nextstep.payments.domain.Payments; import nextstep.users.domain.NsUser; public abstract class Session { + private final long id; private final Image image; private final Period period; private final SessionStatus status; private final NsUsers users; private final Course course; + private final Payments payments; public Session(Image image, Period period, SessionStatus status, Course course) { + this.id = 0L; this.image = image; this.period = period; this.status = status; this.course = course; this.users = new NsUsers(); + this.payments = new Payments(); } public NsUsers getUsers() { @@ -32,10 +38,15 @@ public void apply(int pay, NsUser user) throws Exception { validSessionStatus(); isAppliable(pay, users.numberOfUsers() + 1); users.add(user); + payments.add(toPayment(pay, user)); } - public void validSessionStatus() throws Exception { - if(!status.equals(SessionStatus.RECRUIT)){ + public Payment toPayment(int pay, NsUser user) { + return new Payment("0", id, user.getId(), (long) pay); + } + + private void validSessionStatus() throws Exception { + if (!status.equals(SessionStatus.RECRUIT)) { throw new CanNotApplyException("모집 중인 강의가 아닙니다."); } } diff --git a/src/main/java/nextstep/payments/domain/Payments.java b/src/main/java/nextstep/payments/domain/Payments.java new file mode 100644 index 000000000..1844363a0 --- /dev/null +++ b/src/main/java/nextstep/payments/domain/Payments.java @@ -0,0 +1,16 @@ +package nextstep.payments.domain; + +import java.util.ArrayList; +import java.util.List; + +public class Payments { + + private final List payments = new ArrayList<>(); + + public Payments() { + } + + public void add(Payment payment){ + payments.add(payment); + } +}