From 9c966009dd3261ee6f776fe8664911147ce44146 Mon Sep 17 00:00:00 2001 From: MoonJeWoong Date: Fri, 23 Feb 2024 21:56:43 +0900 Subject: [PATCH 1/4] =?UTF-8?q?feat:=20=EA=B0=99=EC=9D=80=20=EC=8A=A4?= =?UTF-8?q?=ED=84=B0=EB=94=94=EC=97=90=20=EC=86=8D=ED=95=9C=20=EB=8B=A4?= =?UTF-8?q?=EB=A5=B8=20=EC=9D=B8=EC=9B=90=EC=9D=98=20=EA=B8=B0=EB=A1=9D=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=EA=B0=80=20=EA=B0=80=EB=8A=A5=ED=95=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../content/service/ContentService.java | 27 ++++++++++++++++--- .../participant/domain/Participant.java | 14 +++++----- 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/backend/src/main/java/harustudy/backend/content/service/ContentService.java b/backend/src/main/java/harustudy/backend/content/service/ContentService.java index 9c3cc1bd..10a840ab 100644 --- a/backend/src/main/java/harustudy/backend/content/service/ContentService.java +++ b/backend/src/main/java/harustudy/backend/content/service/ContentService.java @@ -1,6 +1,7 @@ package harustudy.backend.content.service; import harustudy.backend.auth.dto.AuthMember; +import harustudy.backend.auth.exception.AuthorizationException; import harustudy.backend.content.domain.Content; import harustudy.backend.content.dto.ContentResponse; import harustudy.backend.content.dto.ContentsResponse; @@ -11,6 +12,7 @@ import harustudy.backend.member.domain.Member; import harustudy.backend.member.repository.MemberRepository; import harustudy.backend.participant.domain.Participant; +import harustudy.backend.participant.exception.ParticipantNotFoundException; import harustudy.backend.participant.repository.ParticipantRepository; import harustudy.backend.study.domain.Study; import harustudy.backend.study.repository.StudyRepository; @@ -33,16 +35,35 @@ public class ContentService { @Transactional(readOnly = true) public ContentsResponse findContentsWithFilter(AuthMember authMember, Long studyId, Long participantId, Integer cycle) { - Participant participant = participantRepository.findByIdIfExists(participantId); Study study = studyRepository.findByIdIfExists(studyId); + List participants = participantRepository.findByStudy(study); Member member = memberRepository.findByIdIfExists(authMember.id()); - participant.validateIsCreatedByMember(member); - participant.validateIsBelongsTo(study); + validateMemberIncludedIn(participants, member); + Participant participant = findParticipantById(participants, participantId); return getContentsResponseByCycleFilter(cycle, participant); } + private static Participant findParticipantById(List participants, Long participantId) { + return participants.stream() + .filter(participant -> participant.isSameId(participantId)) + .findFirst() + .orElseThrow(ParticipantNotFoundException::new); + } + + private List validateMemberIncludedIn(List participants, Member member) { + if (isMemberIncludedInParticipants(member, participants)) { + throw new AuthorizationException(); + } + return participants; + } + + private static boolean isMemberIncludedInParticipants(Member member, List participants) { + return participants.stream() + .noneMatch(participant -> participant.isCreatedBy(member)); + } + private ContentsResponse getContentsResponseByCycleFilter(Integer cycle, Participant participant) { List contents = participant.getContents(); if (Objects.isNull(cycle)) { diff --git a/backend/src/main/java/harustudy/backend/participant/domain/Participant.java b/backend/src/main/java/harustudy/backend/participant/domain/Participant.java index 12cbd01f..e13c8a99 100644 --- a/backend/src/main/java/harustudy/backend/participant/domain/Participant.java +++ b/backend/src/main/java/harustudy/backend/participant/domain/Participant.java @@ -76,22 +76,22 @@ public void generateContents(int totalCycle) { } } + public boolean isSameId(Long id) { + return this.id.equals(id); + } + public boolean isParticipantOf(Study study) { return this.study.getId().equals(study.getId()); } - public boolean isNotCreatedBy(Member member) { - return !this.member.getId().equals(member.getId()); + public boolean isCreatedBy(Member member) { + return this.member.getId().equals(member.getId()); } public boolean hasSameNicknameWith(Participant participant) { return this.nickname.equals(participant.nickname); } - public boolean isNotIncludedIn(Study other) { - return !study.getId().equals(other.getId()); - } - public void validateIsHost() { if (!isHost) { throw new ParticipantIsNotHostException(); @@ -105,7 +105,7 @@ public void validateIsBelongsTo(Study study) { } public void validateIsCreatedByMember(Member member) { - if (isNotCreatedBy(member)) { + if (!isCreatedBy(member)) { throw new AuthorizationException(); } } From 4668640f14eb2cb5f85dd77b45867e3c8e59fc37 Mon Sep 17 00:00:00 2001 From: MoonJeWoong Date: Fri, 23 Feb 2024 23:13:07 +0900 Subject: [PATCH 2/4] =?UTF-8?q?test:=20=EA=B0=99=EC=9D=80=20=EC=8A=A4?= =?UTF-8?q?=ED=84=B0=EB=94=94=20=EC=B0=B8=EC=97=AC=20=EB=A9=A4=EB=B2=84=20?= =?UTF-8?q?=EA=B0=84=20=EA=B8=B0=EB=A1=9D=20=EC=A1=B0=ED=9A=8C=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../content/service/ContentServiceTest.java | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/backend/src/test/java/harustudy/backend/content/service/ContentServiceTest.java b/backend/src/test/java/harustudy/backend/content/service/ContentServiceTest.java index 57ab8044..3c559059 100644 --- a/backend/src/test/java/harustudy/backend/content/service/ContentServiceTest.java +++ b/backend/src/test/java/harustudy/backend/content/service/ContentServiceTest.java @@ -6,6 +6,7 @@ import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import harustudy.backend.auth.dto.AuthMember; +import harustudy.backend.auth.exception.AuthorizationException; import harustudy.backend.content.domain.Content; import harustudy.backend.content.dto.ContentResponse; import harustudy.backend.content.dto.ContentsResponse; @@ -45,6 +46,7 @@ class ContentServiceTest { private Study study; private Member member; + private Member member2; private Participant participant; private Content content; @@ -52,12 +54,13 @@ class ContentServiceTest { void setUp() { study = new Study("studyName", 1, 20); member = new Member("nickname", "email", "imageUrl", LoginType.GUEST); + member2 = new Member("nickname2", "email2", "imageUrl2", LoginType.GUEST); participant = Participant.createParticipantOfStudy(study, member, "nickname"); - content = new Content(participant, 1); entityManager.persist(study); entityManager.persist(member); + entityManager.persist(member2); entityManager.persist(participant); entityManager.persist(content); @@ -224,6 +227,26 @@ void setUp() { assertThat(content).isEqualTo(expectedContentResponses); } + @Test + void 스터디원은_같은_스터디_내_다른_멤버의_콘텐츠를_조회할_수_있다() { + // given + AuthMember authMember = new AuthMember(member.getId()); + Participant participant2 = Participant.createParticipantOfStudy(study, member2, "nickname2"); + Content contentOfMember2 = new Content(participant2, 1); + + entityManager.persist(participant2); + entityManager.persist(contentOfMember2); + + EntityManagerUtil.flushAndClearContext(entityManager); + + // when + ContentsResponse contentsWithFilter = contentService.findContentsWithFilter(authMember, + study.getId(), participant2.getId(), null); + + // then + assertThat(contentsWithFilter.content().size()).isEqualTo(1); + } + @Test void 스터디에_참여한_특정_스터디원의_콘텐츠를_조회시_스터디가_없으면_예외를_던진다() { // given @@ -247,4 +270,14 @@ void setUp() { study.getId(), 999L, null)) .isInstanceOf(ParticipantNotFoundException.class); } + + @Test + void 같은_스터디에_참여하지_않은_멤버가_다른_스터디_멤버의_콘텐츠를_조회하면_예외를_던진다() { + // given + AuthMember authMember = new AuthMember(member2.getId()); + + // when, then + assertThatThrownBy(() -> contentService.findContentsWithFilter(authMember, + study.getId(), participant.getId(), null)).isInstanceOf(AuthorizationException.class); + } } From 44dcbd30f1e205cba6e3275215927560171e512b Mon Sep 17 00:00:00 2001 From: MoonJeWoong Date: Fri, 23 Feb 2024 23:20:40 +0900 Subject: [PATCH 3/4] =?UTF-8?q?refactor:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20static=20=ED=82=A4=EC=9B=8C=EB=93=9C=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0=20=EB=B0=8F=20=EB=B0=98=ED=99=98=20=ED=83=80=EC=9E=85?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../content/service/ContentService.java | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/backend/src/main/java/harustudy/backend/content/service/ContentService.java b/backend/src/main/java/harustudy/backend/content/service/ContentService.java index 10a840ab..dc7e6598 100644 --- a/backend/src/main/java/harustudy/backend/content/service/ContentService.java +++ b/backend/src/main/java/harustudy/backend/content/service/ContentService.java @@ -45,25 +45,24 @@ public ContentsResponse findContentsWithFilter(AuthMember authMember, Long study return getContentsResponseByCycleFilter(cycle, participant); } - private static Participant findParticipantById(List participants, Long participantId) { - return participants.stream() - .filter(participant -> participant.isSameId(participantId)) - .findFirst() - .orElseThrow(ParticipantNotFoundException::new); - } - - private List validateMemberIncludedIn(List participants, Member member) { + private void validateMemberIncludedIn(List participants, Member member) { if (isMemberIncludedInParticipants(member, participants)) { throw new AuthorizationException(); } - return participants; } - private static boolean isMemberIncludedInParticipants(Member member, List participants) { + private boolean isMemberIncludedInParticipants(Member member, List participants) { return participants.stream() .noneMatch(participant -> participant.isCreatedBy(member)); } + private Participant findParticipantById(List participants, Long participantId) { + return participants.stream() + .filter(participant -> participant.isSameId(participantId)) + .findFirst() + .orElseThrow(ParticipantNotFoundException::new); + } + private ContentsResponse getContentsResponseByCycleFilter(Integer cycle, Participant participant) { List contents = participant.getContents(); if (Objects.isNull(cycle)) { From 7c9881058244591c173d8150948c80d83ed93010 Mon Sep 17 00:00:00 2001 From: MoonJeWoong Date: Wed, 28 Feb 2024 21:37:13 +0900 Subject: [PATCH 4/4] =?UTF-8?q?refactor:=20=EC=9E=98=EB=AA=BB=EB=90=9C=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=EB=AA=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../harustudy/backend/content/service/ContentService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/main/java/harustudy/backend/content/service/ContentService.java b/backend/src/main/java/harustudy/backend/content/service/ContentService.java index dc7e6598..2c6af045 100644 --- a/backend/src/main/java/harustudy/backend/content/service/ContentService.java +++ b/backend/src/main/java/harustudy/backend/content/service/ContentService.java @@ -46,12 +46,12 @@ public ContentsResponse findContentsWithFilter(AuthMember authMember, Long study } private void validateMemberIncludedIn(List participants, Member member) { - if (isMemberIncludedInParticipants(member, participants)) { + if (isMemberNotIncludedInParticipants(member, participants)) { throw new AuthorizationException(); } } - private boolean isMemberIncludedInParticipants(Member member, List participants) { + private boolean isMemberNotIncludedInParticipants(Member member, List participants) { return participants.stream() .noneMatch(participant -> participant.isCreatedBy(member)); }