From f90aa58b356c5e69e9b4a346e6c4b632cb571a42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=A7=84=ED=98=81?= Date: Tue, 13 Sep 2022 14:59:19 +0900 Subject: [PATCH 01/40] =?UTF-8?q?refactor:=20referenceroom=20=ED=8C=A8?= =?UTF-8?q?=ED=82=A4=EC=A7=80=20studyroom=20=ED=8C=A8=ED=82=A4=EC=A7=80?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/repository/JpaLinkRepository.java | 7 ----- .../domain/repository/LinkRepository.java | 11 ------- .../service/response/AuthorResponse.java | 31 ------------------- .../moamoa/study/domain/Study.java | 2 +- .../controller/ArticleController.java | 4 +-- .../controller/ReferenceRoomController.java | 8 ++--- .../SearchingReferenceRoomController.java | 6 ++-- .../converter/ArticleTypeConverter.java | 2 +- .../moamoa/studyroom/domain/Accessor.java | 4 +-- .../domain/PermittedParticipants.java | 4 +-- .../moamoa/studyroom/domain/StudyRoom.java | 6 +++- .../domain/{ => article}/Article.java | 4 ++- .../domain/{ => article}/ArticleType.java | 2 +- .../domain/article}/Author.java | 2 +- .../{ => article}/CommunityArticle.java | 6 ++-- .../domain/article}/Link.java | 6 ++-- .../domain/{ => article}/NoticeArticle.java | 6 ++-- .../repository/article/ArticleRepository.java | 4 +-- .../article/ArticleRepositoryFactory.java | 4 +-- .../article/CommunityArticleRepository.java | 4 +-- .../repository/article/LinkRepository.java | 12 +++++++ .../article/NoticeArticleRepository.java | 4 +-- .../moamoa/studyroom/query/ArticleDao.java | 2 +- .../query/LinkDao.java | 4 +-- .../query/data/LinkData.java | 2 +- .../studyroom/service/ArticleService.java | 4 +-- .../service/ReferenceRoomService.java | 18 +++++------ .../SearchingReferenceRoomService.java | 10 +++--- .../exception/LinkNotFoundException.java | 2 +- .../exception/NotCreatingLinkException.java | 2 +- .../exception/NotLinkAuthorException.java | 2 +- .../NotParticipatedMemberException.java | 2 +- .../exception/NotRelatedLinkException.java | 2 +- .../service/request/CreatingLinkRequest.java | 6 ++-- .../service/request/EditingLinkRequest.java | 6 ++-- .../service/response/LinkResponse.java | 4 +-- .../service/response/LinksResponse.java | 4 +-- .../acceptance/steps/StudyRelatedSteps.java | 2 +- .../ReferenceRoomAcceptanceTest.java | 12 +++---- .../com/woowacourse/moamoa/WebMVCTest.java | 4 +-- .../moamoa/study/domain/StudyTest.java | 2 +- .../controller/ArticleControllerTest.java | 10 +++--- .../DeletingArticleControllerTest.java | 4 +-- .../GettingArticleControllerTest.java | 5 ++- ...mmunityArticleSummariesControllerTest.java | 5 ++- .../ReferenceRoomControllerTest.java | 16 +++++----- .../SearchingReferenceRoomControllerTest.java | 22 ++++++------- .../UpdatingArticleControllerTest.java | 6 ++-- .../moamoa/studyroom/domain/ArticleTest.java | 3 +- .../domain/LinkTest.java | 8 +++-- .../query/LinkDaoTest.java | 12 +++---- .../webmvc/ReferenceRoomWebMvcTest.java | 4 +-- 52 files changed, 149 insertions(+), 175 deletions(-) delete mode 100644 backend/src/main/java/com/woowacourse/moamoa/referenceroom/domain/repository/JpaLinkRepository.java delete mode 100644 backend/src/main/java/com/woowacourse/moamoa/referenceroom/domain/repository/LinkRepository.java delete mode 100644 backend/src/main/java/com/woowacourse/moamoa/referenceroom/service/response/AuthorResponse.java rename backend/src/main/java/com/woowacourse/moamoa/{referenceroom => studyroom}/controller/ReferenceRoomController.java (88%) rename backend/src/main/java/com/woowacourse/moamoa/{referenceroom => studyroom}/controller/SearchingReferenceRoomController.java (84%) rename backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/{ => article}/Article.java (90%) rename backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/{ => article}/ArticleType.java (69%) rename backend/src/main/java/com/woowacourse/moamoa/{referenceroom/domain => studyroom/domain/article}/Author.java (87%) rename backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/{ => article}/CommunityArticle.java (88%) rename backend/src/main/java/com/woowacourse/moamoa/{referenceroom/domain => studyroom/domain/article}/Link.java (90%) rename backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/{ => article}/NoticeArticle.java (88%) create mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/LinkRepository.java rename backend/src/main/java/com/woowacourse/moamoa/{referenceroom => studyroom}/query/LinkDao.java (96%) rename backend/src/main/java/com/woowacourse/moamoa/{referenceroom => studyroom}/query/data/LinkData.java (90%) rename backend/src/main/java/com/woowacourse/moamoa/{referenceroom => studyroom}/service/ReferenceRoomService.java (81%) rename backend/src/main/java/com/woowacourse/moamoa/{referenceroom => studyroom}/service/SearchingReferenceRoomService.java (81%) rename backend/src/main/java/com/woowacourse/moamoa/{referenceroom => studyroom}/service/exception/LinkNotFoundException.java (78%) rename backend/src/main/java/com/woowacourse/moamoa/{referenceroom => studyroom}/service/exception/NotCreatingLinkException.java (79%) rename backend/src/main/java/com/woowacourse/moamoa/{referenceroom => studyroom}/service/exception/NotLinkAuthorException.java (79%) rename backend/src/main/java/com/woowacourse/moamoa/{referenceroom => studyroom}/service/exception/NotParticipatedMemberException.java (80%) rename backend/src/main/java/com/woowacourse/moamoa/{referenceroom => studyroom}/service/exception/NotRelatedLinkException.java (80%) rename backend/src/main/java/com/woowacourse/moamoa/{referenceroom => studyroom}/service/request/CreatingLinkRequest.java (81%) rename backend/src/main/java/com/woowacourse/moamoa/{referenceroom => studyroom}/service/request/EditingLinkRequest.java (81%) rename backend/src/main/java/com/woowacourse/moamoa/{referenceroom => studyroom}/service/response/LinkResponse.java (86%) rename backend/src/main/java/com/woowacourse/moamoa/{referenceroom => studyroom}/service/response/LinksResponse.java (84%) rename backend/src/test/java/com/woowacourse/acceptance/test/{referenceroom => studyroom}/ReferenceRoomAcceptanceTest.java (97%) rename backend/src/test/java/com/woowacourse/moamoa/{referenceroom => studyroom}/controller/ReferenceRoomControllerTest.java (89%) rename backend/src/test/java/com/woowacourse/moamoa/{referenceroom => studyroom}/controller/SearchingReferenceRoomControllerTest.java (90%) rename backend/src/test/java/com/woowacourse/moamoa/{referenceroom => studyroom}/domain/LinkTest.java (90%) rename backend/src/test/java/com/woowacourse/moamoa/{referenceroom => studyroom}/query/LinkDaoTest.java (93%) rename backend/src/test/java/com/woowacourse/moamoa/{referenceroom => studyroom}/webmvc/ReferenceRoomWebMvcTest.java (97%) diff --git a/backend/src/main/java/com/woowacourse/moamoa/referenceroom/domain/repository/JpaLinkRepository.java b/backend/src/main/java/com/woowacourse/moamoa/referenceroom/domain/repository/JpaLinkRepository.java deleted file mode 100644 index 256156e0d..000000000 --- a/backend/src/main/java/com/woowacourse/moamoa/referenceroom/domain/repository/JpaLinkRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.woowacourse.moamoa.referenceroom.domain.repository; - -import com.woowacourse.moamoa.referenceroom.domain.Link; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface JpaLinkRepository extends JpaRepository, LinkRepository { -} diff --git a/backend/src/main/java/com/woowacourse/moamoa/referenceroom/domain/repository/LinkRepository.java b/backend/src/main/java/com/woowacourse/moamoa/referenceroom/domain/repository/LinkRepository.java deleted file mode 100644 index bb21d63c7..000000000 --- a/backend/src/main/java/com/woowacourse/moamoa/referenceroom/domain/repository/LinkRepository.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.woowacourse.moamoa.referenceroom.domain.repository; - -import com.woowacourse.moamoa.referenceroom.domain.Link; -import java.util.Optional; - -public interface LinkRepository { - - Link save(Link link); - - Optional findById(Long id); -} diff --git a/backend/src/main/java/com/woowacourse/moamoa/referenceroom/service/response/AuthorResponse.java b/backend/src/main/java/com/woowacourse/moamoa/referenceroom/service/response/AuthorResponse.java deleted file mode 100644 index 7083d0344..000000000 --- a/backend/src/main/java/com/woowacourse/moamoa/referenceroom/service/response/AuthorResponse.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.woowacourse.moamoa.referenceroom.service.response; - -import com.fasterxml.jackson.annotation.JsonProperty; -import com.woowacourse.moamoa.member.query.data.MemberData; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.ToString; - -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@AllArgsConstructor -@Getter -@EqualsAndHashCode -@ToString -public class AuthorResponse { - - @JsonProperty("id") - private Long githubId; - - private String username; - - private String imageUrl; - - private String profileUrl; - - public AuthorResponse(final MemberData memberData) { - this(memberData.getGithubId(), memberData.getUsername(), memberData.getImageUrl(), memberData.getProfileUrl()); - } -} diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Study.java b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Study.java index 7d08b4b88..64fb00e9a 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Study.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Study.java @@ -4,7 +4,7 @@ import static lombok.AccessLevel.PROTECTED; import com.woowacourse.moamoa.common.exception.UnauthorizedException; -import com.woowacourse.moamoa.referenceroom.service.exception.NotParticipatedMemberException; +import com.woowacourse.moamoa.studyroom.service.exception.NotParticipatedMemberException; import com.woowacourse.moamoa.study.domain.exception.InvalidPeriodException; import com.woowacourse.moamoa.study.service.exception.FailureParticipationException; import com.woowacourse.moamoa.study.service.exception.InvalidUpdatingException; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/ArticleController.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/ArticleController.java index 435b4113b..97b66d20a 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/ArticleController.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/ArticleController.java @@ -1,8 +1,8 @@ package com.woowacourse.moamoa.studyroom.controller; import com.woowacourse.moamoa.auth.config.AuthenticatedMember; -import com.woowacourse.moamoa.studyroom.domain.Article; -import com.woowacourse.moamoa.studyroom.domain.ArticleType; +import com.woowacourse.moamoa.studyroom.domain.article.Article; +import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; import com.woowacourse.moamoa.studyroom.service.ArticleService; import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; import com.woowacourse.moamoa.studyroom.service.response.ArticleResponse; diff --git a/backend/src/main/java/com/woowacourse/moamoa/referenceroom/controller/ReferenceRoomController.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/ReferenceRoomController.java similarity index 88% rename from backend/src/main/java/com/woowacourse/moamoa/referenceroom/controller/ReferenceRoomController.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/ReferenceRoomController.java index 48887ba41..aad3b6d89 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/referenceroom/controller/ReferenceRoomController.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/ReferenceRoomController.java @@ -1,9 +1,9 @@ -package com.woowacourse.moamoa.referenceroom.controller; +package com.woowacourse.moamoa.studyroom.controller; import com.woowacourse.moamoa.auth.config.AuthenticationPrincipal; -import com.woowacourse.moamoa.referenceroom.service.ReferenceRoomService; -import com.woowacourse.moamoa.referenceroom.service.request.CreatingLinkRequest; -import com.woowacourse.moamoa.referenceroom.service.request.EditingLinkRequest; +import com.woowacourse.moamoa.studyroom.service.ReferenceRoomService; +import com.woowacourse.moamoa.studyroom.service.request.CreatingLinkRequest; +import com.woowacourse.moamoa.studyroom.service.request.EditingLinkRequest; import java.net.URI; import javax.validation.Valid; import lombok.RequiredArgsConstructor; diff --git a/backend/src/main/java/com/woowacourse/moamoa/referenceroom/controller/SearchingReferenceRoomController.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/SearchingReferenceRoomController.java similarity index 84% rename from backend/src/main/java/com/woowacourse/moamoa/referenceroom/controller/SearchingReferenceRoomController.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/SearchingReferenceRoomController.java index d7554e63b..b19aa2b38 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/referenceroom/controller/SearchingReferenceRoomController.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/SearchingReferenceRoomController.java @@ -1,8 +1,8 @@ -package com.woowacourse.moamoa.referenceroom.controller; +package com.woowacourse.moamoa.studyroom.controller; import com.woowacourse.moamoa.auth.config.AuthenticationPrincipal; -import com.woowacourse.moamoa.referenceroom.service.SearchingReferenceRoomService; -import com.woowacourse.moamoa.referenceroom.service.response.LinksResponse; +import com.woowacourse.moamoa.studyroom.service.SearchingReferenceRoomService; +import com.woowacourse.moamoa.studyroom.service.response.LinksResponse; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Pageable; import org.springframework.data.web.PageableDefault; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/converter/ArticleTypeConverter.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/converter/ArticleTypeConverter.java index bdb8eabb8..4192d355a 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/converter/ArticleTypeConverter.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/converter/ArticleTypeConverter.java @@ -1,6 +1,6 @@ package com.woowacourse.moamoa.studyroom.controller.converter; -import com.woowacourse.moamoa.studyroom.domain.ArticleType; +import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; import org.springframework.core.convert.converter.Converter; import org.springframework.stereotype.Component; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/Accessor.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/Accessor.java index 9510ed9bc..a6408c5d5 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/Accessor.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/Accessor.java @@ -10,11 +10,11 @@ public Accessor(final Long memberId, final Long studyId) { this.studyId = studyId; } - Long getStudyId() { + public Long getStudyId() { return studyId; } - Long getMemberId() { + public Long getMemberId() { return memberId; } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/PermittedParticipants.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/PermittedParticipants.java index 1916a1127..f928c1703 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/PermittedParticipants.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/PermittedParticipants.java @@ -34,11 +34,11 @@ public PermittedParticipants(final Long ownerId, final Set participants) { this.participants = participants; } - boolean isOwner(final Accessor accessor) { + public boolean isOwner(final Accessor accessor) { return ownerId.equals(accessor.getMemberId()); } - boolean isPermittedAccessor(final Accessor accessor) { + public boolean isPermittedAccessor(final Accessor accessor) { return isOwner(accessor) || participants.contains(accessor.getMemberId()); } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/StudyRoom.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/StudyRoom.java index 588428dd7..f638c893b 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/StudyRoom.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/StudyRoom.java @@ -1,6 +1,10 @@ package com.woowacourse.moamoa.studyroom.domain; import com.woowacourse.moamoa.member.service.exception.NotParticipatedMemberException; +import com.woowacourse.moamoa.studyroom.domain.article.Article; +import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; +import com.woowacourse.moamoa.studyroom.domain.article.CommunityArticle; +import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; import java.util.Objects; import java.util.Set; import javax.persistence.Column; @@ -28,7 +32,7 @@ public StudyRoom(Long studyId, Long ownerId, Set participants) { this.permittedParticipants = new PermittedParticipants(ownerId, participants); } - boolean isOwner(final Accessor accessor) { + public boolean isOwner(final Accessor accessor) { return studyId.equals(accessor.getStudyId()) && permittedParticipants.isOwner(accessor); } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/Article.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java similarity index 90% rename from backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/Article.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java index 7a2030836..849106681 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/Article.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java @@ -1,9 +1,11 @@ -package com.woowacourse.moamoa.studyroom.domain; +package com.woowacourse.moamoa.studyroom.domain.article; import static javax.persistence.GenerationType.IDENTITY; import com.woowacourse.moamoa.common.entity.BaseEntity; import com.woowacourse.moamoa.member.service.exception.NotParticipatedMemberException; +import com.woowacourse.moamoa.studyroom.domain.Accessor; +import com.woowacourse.moamoa.studyroom.domain.StudyRoom; import javax.persistence.Column; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/ArticleType.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleType.java similarity index 69% rename from backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/ArticleType.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleType.java index 8b299d329..f43413ded 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/ArticleType.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleType.java @@ -1,4 +1,4 @@ -package com.woowacourse.moamoa.studyroom.domain; +package com.woowacourse.moamoa.studyroom.domain.article; public enum ArticleType { diff --git a/backend/src/main/java/com/woowacourse/moamoa/referenceroom/domain/Author.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Author.java similarity index 87% rename from backend/src/main/java/com/woowacourse/moamoa/referenceroom/domain/Author.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Author.java index 017ba56ec..d5e4f6c23 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/referenceroom/domain/Author.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Author.java @@ -1,4 +1,4 @@ -package com.woowacourse.moamoa.referenceroom.domain; +package com.woowacourse.moamoa.studyroom.domain.article; import javax.persistence.Column; import javax.persistence.Embeddable; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/CommunityArticle.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticle.java similarity index 88% rename from backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/CommunityArticle.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticle.java index c44a6f1fa..d3937357a 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/CommunityArticle.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticle.java @@ -1,5 +1,7 @@ -package com.woowacourse.moamoa.studyroom.domain; +package com.woowacourse.moamoa.studyroom.domain.article; +import com.woowacourse.moamoa.studyroom.domain.Accessor; +import com.woowacourse.moamoa.studyroom.domain.StudyRoom; import java.util.Objects; import javax.persistence.Entity; import javax.persistence.Table; @@ -17,7 +19,7 @@ public class CommunityArticle extends Article { private String content; - CommunityArticle(final String title, final String content, final Long authorId, + public CommunityArticle(final String title, final String content, final Long authorId, final StudyRoom studyRoom) { super(null, authorId, studyRoom); this.title = title; diff --git a/backend/src/main/java/com/woowacourse/moamoa/referenceroom/domain/Link.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Link.java similarity index 90% rename from backend/src/main/java/com/woowacourse/moamoa/referenceroom/domain/Link.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Link.java index 216ee411f..cf8a63f8a 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/referenceroom/domain/Link.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Link.java @@ -1,8 +1,8 @@ -package com.woowacourse.moamoa.referenceroom.domain; +package com.woowacourse.moamoa.studyroom.domain.article; import com.woowacourse.moamoa.common.entity.BaseEntity; -import com.woowacourse.moamoa.referenceroom.service.exception.NotLinkAuthorException; -import com.woowacourse.moamoa.referenceroom.service.exception.NotRelatedLinkException; +import com.woowacourse.moamoa.studyroom.service.exception.NotLinkAuthorException; +import com.woowacourse.moamoa.studyroom.service.exception.NotRelatedLinkException; import com.woowacourse.moamoa.review.domain.AssociatedStudy; import javax.persistence.Column; import javax.persistence.Embedded; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/NoticeArticle.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticle.java similarity index 88% rename from backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/NoticeArticle.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticle.java index 2f70da4aa..e2ac823ea 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/NoticeArticle.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticle.java @@ -1,5 +1,7 @@ -package com.woowacourse.moamoa.studyroom.domain; +package com.woowacourse.moamoa.studyroom.domain.article; +import com.woowacourse.moamoa.studyroom.domain.Accessor; +import com.woowacourse.moamoa.studyroom.domain.StudyRoom; import java.util.Objects; import javax.persistence.Entity; import javax.persistence.Table; @@ -17,7 +19,7 @@ public class NoticeArticle extends Article { private String content; - NoticeArticle(final String title, final String content, final Long authorId, + public NoticeArticle(final String title, final String content, final Long authorId, final StudyRoom studyRoom) { super(null, authorId, studyRoom); this.title = title; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/ArticleRepository.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/ArticleRepository.java index 3ad14b61d..6f03a67b4 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/ArticleRepository.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/ArticleRepository.java @@ -1,7 +1,7 @@ package com.woowacourse.moamoa.studyroom.domain.repository.article; -import com.woowacourse.moamoa.studyroom.domain.Article; -import com.woowacourse.moamoa.studyroom.domain.ArticleType; +import com.woowacourse.moamoa.studyroom.domain.article.Article; +import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; import java.util.Optional; public interface ArticleRepository { diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/ArticleRepositoryFactory.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/ArticleRepositoryFactory.java index a8f159507..1d6e61ca4 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/ArticleRepositoryFactory.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/ArticleRepositoryFactory.java @@ -1,7 +1,7 @@ package com.woowacourse.moamoa.studyroom.domain.repository.article; -import com.woowacourse.moamoa.studyroom.domain.Article; -import com.woowacourse.moamoa.studyroom.domain.ArticleType; +import com.woowacourse.moamoa.studyroom.domain.article.Article; +import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; import java.util.List; import org.springframework.stereotype.Repository; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/CommunityArticleRepository.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/CommunityArticleRepository.java index a5e789b74..e738944eb 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/CommunityArticleRepository.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/CommunityArticleRepository.java @@ -1,7 +1,7 @@ package com.woowacourse.moamoa.studyroom.domain.repository.article; -import com.woowacourse.moamoa.studyroom.domain.ArticleType; -import com.woowacourse.moamoa.studyroom.domain.CommunityArticle; +import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; +import com.woowacourse.moamoa.studyroom.domain.article.CommunityArticle; import org.springframework.data.jpa.repository.JpaRepository; interface CommunityArticleRepository extends JpaRepository, ArticleRepository { diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/LinkRepository.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/LinkRepository.java new file mode 100644 index 000000000..c8fe89e75 --- /dev/null +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/LinkRepository.java @@ -0,0 +1,12 @@ +package com.woowacourse.moamoa.studyroom.domain.repository.article; + +import com.woowacourse.moamoa.studyroom.domain.article.Link; +import java.util.Optional; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface LinkRepository extends JpaRepository { + + Link save(Link link); + + Optional findById(Long id); +} diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/NoticeArticleRepository.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/NoticeArticleRepository.java index a369ce1eb..4cd25fed5 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/NoticeArticleRepository.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/NoticeArticleRepository.java @@ -1,7 +1,7 @@ package com.woowacourse.moamoa.studyroom.domain.repository.article; -import com.woowacourse.moamoa.studyroom.domain.ArticleType; -import com.woowacourse.moamoa.studyroom.domain.NoticeArticle; +import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; +import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; import org.springframework.data.jpa.repository.JpaRepository; interface NoticeArticleRepository extends JpaRepository, ArticleRepository { diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/query/ArticleDao.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/query/ArticleDao.java index 665cbf4aa..2b4cc77fa 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/query/ArticleDao.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/query/ArticleDao.java @@ -1,6 +1,6 @@ package com.woowacourse.moamoa.studyroom.query; -import com.woowacourse.moamoa.studyroom.domain.ArticleType; +import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; import com.woowacourse.moamoa.studyroom.query.data.ArticleData; import com.woowacourse.moamoa.member.query.data.MemberData; import java.time.LocalDate; diff --git a/backend/src/main/java/com/woowacourse/moamoa/referenceroom/query/LinkDao.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/query/LinkDao.java similarity index 96% rename from backend/src/main/java/com/woowacourse/moamoa/referenceroom/query/LinkDao.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/query/LinkDao.java index b9e056b0e..84472beda 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/referenceroom/query/LinkDao.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/query/LinkDao.java @@ -1,7 +1,7 @@ -package com.woowacourse.moamoa.referenceroom.query; +package com.woowacourse.moamoa.studyroom.query; import com.woowacourse.moamoa.member.query.data.MemberData; -import com.woowacourse.moamoa.referenceroom.query.data.LinkData; +import com.woowacourse.moamoa.studyroom.query.data.LinkData; import java.time.LocalDate; import java.util.List; import lombok.RequiredArgsConstructor; diff --git a/backend/src/main/java/com/woowacourse/moamoa/referenceroom/query/data/LinkData.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/query/data/LinkData.java similarity index 90% rename from backend/src/main/java/com/woowacourse/moamoa/referenceroom/query/data/LinkData.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/query/data/LinkData.java index e0d9dfbd6..4415d8bdf 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/referenceroom/query/data/LinkData.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/query/data/LinkData.java @@ -1,4 +1,4 @@ -package com.woowacourse.moamoa.referenceroom.query.data; +package com.woowacourse.moamoa.studyroom.query.data; import com.woowacourse.moamoa.member.query.data.MemberData; import java.time.LocalDate; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ArticleService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ArticleService.java index 66b86dbfa..fc52626b2 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ArticleService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ArticleService.java @@ -1,8 +1,8 @@ package com.woowacourse.moamoa.studyroom.service; import com.woowacourse.moamoa.studyroom.domain.Accessor; -import com.woowacourse.moamoa.studyroom.domain.Article; -import com.woowacourse.moamoa.studyroom.domain.ArticleType; +import com.woowacourse.moamoa.studyroom.domain.article.Article; +import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; import com.woowacourse.moamoa.studyroom.domain.StudyRoom; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepository; diff --git a/backend/src/main/java/com/woowacourse/moamoa/referenceroom/service/ReferenceRoomService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ReferenceRoomService.java similarity index 81% rename from backend/src/main/java/com/woowacourse/moamoa/referenceroom/service/ReferenceRoomService.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ReferenceRoomService.java index 74b2765d1..86ac33f20 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/referenceroom/service/ReferenceRoomService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ReferenceRoomService.java @@ -1,16 +1,16 @@ -package com.woowacourse.moamoa.referenceroom.service; +package com.woowacourse.moamoa.studyroom.service; import com.woowacourse.moamoa.member.domain.Member; import com.woowacourse.moamoa.member.domain.repository.MemberRepository; import com.woowacourse.moamoa.member.service.exception.MemberNotFoundException; -import com.woowacourse.moamoa.referenceroom.domain.Author; -import com.woowacourse.moamoa.referenceroom.domain.Link; -import com.woowacourse.moamoa.referenceroom.domain.repository.LinkRepository; -import com.woowacourse.moamoa.referenceroom.service.exception.LinkNotFoundException; -import com.woowacourse.moamoa.referenceroom.service.exception.NotCreatingLinkException; -import com.woowacourse.moamoa.referenceroom.service.exception.NotParticipatedMemberException; -import com.woowacourse.moamoa.referenceroom.service.request.CreatingLinkRequest; -import com.woowacourse.moamoa.referenceroom.service.request.EditingLinkRequest; +import com.woowacourse.moamoa.studyroom.domain.article.Author; +import com.woowacourse.moamoa.studyroom.domain.article.Link; +import com.woowacourse.moamoa.studyroom.domain.repository.article.LinkRepository; +import com.woowacourse.moamoa.studyroom.service.exception.LinkNotFoundException; +import com.woowacourse.moamoa.studyroom.service.exception.NotCreatingLinkException; +import com.woowacourse.moamoa.studyroom.service.exception.NotParticipatedMemberException; +import com.woowacourse.moamoa.studyroom.service.request.CreatingLinkRequest; +import com.woowacourse.moamoa.studyroom.service.request.EditingLinkRequest; import com.woowacourse.moamoa.review.domain.AssociatedStudy; import com.woowacourse.moamoa.study.domain.Study; import com.woowacourse.moamoa.study.domain.repository.StudyRepository; diff --git a/backend/src/main/java/com/woowacourse/moamoa/referenceroom/service/SearchingReferenceRoomService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/SearchingReferenceRoomService.java similarity index 81% rename from backend/src/main/java/com/woowacourse/moamoa/referenceroom/service/SearchingReferenceRoomService.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/service/SearchingReferenceRoomService.java index 55ad52d34..c4e77f4b5 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/referenceroom/service/SearchingReferenceRoomService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/SearchingReferenceRoomService.java @@ -1,12 +1,12 @@ -package com.woowacourse.moamoa.referenceroom.service; +package com.woowacourse.moamoa.studyroom.service; import com.woowacourse.moamoa.member.domain.Member; import com.woowacourse.moamoa.member.domain.repository.MemberRepository; import com.woowacourse.moamoa.member.service.exception.MemberNotFoundException; -import com.woowacourse.moamoa.referenceroom.query.LinkDao; -import com.woowacourse.moamoa.referenceroom.query.data.LinkData; -import com.woowacourse.moamoa.referenceroom.service.exception.NotParticipatedMemberException; -import com.woowacourse.moamoa.referenceroom.service.response.LinksResponse; +import com.woowacourse.moamoa.studyroom.query.LinkDao; +import com.woowacourse.moamoa.studyroom.query.data.LinkData; +import com.woowacourse.moamoa.studyroom.service.exception.NotParticipatedMemberException; +import com.woowacourse.moamoa.studyroom.service.response.LinksResponse; import com.woowacourse.moamoa.study.domain.Study; import com.woowacourse.moamoa.study.domain.repository.StudyRepository; import com.woowacourse.moamoa.study.service.exception.StudyNotFoundException; diff --git a/backend/src/main/java/com/woowacourse/moamoa/referenceroom/service/exception/LinkNotFoundException.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/LinkNotFoundException.java similarity index 78% rename from backend/src/main/java/com/woowacourse/moamoa/referenceroom/service/exception/LinkNotFoundException.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/LinkNotFoundException.java index 74ccc2868..6ea7c82bf 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/referenceroom/service/exception/LinkNotFoundException.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/LinkNotFoundException.java @@ -1,4 +1,4 @@ -package com.woowacourse.moamoa.referenceroom.service.exception; +package com.woowacourse.moamoa.studyroom.service.exception; import com.woowacourse.moamoa.common.exception.NotFoundException; diff --git a/backend/src/main/java/com/woowacourse/moamoa/referenceroom/service/exception/NotCreatingLinkException.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/NotCreatingLinkException.java similarity index 79% rename from backend/src/main/java/com/woowacourse/moamoa/referenceroom/service/exception/NotCreatingLinkException.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/NotCreatingLinkException.java index 4865c198a..da45ad83f 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/referenceroom/service/exception/NotCreatingLinkException.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/NotCreatingLinkException.java @@ -1,4 +1,4 @@ -package com.woowacourse.moamoa.referenceroom.service.exception; +package com.woowacourse.moamoa.studyroom.service.exception; import com.woowacourse.moamoa.common.exception.BadRequestException; diff --git a/backend/src/main/java/com/woowacourse/moamoa/referenceroom/service/exception/NotLinkAuthorException.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/NotLinkAuthorException.java similarity index 79% rename from backend/src/main/java/com/woowacourse/moamoa/referenceroom/service/exception/NotLinkAuthorException.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/NotLinkAuthorException.java index 1110c5ebd..7f2898377 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/referenceroom/service/exception/NotLinkAuthorException.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/NotLinkAuthorException.java @@ -1,4 +1,4 @@ -package com.woowacourse.moamoa.referenceroom.service.exception; +package com.woowacourse.moamoa.studyroom.service.exception; import com.woowacourse.moamoa.common.exception.BadRequestException; diff --git a/backend/src/main/java/com/woowacourse/moamoa/referenceroom/service/exception/NotParticipatedMemberException.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/NotParticipatedMemberException.java similarity index 80% rename from backend/src/main/java/com/woowacourse/moamoa/referenceroom/service/exception/NotParticipatedMemberException.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/NotParticipatedMemberException.java index 6bc75ccb3..2565a2229 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/referenceroom/service/exception/NotParticipatedMemberException.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/NotParticipatedMemberException.java @@ -1,4 +1,4 @@ -package com.woowacourse.moamoa.referenceroom.service.exception; +package com.woowacourse.moamoa.studyroom.service.exception; import com.woowacourse.moamoa.common.exception.BadRequestException; diff --git a/backend/src/main/java/com/woowacourse/moamoa/referenceroom/service/exception/NotRelatedLinkException.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/NotRelatedLinkException.java similarity index 80% rename from backend/src/main/java/com/woowacourse/moamoa/referenceroom/service/exception/NotRelatedLinkException.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/NotRelatedLinkException.java index af18716ad..876d48f31 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/referenceroom/service/exception/NotRelatedLinkException.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/NotRelatedLinkException.java @@ -1,4 +1,4 @@ -package com.woowacourse.moamoa.referenceroom.service.exception; +package com.woowacourse.moamoa.studyroom.service.exception; import com.woowacourse.moamoa.common.exception.BadRequestException; diff --git a/backend/src/main/java/com/woowacourse/moamoa/referenceroom/service/request/CreatingLinkRequest.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/CreatingLinkRequest.java similarity index 81% rename from backend/src/main/java/com/woowacourse/moamoa/referenceroom/service/request/CreatingLinkRequest.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/CreatingLinkRequest.java index df4fd1be1..018cd5094 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/referenceroom/service/request/CreatingLinkRequest.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/CreatingLinkRequest.java @@ -1,7 +1,7 @@ -package com.woowacourse.moamoa.referenceroom.service.request; +package com.woowacourse.moamoa.studyroom.service.request; -import com.woowacourse.moamoa.referenceroom.domain.Author; -import com.woowacourse.moamoa.referenceroom.domain.Link; +import com.woowacourse.moamoa.studyroom.domain.article.Author; +import com.woowacourse.moamoa.studyroom.domain.article.Link; import com.woowacourse.moamoa.review.domain.AssociatedStudy; import javax.validation.constraints.NotBlank; import javax.validation.constraints.Size; diff --git a/backend/src/main/java/com/woowacourse/moamoa/referenceroom/service/request/EditingLinkRequest.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/EditingLinkRequest.java similarity index 81% rename from backend/src/main/java/com/woowacourse/moamoa/referenceroom/service/request/EditingLinkRequest.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/EditingLinkRequest.java index 26c304289..faa464d5c 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/referenceroom/service/request/EditingLinkRequest.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/EditingLinkRequest.java @@ -1,7 +1,7 @@ -package com.woowacourse.moamoa.referenceroom.service.request; +package com.woowacourse.moamoa.studyroom.service.request; -import com.woowacourse.moamoa.referenceroom.domain.Author; -import com.woowacourse.moamoa.referenceroom.domain.Link; +import com.woowacourse.moamoa.studyroom.domain.article.Author; +import com.woowacourse.moamoa.studyroom.domain.article.Link; import com.woowacourse.moamoa.review.domain.AssociatedStudy; import javax.validation.constraints.NotBlank; import javax.validation.constraints.Size; diff --git a/backend/src/main/java/com/woowacourse/moamoa/referenceroom/service/response/LinkResponse.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/response/LinkResponse.java similarity index 86% rename from backend/src/main/java/com/woowacourse/moamoa/referenceroom/service/response/LinkResponse.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/service/response/LinkResponse.java index 9d618b060..47ecb8a5e 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/referenceroom/service/response/LinkResponse.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/response/LinkResponse.java @@ -1,6 +1,6 @@ -package com.woowacourse.moamoa.referenceroom.service.response; +package com.woowacourse.moamoa.studyroom.service.response; -import com.woowacourse.moamoa.referenceroom.query.data.LinkData; +import com.woowacourse.moamoa.studyroom.query.data.LinkData; import java.time.LocalDate; import lombok.AccessLevel; import lombok.AllArgsConstructor; diff --git a/backend/src/main/java/com/woowacourse/moamoa/referenceroom/service/response/LinksResponse.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/response/LinksResponse.java similarity index 84% rename from backend/src/main/java/com/woowacourse/moamoa/referenceroom/service/response/LinksResponse.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/service/response/LinksResponse.java index 641d272dc..8cc82ec0a 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/referenceroom/service/response/LinksResponse.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/response/LinksResponse.java @@ -1,6 +1,6 @@ -package com.woowacourse.moamoa.referenceroom.service.response; +package com.woowacourse.moamoa.studyroom.service.response; -import com.woowacourse.moamoa.referenceroom.query.data.LinkData; +import com.woowacourse.moamoa.studyroom.query.data.LinkData; import java.util.List; import java.util.stream.Collectors; import lombok.AccessLevel; diff --git a/backend/src/test/java/com/woowacourse/acceptance/steps/StudyRelatedSteps.java b/backend/src/test/java/com/woowacourse/acceptance/steps/StudyRelatedSteps.java index 280f86f42..aabb276f3 100644 --- a/backend/src/test/java/com/woowacourse/acceptance/steps/StudyRelatedSteps.java +++ b/backend/src/test/java/com/woowacourse/acceptance/steps/StudyRelatedSteps.java @@ -4,7 +4,7 @@ import static org.springframework.http.HttpHeaders.CONTENT_TYPE; import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; -import com.woowacourse.moamoa.referenceroom.service.request.CreatingLinkRequest; +import com.woowacourse.moamoa.studyroom.service.request.CreatingLinkRequest; import com.woowacourse.moamoa.review.service.request.WriteReviewRequest; import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; import io.restassured.RestAssured; diff --git a/backend/src/test/java/com/woowacourse/acceptance/test/referenceroom/ReferenceRoomAcceptanceTest.java b/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/ReferenceRoomAcceptanceTest.java similarity index 97% rename from backend/src/test/java/com/woowacourse/acceptance/test/referenceroom/ReferenceRoomAcceptanceTest.java rename to backend/src/test/java/com/woowacourse/acceptance/test/studyroom/ReferenceRoomAcceptanceTest.java index a7a3b63c1..54b6b027a 100644 --- a/backend/src/test/java/com/woowacourse/acceptance/test/referenceroom/ReferenceRoomAcceptanceTest.java +++ b/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/ReferenceRoomAcceptanceTest.java @@ -1,4 +1,4 @@ -package com.woowacourse.acceptance.test.referenceroom; +package com.woowacourse.acceptance.test.studyroom; import static com.woowacourse.acceptance.fixture.MemberFixtures.그린론_깃허브_ID; import static com.woowacourse.acceptance.fixture.MemberFixtures.그린론_이름; @@ -30,11 +30,11 @@ import static org.springframework.restdocs.restassured3.RestAssuredRestDocumentation.document; import com.woowacourse.acceptance.AcceptanceTest; -import com.woowacourse.moamoa.referenceroom.service.request.CreatingLinkRequest; -import com.woowacourse.moamoa.referenceroom.service.request.EditingLinkRequest; -import com.woowacourse.moamoa.referenceroom.service.response.AuthorResponse; -import com.woowacourse.moamoa.referenceroom.service.response.LinkResponse; -import com.woowacourse.moamoa.referenceroom.service.response.LinksResponse; +import com.woowacourse.moamoa.studyroom.service.request.CreatingLinkRequest; +import com.woowacourse.moamoa.studyroom.service.request.EditingLinkRequest; +import com.woowacourse.moamoa.studyroom.service.response.AuthorResponse; +import com.woowacourse.moamoa.studyroom.service.response.LinkResponse; +import com.woowacourse.moamoa.studyroom.service.response.LinksResponse; import io.restassured.RestAssured; import java.time.LocalDate; import org.junit.jupiter.api.DisplayName; diff --git a/backend/src/test/java/com/woowacourse/moamoa/WebMVCTest.java b/backend/src/test/java/com/woowacourse/moamoa/WebMVCTest.java index 0aab0a5f3..2638ac164 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/WebMVCTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/WebMVCTest.java @@ -11,8 +11,8 @@ import com.woowacourse.moamoa.common.MockedServiceObjectsBeanRegister; import com.woowacourse.moamoa.member.domain.Member; import com.woowacourse.moamoa.member.domain.repository.MemberRepository; -import com.woowacourse.moamoa.referenceroom.service.ReferenceRoomService; -import com.woowacourse.moamoa.referenceroom.service.SearchingReferenceRoomService; +import com.woowacourse.moamoa.studyroom.service.ReferenceRoomService; +import com.woowacourse.moamoa.studyroom.service.SearchingReferenceRoomService; import java.util.Optional; import javax.servlet.http.HttpServletRequest; diff --git a/backend/src/test/java/com/woowacourse/moamoa/study/domain/StudyTest.java b/backend/src/test/java/com/woowacourse/moamoa/study/domain/StudyTest.java index 19e8937ed..f38befca5 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/study/domain/StudyTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/study/domain/StudyTest.java @@ -12,7 +12,7 @@ import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; -import com.woowacourse.moamoa.referenceroom.service.exception.NotParticipatedMemberException; +import com.woowacourse.moamoa.studyroom.service.exception.NotParticipatedMemberException; import com.woowacourse.moamoa.study.domain.exception.InvalidPeriodException; import com.woowacourse.moamoa.study.service.exception.FailureParticipationException; import com.woowacourse.moamoa.study.service.exception.OwnerCanNotLeaveException; diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/ArticleControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/ArticleControllerTest.java index 5ca721134..ba436800d 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/ArticleControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/ArticleControllerTest.java @@ -1,7 +1,7 @@ package com.woowacourse.moamoa.studyroom.controller; -import static com.woowacourse.moamoa.studyroom.domain.ArticleType.COMMUNITY; -import static com.woowacourse.moamoa.studyroom.domain.ArticleType.NOTICE; +import static com.woowacourse.moamoa.studyroom.domain.article.ArticleType.COMMUNITY; +import static com.woowacourse.moamoa.studyroom.domain.article.ArticleType.NOTICE; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -14,9 +14,9 @@ import com.woowacourse.moamoa.study.service.StudyService; import com.woowacourse.moamoa.study.service.exception.StudyNotFoundException; import com.woowacourse.moamoa.study.service.request.StudyRequestBuilder; -import com.woowacourse.moamoa.studyroom.domain.Article; -import com.woowacourse.moamoa.studyroom.domain.CommunityArticle; -import com.woowacourse.moamoa.studyroom.domain.NoticeArticle; +import com.woowacourse.moamoa.studyroom.domain.article.Article; +import com.woowacourse.moamoa.studyroom.domain.article.CommunityArticle; +import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; import com.woowacourse.moamoa.studyroom.domain.StudyRoom; import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepositoryFactory; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/DeletingArticleControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/DeletingArticleControllerTest.java index b64397467..4e8108cc1 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/DeletingArticleControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/DeletingArticleControllerTest.java @@ -1,6 +1,6 @@ package com.woowacourse.moamoa.studyroom.controller; -import static com.woowacourse.moamoa.studyroom.domain.ArticleType.COMMUNITY; +import static com.woowacourse.moamoa.studyroom.domain.article.ArticleType.COMMUNITY; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -12,7 +12,7 @@ import com.woowacourse.moamoa.study.domain.repository.StudyRepository; import com.woowacourse.moamoa.study.service.StudyService; import com.woowacourse.moamoa.study.service.request.StudyRequestBuilder; -import com.woowacourse.moamoa.studyroom.domain.Article; +import com.woowacourse.moamoa.studyroom.domain.article.Article; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepositoryFactory; diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingArticleControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingArticleControllerTest.java index e40c53ebd..089c13c02 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingArticleControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingArticleControllerTest.java @@ -1,6 +1,6 @@ package com.woowacourse.moamoa.studyroom.controller; -import static com.woowacourse.moamoa.studyroom.domain.ArticleType.*; +import static com.woowacourse.moamoa.studyroom.domain.article.ArticleType.*; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -12,8 +12,7 @@ import com.woowacourse.moamoa.study.domain.repository.StudyRepository; import com.woowacourse.moamoa.study.service.StudyService; import com.woowacourse.moamoa.study.service.request.StudyRequestBuilder; -import com.woowacourse.moamoa.studyroom.domain.Article; -import com.woowacourse.moamoa.studyroom.domain.ArticleType; +import com.woowacourse.moamoa.studyroom.domain.article.Article; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepositoryFactory; import com.woowacourse.moamoa.studyroom.query.ArticleDao; diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingCommunityArticleSummariesControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingCommunityArticleSummariesControllerTest.java index 22bdb98a5..420b37541 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingCommunityArticleSummariesControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingCommunityArticleSummariesControllerTest.java @@ -1,13 +1,12 @@ package com.woowacourse.moamoa.studyroom.controller; -import static com.woowacourse.moamoa.studyroom.domain.ArticleType.*; +import static com.woowacourse.moamoa.studyroom.domain.article.ArticleType.*; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import com.woowacourse.moamoa.common.RepositoryTest; import com.woowacourse.moamoa.common.utils.DateTimeSystem; -import com.woowacourse.moamoa.studyroom.domain.Article; -import com.woowacourse.moamoa.studyroom.domain.ArticleType; +import com.woowacourse.moamoa.studyroom.domain.article.Article; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepositoryFactory; import com.woowacourse.moamoa.studyroom.query.ArticleDao; diff --git a/backend/src/test/java/com/woowacourse/moamoa/referenceroom/controller/ReferenceRoomControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/ReferenceRoomControllerTest.java similarity index 89% rename from backend/src/test/java/com/woowacourse/moamoa/referenceroom/controller/ReferenceRoomControllerTest.java rename to backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/ReferenceRoomControllerTest.java index d9f760e07..30a4b300e 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/referenceroom/controller/ReferenceRoomControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/ReferenceRoomControllerTest.java @@ -1,4 +1,4 @@ -package com.woowacourse.moamoa.referenceroom.controller; +package com.woowacourse.moamoa.studyroom.controller; import static com.woowacourse.moamoa.fixtures.MemberFixtures.디우; import static com.woowacourse.moamoa.fixtures.MemberFixtures.디우_깃허브_아이디; @@ -11,13 +11,13 @@ import com.woowacourse.moamoa.common.RepositoryTest; import com.woowacourse.moamoa.common.utils.DateTimeSystem; import com.woowacourse.moamoa.member.domain.repository.MemberRepository; -import com.woowacourse.moamoa.referenceroom.domain.repository.LinkRepository; -import com.woowacourse.moamoa.referenceroom.service.ReferenceRoomService; -import com.woowacourse.moamoa.referenceroom.service.exception.LinkNotFoundException; -import com.woowacourse.moamoa.referenceroom.service.exception.NotCreatingLinkException; -import com.woowacourse.moamoa.referenceroom.service.exception.NotParticipatedMemberException; -import com.woowacourse.moamoa.referenceroom.service.request.CreatingLinkRequest; -import com.woowacourse.moamoa.referenceroom.service.request.EditingLinkRequest; +import com.woowacourse.moamoa.studyroom.domain.repository.article.LinkRepository; +import com.woowacourse.moamoa.studyroom.service.ReferenceRoomService; +import com.woowacourse.moamoa.studyroom.service.exception.LinkNotFoundException; +import com.woowacourse.moamoa.studyroom.service.exception.NotCreatingLinkException; +import com.woowacourse.moamoa.studyroom.service.exception.NotParticipatedMemberException; +import com.woowacourse.moamoa.studyroom.service.request.CreatingLinkRequest; +import com.woowacourse.moamoa.studyroom.service.request.EditingLinkRequest; import com.woowacourse.moamoa.study.domain.repository.StudyRepository; import com.woowacourse.moamoa.study.service.StudyParticipantService; import com.woowacourse.moamoa.study.service.StudyService; diff --git a/backend/src/test/java/com/woowacourse/moamoa/referenceroom/controller/SearchingReferenceRoomControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/SearchingReferenceRoomControllerTest.java similarity index 90% rename from backend/src/test/java/com/woowacourse/moamoa/referenceroom/controller/SearchingReferenceRoomControllerTest.java rename to backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/SearchingReferenceRoomControllerTest.java index 7911f7b87..52b81a674 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/referenceroom/controller/SearchingReferenceRoomControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/SearchingReferenceRoomControllerTest.java @@ -1,4 +1,4 @@ -package com.woowacourse.moamoa.referenceroom.controller; +package com.woowacourse.moamoa.studyroom.controller; import static com.woowacourse.moamoa.fixtures.MemberFixtures.그린론; import static com.woowacourse.moamoa.fixtures.MemberFixtures.그린론_깃허브_아이디; @@ -23,16 +23,16 @@ import com.woowacourse.moamoa.common.utils.DateTimeSystem; import com.woowacourse.moamoa.member.domain.Member; import com.woowacourse.moamoa.member.domain.repository.MemberRepository; -import com.woowacourse.moamoa.referenceroom.domain.Link; -import com.woowacourse.moamoa.referenceroom.domain.repository.LinkRepository; -import com.woowacourse.moamoa.referenceroom.query.LinkDao; -import com.woowacourse.moamoa.referenceroom.query.data.LinkData; -import com.woowacourse.moamoa.referenceroom.service.ReferenceRoomService; -import com.woowacourse.moamoa.referenceroom.service.SearchingReferenceRoomService; -import com.woowacourse.moamoa.referenceroom.service.exception.NotParticipatedMemberException; -import com.woowacourse.moamoa.referenceroom.service.request.CreatingLinkRequest; -import com.woowacourse.moamoa.referenceroom.service.response.LinkResponse; -import com.woowacourse.moamoa.referenceroom.service.response.LinksResponse; +import com.woowacourse.moamoa.studyroom.domain.article.Link; +import com.woowacourse.moamoa.studyroom.domain.repository.article.LinkRepository; +import com.woowacourse.moamoa.studyroom.query.LinkDao; +import com.woowacourse.moamoa.studyroom.query.data.LinkData; +import com.woowacourse.moamoa.studyroom.service.ReferenceRoomService; +import com.woowacourse.moamoa.studyroom.service.SearchingReferenceRoomService; +import com.woowacourse.moamoa.studyroom.service.exception.NotParticipatedMemberException; +import com.woowacourse.moamoa.studyroom.service.request.CreatingLinkRequest; +import com.woowacourse.moamoa.studyroom.service.response.LinkResponse; +import com.woowacourse.moamoa.studyroom.service.response.LinksResponse; import com.woowacourse.moamoa.study.domain.Study; import com.woowacourse.moamoa.study.domain.repository.StudyRepository; import com.woowacourse.moamoa.study.service.StudyParticipantService; diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/UpdatingArticleControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/UpdatingArticleControllerTest.java index 8014e1e1d..9a7b3dda5 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/UpdatingArticleControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/UpdatingArticleControllerTest.java @@ -1,6 +1,6 @@ package com.woowacourse.moamoa.studyroom.controller; -import static com.woowacourse.moamoa.studyroom.domain.ArticleType.COMMUNITY; +import static com.woowacourse.moamoa.studyroom.domain.article.ArticleType.COMMUNITY; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -12,8 +12,8 @@ import com.woowacourse.moamoa.study.domain.repository.StudyRepository; import com.woowacourse.moamoa.study.service.StudyService; import com.woowacourse.moamoa.study.service.request.StudyRequestBuilder; -import com.woowacourse.moamoa.studyroom.domain.Article; -import com.woowacourse.moamoa.studyroom.domain.CommunityArticle; +import com.woowacourse.moamoa.studyroom.domain.article.Article; +import com.woowacourse.moamoa.studyroom.domain.article.CommunityArticle; import com.woowacourse.moamoa.studyroom.domain.StudyRoom; import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepositoryFactory; diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/ArticleTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/ArticleTest.java index 54500f51d..ef1f7ac4d 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/ArticleTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/ArticleTest.java @@ -1,11 +1,12 @@ package com.woowacourse.moamoa.studyroom.domain; -import static com.woowacourse.moamoa.studyroom.domain.ArticleType.COMMUNITY; +import static com.woowacourse.moamoa.studyroom.domain.article.ArticleType.COMMUNITY; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import com.woowacourse.moamoa.member.domain.Member; import com.woowacourse.moamoa.member.service.exception.NotParticipatedMemberException; +import com.woowacourse.moamoa.studyroom.domain.article.Article; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; diff --git a/backend/src/test/java/com/woowacourse/moamoa/referenceroom/domain/LinkTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/LinkTest.java similarity index 90% rename from backend/src/test/java/com/woowacourse/moamoa/referenceroom/domain/LinkTest.java rename to backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/LinkTest.java index 103643af2..635addc85 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/referenceroom/domain/LinkTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/LinkTest.java @@ -1,11 +1,13 @@ -package com.woowacourse.moamoa.referenceroom.domain; +package com.woowacourse.moamoa.studyroom.domain; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertAll; -import com.woowacourse.moamoa.referenceroom.service.exception.NotLinkAuthorException; -import com.woowacourse.moamoa.referenceroom.service.exception.NotRelatedLinkException; +import com.woowacourse.moamoa.studyroom.domain.article.Author; +import com.woowacourse.moamoa.studyroom.domain.article.Link; +import com.woowacourse.moamoa.studyroom.service.exception.NotLinkAuthorException; +import com.woowacourse.moamoa.studyroom.service.exception.NotRelatedLinkException; import com.woowacourse.moamoa.review.domain.AssociatedStudy; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/backend/src/test/java/com/woowacourse/moamoa/referenceroom/query/LinkDaoTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/query/LinkDaoTest.java similarity index 93% rename from backend/src/test/java/com/woowacourse/moamoa/referenceroom/query/LinkDaoTest.java rename to backend/src/test/java/com/woowacourse/moamoa/studyroom/query/LinkDaoTest.java index 37d3c8468..7fb147a2c 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/referenceroom/query/LinkDaoTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/query/LinkDaoTest.java @@ -1,4 +1,4 @@ -package com.woowacourse.moamoa.referenceroom.query; +package com.woowacourse.moamoa.studyroom.query; import static com.woowacourse.moamoa.fixtures.StudyFixtures.자바_스터디_신청서; import static org.assertj.core.api.Assertions.assertThat; @@ -9,11 +9,11 @@ import com.woowacourse.moamoa.member.domain.Member; import com.woowacourse.moamoa.member.domain.repository.MemberRepository; import com.woowacourse.moamoa.member.query.data.MemberData; -import com.woowacourse.moamoa.referenceroom.domain.Link; -import com.woowacourse.moamoa.referenceroom.domain.repository.LinkRepository; -import com.woowacourse.moamoa.referenceroom.query.data.LinkData; -import com.woowacourse.moamoa.referenceroom.service.ReferenceRoomService; -import com.woowacourse.moamoa.referenceroom.service.request.CreatingLinkRequest; +import com.woowacourse.moamoa.studyroom.domain.article.Link; +import com.woowacourse.moamoa.studyroom.domain.repository.article.LinkRepository; +import com.woowacourse.moamoa.studyroom.query.data.LinkData; +import com.woowacourse.moamoa.studyroom.service.ReferenceRoomService; +import com.woowacourse.moamoa.studyroom.service.request.CreatingLinkRequest; import com.woowacourse.moamoa.study.domain.Study; import com.woowacourse.moamoa.study.domain.repository.StudyRepository; import com.woowacourse.moamoa.study.service.StudyParticipantService; diff --git a/backend/src/test/java/com/woowacourse/moamoa/referenceroom/webmvc/ReferenceRoomWebMvcTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/ReferenceRoomWebMvcTest.java similarity index 97% rename from backend/src/test/java/com/woowacourse/moamoa/referenceroom/webmvc/ReferenceRoomWebMvcTest.java rename to backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/ReferenceRoomWebMvcTest.java index 3e7e9a45f..6794ed829 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/referenceroom/webmvc/ReferenceRoomWebMvcTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/ReferenceRoomWebMvcTest.java @@ -1,4 +1,4 @@ -package com.woowacourse.moamoa.referenceroom.webmvc; +package com.woowacourse.moamoa.studyroom.webmvc; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; @@ -6,7 +6,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import com.woowacourse.moamoa.WebMVCTest; -import com.woowacourse.moamoa.referenceroom.service.request.CreatingLinkRequest; +import com.woowacourse.moamoa.studyroom.service.request.CreatingLinkRequest; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.http.HttpHeaders; From b0a3ec3bba1f49edea23e43713dd6dc58b87d684 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=A7=84=ED=98=81?= Date: Wed, 14 Sep 2022 16:52:03 +0900 Subject: [PATCH 02/40] =?UTF-8?q?refactor:=20LinkArticle=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EC=9D=B4=EB=A6=84=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?=EB=B0=8F=20=ED=95=84=EB=93=9C=20=ED=83=80=EC=9E=85=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/src/docs/asciidoc/index.html | 62 ++++---- .../common/advice/CommonControllerAdvice.java | 1 + .../controller/ReferenceRoomController.java | 17 ++- .../SearchingReferenceRoomController.java | 5 +- .../moamoa/studyroom/domain/Accessor.java | 8 + .../moamoa/studyroom/domain/StudyRoom.java | 18 ++- .../studyroom/domain/article/ArticleType.java | 2 +- .../studyroom/domain/article/Author.java | 18 --- .../moamoa/studyroom/domain/article/Link.java | 90 ----------- .../studyroom/domain/article/LinkArticle.java | 101 ++++++++++++ .../article/LinkArticleRepository.java | 12 ++ .../repository/article/LinkRepository.java | 12 -- .../studyroom/service/ArticleService.java | 4 +- .../service/ReferenceRoomService.java | 71 +++++---- .../SearchingReferenceRoomService.java | 4 +- .../exception/UneditableArticleException.java | 6 +- .../service/request/EditingLinkRequest.java | 7 - ...nkRequest.java => LinkArticleRequest.java} | 9 +- .../acceptance/steps/StudyRelatedSteps.java | 4 +- .../ReferenceRoomAcceptanceTest.java | 22 +-- .../ReferenceRoomControllerTest.java | 48 +++--- .../SearchingReferenceRoomControllerTest.java | 67 ++++---- .../moamoa/studyroom/domain/ArticleTest.java | 13 -- .../studyroom/domain/LinkArticleTest.java | 122 +++++++++++++++ .../moamoa/studyroom/domain/LinkTest.java | 89 ----------- .../studyroom/domain/StudyRoomTest.java | 144 ++++++++++++++++++ .../moamoa/studyroom/query/LinkDaoTest.java | 119 --------------- .../webmvc/ReferenceRoomWebMvcTest.java | 12 +- 28 files changed, 580 insertions(+), 507 deletions(-) delete mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Author.java delete mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Link.java create mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticle.java create mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/LinkArticleRepository.java delete mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/LinkRepository.java rename backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/{CreatingLinkRequest.java => LinkArticleRequest.java} (59%) create mode 100644 backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/LinkArticleTest.java delete mode 100644 backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/LinkTest.java create mode 100644 backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/StudyRoomTest.java delete mode 100644 backend/src/test/java/com/woowacourse/moamoa/studyroom/query/LinkDaoTest.java diff --git a/backend/src/docs/asciidoc/index.html b/backend/src/docs/asciidoc/index.html index 870bb1bbc..49f546864 100644 --- a/backend/src/docs/asciidoc/index.html +++ b/backend/src/docs/asciidoc/index.html @@ -6,7 +6,7 @@ MOAMOA - + - +
-

인증

+

인증

-

Github 로그인

+

Github 로그인

-

HTTP request

+

HTTP request

POST /api/auth/login?code=authorization-code HTTP/1.1
@@ -483,7 +483,7 @@ 

-

HTTP response

+

HTTP response

HTTP/1.1 200 OK
@@ -503,12 +503,12 @@ 

-

스터디

+

스터디

-

스터디 생성

+

스터디 생성

-

HTTP request

+

HTTP request

POST /api/studies HTTP/1.1
@@ -533,7 +533,7 @@ 

-

HTTP response

+

HTTP response

HTTP/1.1 201 Created
@@ -546,9 +546,9 @@ 

-

스터디 목록 조회

+

스터디 목록 조회

-

HTTP request

+

HTTP request

GET /api/studies?page=0&size=2 HTTP/1.1
@@ -559,7 +559,7 @@ 

-

HTTP response

+

HTTP response

HTTP/1.1 200 OK
@@ -612,12 +612,12 @@ 

-

리뷰

+

리뷰

-

리뷰 작성

+

리뷰 작성

-

HTTP request

+

HTTP request

POST /api/studies/1/reviews HTTP/1.1
@@ -634,7 +634,7 @@ 

-

HTTP response

+

HTTP response

HTTP/1.1 201 Created
@@ -647,9 +647,9 @@ 

-

리뷰 전체 조회

+

리뷰 전체 조회

-

HTTP request

+

HTTP request

GET /api/studies/1/reviews HTTP/1.1
@@ -660,7 +660,7 @@ 

-

HTTP response

+

HTTP response

HTTP/1.1 200 OK
@@ -723,9 +723,9 @@ 

-

리뷰 특정 개수 조회

+

리뷰 특정 개수 조회

-

HTTP request

+

HTTP request

GET /api/studies/1/reviews?size=2 HTTP/1.1
@@ -736,7 +736,7 @@ 

-

HTTP response

+

HTTP response

HTTP/1.1 200 OK
@@ -777,9 +777,9 @@ 

-

스터디에서 사용자 역할 조회

+

스터디에서 사용자 역할 조회

-

HTTP request

+

HTTP request

GET /api/members/me/role?study-id=3 HTTP/1.1
@@ -791,7 +791,7 @@ 

HTTP

-

Request headers

+

Request headers

@@ -812,7 +812,7 @@

@@ -833,7 +833,7 @@

-

HTTP response

+

HTTP response

HTTP/1.1 200 OK
@@ -850,7 +850,7 @@ 

HTT

diff --git a/backend/src/main/java/com/woowacourse/moamoa/common/advice/CommonControllerAdvice.java b/backend/src/main/java/com/woowacourse/moamoa/common/advice/CommonControllerAdvice.java index cb1d7fedc..4247b1548 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/common/advice/CommonControllerAdvice.java +++ b/backend/src/main/java/com/woowacourse/moamoa/common/advice/CommonControllerAdvice.java @@ -67,6 +67,7 @@ public ResponseEntity handleNotFound(final Exception e) { @ExceptionHandler(RuntimeException.class) public ResponseEntity handleInternalServerError(RuntimeException e) { log.debug("RuntimeException : {}", e.getMessage()); + e.printStackTrace(); return ResponseEntity.status(INTERNAL_SERVER_ERROR).body(new ErrorResponse("요청을 처리할 수 없습니다.")); } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/ReferenceRoomController.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/ReferenceRoomController.java index aad3b6d89..63d2f7fbc 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/ReferenceRoomController.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/ReferenceRoomController.java @@ -1,8 +1,9 @@ package com.woowacourse.moamoa.studyroom.controller; +import com.woowacourse.moamoa.auth.config.AuthenticatedMember; import com.woowacourse.moamoa.auth.config.AuthenticationPrincipal; import com.woowacourse.moamoa.studyroom.service.ReferenceRoomService; -import com.woowacourse.moamoa.studyroom.service.request.CreatingLinkRequest; +import com.woowacourse.moamoa.studyroom.service.request.LinkArticleRequest; import com.woowacourse.moamoa.studyroom.service.request.EditingLinkRequest; import java.net.URI; import javax.validation.Valid; @@ -25,32 +26,32 @@ public class ReferenceRoomController { @PostMapping public ResponseEntity createLink( - @AuthenticationPrincipal final Long githubId, + @AuthenticatedMember final Long memberId, @PathVariable("study-id") final Long studyId, - @Valid @RequestBody final CreatingLinkRequest creatingLinkRequest + @Valid @RequestBody final LinkArticleRequest linkArticleRequest ) { - final Long id = referenceRoomService.createLink(githubId, studyId, creatingLinkRequest).getId(); + final Long id = referenceRoomService.createLink(memberId, studyId, linkArticleRequest).getId(); return ResponseEntity.created(URI.create("/api/studies/" + studyId + "/reference-room/links/" + id)).build(); } @PutMapping("/{link-id}") public ResponseEntity updateLink( - @AuthenticationPrincipal final Long githubId, + @AuthenticatedMember final Long memberId, @PathVariable("study-id") final Long studyId, @PathVariable("link-id") final Long linkId, @Valid @RequestBody final EditingLinkRequest editingLinkRequest ) { - referenceRoomService.updateLink(githubId, studyId, linkId, editingLinkRequest); + referenceRoomService.updateLink(memberId, studyId, linkId, editingLinkRequest); return ResponseEntity.noContent().build(); } @DeleteMapping("/{link-id}") public ResponseEntity deleteLink( - @AuthenticationPrincipal final Long githubId, + @AuthenticatedMember final Long memberId, @PathVariable("study-id") final Long studyId, @PathVariable("link-id") final Long linkId ) { - referenceRoomService.deleteLink(githubId, studyId, linkId); + referenceRoomService.deleteLink(memberId, studyId, linkId); return ResponseEntity.noContent().build(); } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/SearchingReferenceRoomController.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/SearchingReferenceRoomController.java index b19aa2b38..c5bca9663 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/SearchingReferenceRoomController.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/SearchingReferenceRoomController.java @@ -1,5 +1,6 @@ package com.woowacourse.moamoa.studyroom.controller; +import com.woowacourse.moamoa.auth.config.AuthenticatedMember; import com.woowacourse.moamoa.auth.config.AuthenticationPrincipal; import com.woowacourse.moamoa.studyroom.service.SearchingReferenceRoomService; import com.woowacourse.moamoa.studyroom.service.response.LinksResponse; @@ -21,11 +22,11 @@ public class SearchingReferenceRoomController { @GetMapping public ResponseEntity getLinks( - @AuthenticationPrincipal final Long githubId, + @AuthenticatedMember final Long memberId, @PathVariable("study-id") final Long studyId, @PageableDefault(size = 9) final Pageable pageable ) { - final LinksResponse linksResponse = searchingReferenceRoomService.getLinks(githubId, studyId, pageable); + final LinksResponse linksResponse = searchingReferenceRoomService.getLinks(memberId, studyId, pageable); return ResponseEntity.ok().body(linksResponse); } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/Accessor.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/Accessor.java index a6408c5d5..2f366eeb6 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/Accessor.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/Accessor.java @@ -17,4 +17,12 @@ public Long getStudyId() { public Long getMemberId() { return memberId; } + + @Override + public String toString() { + return "Accessor{" + + "memberId=" + memberId + + ", studyId=" + studyId + + '}'; + } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/StudyRoom.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/StudyRoom.java index f638c893b..d7d6a6e67 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/StudyRoom.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/StudyRoom.java @@ -1,10 +1,11 @@ package com.woowacourse.moamoa.studyroom.domain; -import com.woowacourse.moamoa.member.service.exception.NotParticipatedMemberException; import com.woowacourse.moamoa.studyroom.domain.article.Article; import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; import com.woowacourse.moamoa.studyroom.domain.article.CommunityArticle; +import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; +import com.woowacourse.moamoa.studyroom.service.exception.UneditableArticleException; import java.util.Objects; import java.util.Set; import javax.persistence.Column; @@ -49,7 +50,19 @@ public Article write(final Accessor accessor, final String title, final String c return new NoticeArticle(title, content, accessor.getMemberId(), this); } - throw new NotParticipatedMemberException(); + throw new UneditableArticleException(studyId, accessor, type); + } + + public LinkArticle writeLinkArticle(final Accessor accessor, final String linkUrl, final String description) { + if (isPermittedAccessor(accessor)) { + return new LinkArticle(this, accessor.getMemberId(), linkUrl, description); + } + + throw new UneditableArticleException(studyId, accessor, ArticleType.LINK); + } + + public Long getId() { + return studyId; } @Override @@ -68,5 +81,4 @@ public boolean equals(final Object o) { public int hashCode() { return Objects.hash(studyId); } - } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleType.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleType.java index f43413ded..7136eba33 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleType.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleType.java @@ -2,7 +2,7 @@ public enum ArticleType { - COMMUNITY, NOTICE; + COMMUNITY, NOTICE, LINK; public String lowerName() { return name().toLowerCase(); diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Author.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Author.java deleted file mode 100644 index d5e4f6c23..000000000 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Author.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.woowacourse.moamoa.studyroom.domain.article; - -import javax.persistence.Column; -import javax.persistence.Embeddable; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -@Embeddable -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@AllArgsConstructor -@EqualsAndHashCode -public class Author { - - @Column(name = "member_id", nullable = false) - private Long memberId; -} diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Link.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Link.java deleted file mode 100644 index cf8a63f8a..000000000 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Link.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.woowacourse.moamoa.studyroom.domain.article; - -import com.woowacourse.moamoa.common.entity.BaseEntity; -import com.woowacourse.moamoa.studyroom.service.exception.NotLinkAuthorException; -import com.woowacourse.moamoa.studyroom.service.exception.NotRelatedLinkException; -import com.woowacourse.moamoa.review.domain.AssociatedStudy; -import javax.persistence.Column; -import javax.persistence.Embedded; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.NoArgsConstructor; -import org.hibernate.annotations.Where; - -@Entity -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@AllArgsConstructor -@Where(clause = "deleted = false") -public class Link extends BaseEntity { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Embedded - private AssociatedStudy associatedStudy; - - @Embedded - private Author author; - - @Column(nullable = false) - private String linkUrl; - - private String description; - - @Column(nullable = false) - private boolean deleted; - - public Link( - final AssociatedStudy associatedStudy, final Author author, final String linkUrl, final String description - ) { - this(null, associatedStudy, author, linkUrl, description, false); - } - - public void update(final Link updatedLink) { - validateBelongToStudy(updatedLink.associatedStudy); - validateAuthor(updatedLink.author); - - linkUrl = updatedLink.linkUrl; - description = updatedLink.description; - } - - public void delete(final AssociatedStudy associatedStudy, final Author author) { - validateBelongToStudy(associatedStudy); - validateAuthor(author); - - deleted = true; - } - - private void validateBelongToStudy(final AssociatedStudy associatedStudy) { - if (!this.associatedStudy.equals(associatedStudy)) { - throw new NotRelatedLinkException(); - } - } - - private void validateAuthor(final Author author) { - if (!this.author.equals(author)) { - throw new NotLinkAuthorException(); - } - } - - public Long getId() { - return id; - } - - public String getLinkUrl() { - return linkUrl; - } - - public String getDescription() { - return description; - } - - public boolean isDeleted() { - return deleted; - } -} diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticle.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticle.java new file mode 100644 index 000000000..667478d09 --- /dev/null +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticle.java @@ -0,0 +1,101 @@ +package com.woowacourse.moamoa.studyroom.domain.article; + +import com.woowacourse.moamoa.common.entity.BaseEntity; +import com.woowacourse.moamoa.studyroom.domain.StudyRoom; +import com.woowacourse.moamoa.studyroom.service.exception.NotLinkAuthorException; +import com.woowacourse.moamoa.studyroom.service.exception.NotRelatedLinkException; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.Where; + +@Entity +@Table(name = "link") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Where(clause = "deleted = false") +public class LinkArticle extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "study_id") + private StudyRoom studyRoom; + + @Column(name = "member_id", nullable = false) + private Long authorId; + + @Column(nullable = false) + private String linkUrl; + + private String description; + + @Column(nullable = false) + private boolean deleted; + + public LinkArticle(final StudyRoom studyRoom, final Long authorId, final String linkUrl, final String description) { + this(null, studyRoom, authorId, linkUrl, description, false); + } + + private LinkArticle(final Long id, final StudyRoom studyRoom, final Long authorId, final String linkUrl, + final String description, final boolean deleted) { + this.id = id; + this.studyRoom = studyRoom; + this.authorId = authorId; + this.linkUrl = linkUrl; + this.description = description; + this.deleted = deleted; + } + + public void update(final LinkArticle updatedLinkArticle) { + validateBelongToStudy(updatedLinkArticle.studyRoom.getId()); + validateAuthor(updatedLinkArticle.authorId); + + linkUrl = updatedLinkArticle.linkUrl; + description = updatedLinkArticle.description; + } + + public void delete(Long authorId, Long studyId) { + validateBelongToStudy(studyId); + validateAuthor(authorId); + + deleted = true; + } + + private void validateBelongToStudy(final Long associatedStudy) { + if (!this.studyRoom.getId().equals(associatedStudy)) { + throw new NotRelatedLinkException(); + } + } + + private void validateAuthor(final Long authorId) { + if (!this.authorId.equals(authorId)) { + throw new NotLinkAuthorException(); + } + } + + public Long getId() { + return id; + } + + public String getLinkUrl() { + return linkUrl; + } + + public String getDescription() { + return description; + } + + public boolean isDeleted() { + return deleted; + } +} diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/LinkArticleRepository.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/LinkArticleRepository.java new file mode 100644 index 000000000..693bc79b2 --- /dev/null +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/LinkArticleRepository.java @@ -0,0 +1,12 @@ +package com.woowacourse.moamoa.studyroom.domain.repository.article; + +import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; +import java.util.Optional; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface LinkArticleRepository extends JpaRepository { + + LinkArticle save(LinkArticle linkArticle); + + Optional findById(Long id); +} diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/LinkRepository.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/LinkRepository.java deleted file mode 100644 index c8fe89e75..000000000 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/LinkRepository.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.woowacourse.moamoa.studyroom.domain.repository.article; - -import com.woowacourse.moamoa.studyroom.domain.article.Link; -import java.util.Optional; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface LinkRepository extends JpaRepository { - - Link save(Link link); - - Optional findById(Long id); -} diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ArticleService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ArticleService.java index fc52626b2..f5269fb6a 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ArticleService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ArticleService.java @@ -75,7 +75,7 @@ public void deleteArticle(final Long memberId, final Long studyId, final Long ar .orElseThrow(() -> new ArticleNotFoundException(articleId)); if (!article.isEditableBy(new Accessor(memberId, studyId))) { - throw new UneditableArticleException(); + throw new UneditableArticleException(studyId, new Accessor(memberId, studyId), type); } articleRepositoryFactory.getRepository(type).deleteById(articleId); @@ -110,7 +110,7 @@ public void updateArticle(final Long memberId, final Long studyId, final Long ar final Accessor accessor = new Accessor(memberId, studyId); if (!article.isEditableBy(accessor)) { - throw new UneditableArticleException(); + throw new UneditableArticleException(studyId, accessor, type); } article.update(accessor, request.getTitle(), request.getContent()); diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ReferenceRoomService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ReferenceRoomService.java index 86ac33f20..9a7a48d4b 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ReferenceRoomService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ReferenceRoomService.java @@ -3,75 +3,84 @@ import com.woowacourse.moamoa.member.domain.Member; import com.woowacourse.moamoa.member.domain.repository.MemberRepository; import com.woowacourse.moamoa.member.service.exception.MemberNotFoundException; -import com.woowacourse.moamoa.studyroom.domain.article.Author; -import com.woowacourse.moamoa.studyroom.domain.article.Link; -import com.woowacourse.moamoa.studyroom.domain.repository.article.LinkRepository; -import com.woowacourse.moamoa.studyroom.service.exception.LinkNotFoundException; -import com.woowacourse.moamoa.studyroom.service.exception.NotCreatingLinkException; -import com.woowacourse.moamoa.studyroom.service.exception.NotParticipatedMemberException; -import com.woowacourse.moamoa.studyroom.service.request.CreatingLinkRequest; -import com.woowacourse.moamoa.studyroom.service.request.EditingLinkRequest; -import com.woowacourse.moamoa.review.domain.AssociatedStudy; import com.woowacourse.moamoa.study.domain.Study; import com.woowacourse.moamoa.study.domain.repository.StudyRepository; import com.woowacourse.moamoa.study.service.exception.StudyNotFoundException; -import lombok.RequiredArgsConstructor; +import com.woowacourse.moamoa.studyroom.domain.Accessor; +import com.woowacourse.moamoa.studyroom.domain.StudyRoom; +import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; +import com.woowacourse.moamoa.studyroom.domain.repository.article.LinkArticleRepository; +import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; +import com.woowacourse.moamoa.studyroom.service.exception.LinkNotFoundException; +import com.woowacourse.moamoa.studyroom.service.exception.NotParticipatedMemberException; +import com.woowacourse.moamoa.studyroom.service.request.EditingLinkRequest; +import com.woowacourse.moamoa.studyroom.service.request.LinkArticleRequest; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service @Transactional -@RequiredArgsConstructor public class ReferenceRoomService { + private final StudyRoomRepository studyRoomRepository; private final MemberRepository memberRepository; private final StudyRepository studyRepository; - private final LinkRepository linkRepository; + private final LinkArticleRepository linkArticleRepository; - public Link createLink(final Long githubId, final Long studyId, final CreatingLinkRequest creatingLinkRequest) { - final Member member = memberRepository.findByGithubId(githubId) - .orElseThrow(MemberNotFoundException::new); - final Study study = studyRepository.findById(studyId) - .orElseThrow(StudyNotFoundException::new); + public ReferenceRoomService( + final StudyRoomRepository studyRoomRepository, + final MemberRepository memberRepository, + final StudyRepository studyRepository, + final LinkArticleRepository linkArticleRepository) { + this.studyRoomRepository = studyRoomRepository; + this.memberRepository = memberRepository; + this.studyRepository = studyRepository; + this.linkArticleRepository = linkArticleRepository; + } - if (!study.isParticipant(member.getId())) { - throw new NotCreatingLinkException(); - } + public LinkArticle createLink(final Long memberId, final Long studyId, final LinkArticleRequest linkArticleRequest) { + final StudyRoom studyRoom = studyRoomRepository.findByStudyId(studyId) + .orElseThrow(StudyNotFoundException::new); + final LinkArticle linkArticle = studyRoom.writeLinkArticle( + new Accessor(memberId, studyId), linkArticleRequest.getLinkUrl(), linkArticleRequest.getDescription()); - final Link link = creatingLinkRequest.toLink(studyId, member.getId()); - return linkRepository.save(link); + return linkArticleRepository.save(linkArticle); } public void updateLink( - final Long githubId, final Long studyId, final Long linkId, final EditingLinkRequest editingLinkRequest + final Long memberId, final Long studyId, final Long linkId, final EditingLinkRequest editingLinkRequest ) { - final Member member = memberRepository.findByGithubId(githubId) + final Member member = memberRepository.findById(memberId) .orElseThrow(MemberNotFoundException::new); final Study study = studyRepository.findById(studyId) .orElseThrow(StudyNotFoundException::new); - final Link link = linkRepository.findById(linkId) + final StudyRoom studyRoom = studyRoomRepository.findByStudyId(studyId) + .orElseThrow(StudyNotFoundException::new); + final LinkArticle linkArticle = linkArticleRepository.findById(linkId) .orElseThrow(LinkNotFoundException::new); if (!study.isParticipant(member.getId())) { throw new NotParticipatedMemberException(); } - final Link updatedLink = editingLinkRequest.toLink(studyId, member.getId()); - link.update(updatedLink); + final LinkArticle updatedLinkArticle = studyRoom.writeLinkArticle(new Accessor(member.getId(), studyId), + editingLinkRequest.getLinkUrl(), editingLinkRequest.getDescription()); + + linkArticle.update(updatedLinkArticle); } - public void deleteLink(final Long githubId, final Long studyId, final Long linkId) { - final Member member = memberRepository.findByGithubId(githubId) + public void deleteLink(final Long memberId, final Long studyId, final Long linkId) { + final Member member = memberRepository.findById(memberId) .orElseThrow(MemberNotFoundException::new); final Study study = studyRepository.findById(studyId) .orElseThrow(StudyNotFoundException::new); - final Link link = linkRepository.findById(linkId) + final LinkArticle linkArticle = linkArticleRepository.findById(linkId) .orElseThrow(LinkNotFoundException::new); if (!study.isParticipant(member.getId())) { throw new NotParticipatedMemberException(); } - link.delete(new AssociatedStudy(studyId), new Author(member.getId())); + linkArticle.delete(member.getId(), studyId); } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/SearchingReferenceRoomService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/SearchingReferenceRoomService.java index c4e77f4b5..2885e9a23 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/SearchingReferenceRoomService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/SearchingReferenceRoomService.java @@ -25,8 +25,8 @@ public class SearchingReferenceRoomService { private final MemberRepository memberRepository; private final StudyRepository studyRepository; - public LinksResponse getLinks(final Long githubId, final Long studyId, final Pageable pageable) { - final Member member = memberRepository.findByGithubId(githubId) + public LinksResponse getLinks(final Long memberId, final Long studyId, final Pageable pageable) { + final Member member = memberRepository.findById(memberId) .orElseThrow(MemberNotFoundException::new); final Study study = studyRepository.findById(studyId) .orElseThrow(StudyNotFoundException::new); diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/UneditableArticleException.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/UneditableArticleException.java index 552290963..39285844a 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/UneditableArticleException.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/UneditableArticleException.java @@ -1,10 +1,12 @@ package com.woowacourse.moamoa.studyroom.service.exception; import com.woowacourse.moamoa.common.exception.BadRequestException; +import com.woowacourse.moamoa.studyroom.domain.Accessor; +import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; public class UneditableArticleException extends BadRequestException { - public UneditableArticleException() { - super(""); + public UneditableArticleException(final Long studyId, final Accessor accessor, final ArticleType type) { + super(String.format("스터디[%d]에 접근자[%s]가 %s의 게시글을 수정/추가할 수 없습니다.", studyId, accessor, type)); } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/EditingLinkRequest.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/EditingLinkRequest.java index faa464d5c..9245926e7 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/EditingLinkRequest.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/EditingLinkRequest.java @@ -1,8 +1,5 @@ package com.woowacourse.moamoa.studyroom.service.request; -import com.woowacourse.moamoa.studyroom.domain.article.Author; -import com.woowacourse.moamoa.studyroom.domain.article.Link; -import com.woowacourse.moamoa.review.domain.AssociatedStudy; import javax.validation.constraints.NotBlank; import javax.validation.constraints.Size; import lombok.AllArgsConstructor; @@ -20,8 +17,4 @@ public class EditingLinkRequest { @Size(max = 40, message = "설명은 40자를 초과할 수 없습니다.") private String description; - - public Link toLink(final Long studyId, final Long memberId) { - return new Link(new AssociatedStudy(studyId), new Author(memberId), linkUrl, description); - } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/CreatingLinkRequest.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/LinkArticleRequest.java similarity index 59% rename from backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/CreatingLinkRequest.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/LinkArticleRequest.java index 018cd5094..65db9795a 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/CreatingLinkRequest.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/LinkArticleRequest.java @@ -1,8 +1,5 @@ package com.woowacourse.moamoa.studyroom.service.request; -import com.woowacourse.moamoa.studyroom.domain.article.Author; -import com.woowacourse.moamoa.studyroom.domain.article.Link; -import com.woowacourse.moamoa.review.domain.AssociatedStudy; import javax.validation.constraints.NotBlank; import javax.validation.constraints.Size; import lombok.AllArgsConstructor; @@ -12,7 +9,7 @@ @NoArgsConstructor @AllArgsConstructor @Getter -public class CreatingLinkRequest { +public class LinkArticleRequest { @NotBlank(message = "공유할 링크 URL을 입력해 주세요.") @Size(max = 500, message = "링크 URL은 500자를 초과할 수 없습니다.") @@ -20,8 +17,4 @@ public class CreatingLinkRequest { @Size(max = 40, message = "설명은 40자를 초과할 수 없습니다.") private String description; - - public Link toLink(final Long studyId, final Long memberId) { - return new Link(new AssociatedStudy(studyId), new Author(memberId), linkUrl, description); - } } diff --git a/backend/src/test/java/com/woowacourse/acceptance/steps/StudyRelatedSteps.java b/backend/src/test/java/com/woowacourse/acceptance/steps/StudyRelatedSteps.java index aabb276f3..ef94172bc 100644 --- a/backend/src/test/java/com/woowacourse/acceptance/steps/StudyRelatedSteps.java +++ b/backend/src/test/java/com/woowacourse/acceptance/steps/StudyRelatedSteps.java @@ -4,7 +4,7 @@ import static org.springframework.http.HttpHeaders.CONTENT_TYPE; import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; -import com.woowacourse.moamoa.studyroom.service.request.CreatingLinkRequest; +import com.woowacourse.moamoa.studyroom.service.request.LinkArticleRequest; import com.woowacourse.moamoa.review.service.request.WriteReviewRequest; import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; import io.restassured.RestAssured; @@ -51,7 +51,7 @@ public class StudyRelatedSteps extends Steps { return null; } } - public Long 링크를_공유한다(final CreatingLinkRequest request) { + public Long 링크를_공유한다(final LinkArticleRequest request) { try { final String location = RestAssured.given().log().all() .header(AUTHORIZATION, token) diff --git a/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/ReferenceRoomAcceptanceTest.java b/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/ReferenceRoomAcceptanceTest.java index 54b6b027a..69911c322 100644 --- a/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/ReferenceRoomAcceptanceTest.java +++ b/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/ReferenceRoomAcceptanceTest.java @@ -30,7 +30,7 @@ import static org.springframework.restdocs.restassured3.RestAssuredRestDocumentation.document; import com.woowacourse.acceptance.AcceptanceTest; -import com.woowacourse.moamoa.studyroom.service.request.CreatingLinkRequest; +import com.woowacourse.moamoa.studyroom.service.request.LinkArticleRequest; import com.woowacourse.moamoa.studyroom.service.request.EditingLinkRequest; import com.woowacourse.moamoa.studyroom.service.response.AuthorResponse; import com.woowacourse.moamoa.studyroom.service.response.LinkResponse; @@ -54,8 +54,8 @@ void shareLink() { final Long javaStudyId = 짱구가().로그인하고().자바_스터디를().시작일자는(지금).생성한다(); final String jwtToken = 짱구가().로그인한다(); - final CreatingLinkRequest request = - new CreatingLinkRequest("https://github.com/sc0116", "링크에 대한 간단한 소개입니다."); + final LinkArticleRequest request = + new LinkArticleRequest("https://github.com/sc0116", "링크에 대한 간단한 소개입니다."); RestAssured.given(spec).log().all() .filter(document("reference-room/create", @@ -86,10 +86,10 @@ void getAllLink() { 디우가().로그인하고().스터디에(자바_스터디_ID).참여한다(); 베루스가().로그인하고().스터디에(자바_스터디_ID).참여한다(); - final CreatingLinkRequest request1 = new CreatingLinkRequest("https://github.com/sc0116", "짱구 링크."); - final CreatingLinkRequest request2 = new CreatingLinkRequest("https://github.com/jaejae-yoo", "그린론 링크."); - final CreatingLinkRequest request3 = new CreatingLinkRequest("https://github.com/tco0427", "디우 링크."); - final CreatingLinkRequest request4 = new CreatingLinkRequest("https://github.com/wilgur513", "베루스 링크."); + final LinkArticleRequest request1 = new LinkArticleRequest("https://github.com/sc0116", "짱구 링크."); + final LinkArticleRequest request2 = new LinkArticleRequest("https://github.com/jaejae-yoo", "그린론 링크."); + final LinkArticleRequest request3 = new LinkArticleRequest("https://github.com/tco0427", "디우 링크."); + final LinkArticleRequest request4 = new LinkArticleRequest("https://github.com/wilgur513", "베루스 링크."); final Long 짱구_링크공유_ID = 짱구가().로그인하고().스터디에(자바_스터디_ID).링크를_공유한다(request1); final Long 그린론_링크공유_ID = 그린론이().로그인하고().스터디에(자바_스터디_ID).링크를_공유한다(request2); @@ -160,11 +160,11 @@ void getAllLink() { @DisplayName("작성한 링크 공유글을 수정할 수 있다.") @Test void updateLink() { - final CreatingLinkRequest creatingLinkRequest = new CreatingLinkRequest("https://github.com/sc0116", + final LinkArticleRequest linkArticleRequest = new LinkArticleRequest("https://github.com/sc0116", "링크 설명입니다."); final LocalDate 지금 = LocalDate.now(); final Long 자바_스터디_ID = 짱구가().로그인하고().자바_스터디를().시작일자는(지금).생성한다(); - final Long 짱구_링크공유_ID = 짱구가().로그인하고().스터디에(자바_스터디_ID).링크를_공유한다(creatingLinkRequest); + final Long 짱구_링크공유_ID = 짱구가().로그인하고().스터디에(자바_스터디_ID).링크를_공유한다(linkArticleRequest); final String token = 짱구가().로그인한다(); final EditingLinkRequest editingLinkRequest = new EditingLinkRequest("https://github.com/woowacourse", @@ -208,11 +208,11 @@ void updateLink() { @DisplayName("작성한 링크 공유글을 삭제할 수 있다.") @Test void deleteLink() { - final CreatingLinkRequest creatingLinkRequest = new CreatingLinkRequest("https://github.com/sc0116", + final LinkArticleRequest linkArticleRequest = new LinkArticleRequest("https://github.com/sc0116", "링크 설명입니다."); final LocalDate 지금 = LocalDate.now(); final Long 자바_스터디_ID = 짱구가().로그인하고().자바_스터디를().시작일자는(지금).생성한다(); - final Long 짱구_링크공유_ID = 짱구가().로그인하고().스터디에(자바_스터디_ID).링크를_공유한다(creatingLinkRequest); + final Long 짱구_링크공유_ID = 짱구가().로그인하고().스터디에(자바_스터디_ID).링크를_공유한다(linkArticleRequest); final String token = 짱구가().로그인한다(); RestAssured.given(spec).log().all() diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/ReferenceRoomControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/ReferenceRoomControllerTest.java index 30a4b300e..e0db27a62 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/ReferenceRoomControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/ReferenceRoomControllerTest.java @@ -11,17 +11,18 @@ import com.woowacourse.moamoa.common.RepositoryTest; import com.woowacourse.moamoa.common.utils.DateTimeSystem; import com.woowacourse.moamoa.member.domain.repository.MemberRepository; -import com.woowacourse.moamoa.studyroom.domain.repository.article.LinkRepository; -import com.woowacourse.moamoa.studyroom.service.ReferenceRoomService; -import com.woowacourse.moamoa.studyroom.service.exception.LinkNotFoundException; -import com.woowacourse.moamoa.studyroom.service.exception.NotCreatingLinkException; -import com.woowacourse.moamoa.studyroom.service.exception.NotParticipatedMemberException; -import com.woowacourse.moamoa.studyroom.service.request.CreatingLinkRequest; -import com.woowacourse.moamoa.studyroom.service.request.EditingLinkRequest; import com.woowacourse.moamoa.study.domain.repository.StudyRepository; import com.woowacourse.moamoa.study.service.StudyParticipantService; import com.woowacourse.moamoa.study.service.StudyService; import com.woowacourse.moamoa.study.service.request.StudyRequest; +import com.woowacourse.moamoa.studyroom.domain.repository.article.LinkArticleRepository; +import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; +import com.woowacourse.moamoa.studyroom.service.ReferenceRoomService; +import com.woowacourse.moamoa.studyroom.service.exception.LinkNotFoundException; +import com.woowacourse.moamoa.studyroom.service.exception.NotParticipatedMemberException; +import com.woowacourse.moamoa.studyroom.service.exception.UneditableArticleException; +import com.woowacourse.moamoa.studyroom.service.request.LinkArticleRequest; +import com.woowacourse.moamoa.studyroom.service.request.EditingLinkRequest; import java.time.LocalDate; import javax.persistence.EntityManager; import org.junit.jupiter.api.BeforeEach; @@ -39,7 +40,10 @@ class ReferenceRoomControllerTest { private StudyRepository studyRepository; @Autowired - private LinkRepository linkRepository; + private StudyRoomRepository studyRoomRepository; + + @Autowired + private LinkArticleRepository linkArticleRepository; @Autowired private EntityManager entityManager; @@ -54,7 +58,9 @@ class ReferenceRoomControllerTest { @BeforeEach void setUp() { - sut = new ReferenceRoomController(new ReferenceRoomService(memberRepository, studyRepository, linkRepository)); + sut = new ReferenceRoomController( + new ReferenceRoomService(studyRoomRepository, memberRepository, studyRepository, linkArticleRepository) + ); // 사용자 추가 jjangguId = memberRepository.save(짱구()).getId(); @@ -73,11 +79,11 @@ void setUp() { // 링크 공유 생성 final ReferenceRoomService referenceRoomService = - new ReferenceRoomService(memberRepository, studyRepository, linkRepository); - final CreatingLinkRequest creatingLinkRequest = - new CreatingLinkRequest("https://github.com/sc0116", "링크 설명입니다."); + new ReferenceRoomService(studyRoomRepository, memberRepository, studyRepository, linkArticleRepository); + final LinkArticleRequest linkArticleRequest = + new LinkArticleRequest("https://github.com/sc0116", "링크 설명입니다."); - linkId = referenceRoomService.createLink(짱구_깃허브_아이디, javaStudyId, creatingLinkRequest).getId(); + linkId = referenceRoomService.createLink(jjangguId, javaStudyId, linkArticleRequest).getId(); entityManager.flush(); entityManager.clear(); @@ -86,11 +92,11 @@ void setUp() { @DisplayName("스터디에 참여하지 않은 회원은 링크 공유를 할 수 없다.") @Test void createByNotParticipatedMember() { - final CreatingLinkRequest creatingLinkRequest = - new CreatingLinkRequest("https://github.com/sc0116", "링크 설명입니다."); + final LinkArticleRequest linkArticleRequest = + new LinkArticleRequest("https://github.com/sc0116", "링크 설명입니다."); - assertThatThrownBy(() -> sut.createLink(디우_깃허브_아이디, javaStudyId, creatingLinkRequest)) - .isInstanceOf(NotCreatingLinkException.class); + assertThatThrownBy(() -> sut.createLink(dwooId, javaStudyId, linkArticleRequest)) + .isInstanceOf(UneditableArticleException.class); } @DisplayName("존재하지 않는 링크 공유글을 수정할 수 없다.") @@ -98,7 +104,7 @@ void createByNotParticipatedMember() { void updateByInvalidLinkId() { final EditingLinkRequest editingLinkRequest = new EditingLinkRequest("www.naver.com", "수정"); - assertThatThrownBy(() -> sut.updateLink(짱구_깃허브_아이디, javaStudyId, -1L, editingLinkRequest)) + assertThatThrownBy(() -> sut.updateLink(jjangguId, javaStudyId, -1L, editingLinkRequest)) .isInstanceOf(LinkNotFoundException.class); } @@ -107,21 +113,21 @@ void updateByInvalidLinkId() { void updateByNotParticipatedMember() { final EditingLinkRequest editingLinkRequest = new EditingLinkRequest("https://github.com", "수정된 링크 설명입니다."); - assertThatThrownBy(() -> sut.updateLink(디우_깃허브_아이디, javaStudyId, linkId, editingLinkRequest)) + assertThatThrownBy(() -> sut.updateLink(dwooId, javaStudyId, linkId, editingLinkRequest)) .isInstanceOf(NotParticipatedMemberException.class); } @DisplayName("존재하지 않는 링크 공유글을 삭제할 수 없다.") @Test void deleteByInvalidLinkId() { - assertThatThrownBy(() -> sut.deleteLink(짱구_깃허브_아이디, javaStudyId, -1L)) + assertThatThrownBy(() -> sut.deleteLink(jjangguId, javaStudyId, -1L)) .isInstanceOf(LinkNotFoundException.class); } @DisplayName("스터디에 참여하지 않은 경우 링크 공유글을 삭제할 수 없다.") @Test void deleteByNotParticipatedMember() { - assertThatThrownBy(() -> sut.deleteLink(디우_깃허브_아이디, javaStudyId, linkId)) + assertThatThrownBy(() -> sut.deleteLink(dwooId, javaStudyId, linkId)) .isInstanceOf(NotParticipatedMemberException.class); } } diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/SearchingReferenceRoomControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/SearchingReferenceRoomControllerTest.java index 52b81a674..5b70529e6 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/SearchingReferenceRoomControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/SearchingReferenceRoomControllerTest.java @@ -23,14 +23,15 @@ import com.woowacourse.moamoa.common.utils.DateTimeSystem; import com.woowacourse.moamoa.member.domain.Member; import com.woowacourse.moamoa.member.domain.repository.MemberRepository; -import com.woowacourse.moamoa.studyroom.domain.article.Link; -import com.woowacourse.moamoa.studyroom.domain.repository.article.LinkRepository; +import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; +import com.woowacourse.moamoa.studyroom.domain.repository.article.LinkArticleRepository; +import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.LinkDao; import com.woowacourse.moamoa.studyroom.query.data.LinkData; import com.woowacourse.moamoa.studyroom.service.ReferenceRoomService; import com.woowacourse.moamoa.studyroom.service.SearchingReferenceRoomService; import com.woowacourse.moamoa.studyroom.service.exception.NotParticipatedMemberException; -import com.woowacourse.moamoa.studyroom.service.request.CreatingLinkRequest; +import com.woowacourse.moamoa.studyroom.service.request.LinkArticleRequest; import com.woowacourse.moamoa.studyroom.service.response.LinkResponse; import com.woowacourse.moamoa.studyroom.service.response.LinksResponse; import com.woowacourse.moamoa.study.domain.Study; @@ -62,7 +63,10 @@ class SearchingReferenceRoomControllerTest { private StudyRepository studyRepository; @Autowired - private LinkRepository linkRepository; + private StudyRoomRepository studyRoomRepository; + + @Autowired + private LinkArticleRepository linkArticleRepository; @Autowired private EntityManager entityManager; @@ -72,6 +76,11 @@ class SearchingReferenceRoomControllerTest { private Study javaStudy; private List linkResponses; + private Member jjanggu; + private Member greenlawn; + private Member dwoo; + private Member verus; + private Member byeongmin; @BeforeEach void setUp() { @@ -79,11 +88,11 @@ void setUp() { new SearchingReferenceRoomService(linkDao, memberRepository, studyRepository)); // 사용자 추가 - final Member jjanggu = memberRepository.save(짱구()); - final Member greenlawn = memberRepository.save(그린론()); - final Member dwoo = memberRepository.save(디우()); - final Member verus = memberRepository.save(베루스()); - memberRepository.save(병민()); + jjanggu = memberRepository.save(짱구()); + greenlawn = memberRepository.save(그린론()); + dwoo = memberRepository.save(디우()); + verus = memberRepository.save(베루스()); + byeongmin = memberRepository.save(병민()); // 스터디 생성 StudyService studyService = new StudyService(studyRepository, memberRepository, new DateTimeSystem()); @@ -99,34 +108,34 @@ void setUp() { participantService.participateStudy(verus.getId(), javaStudy.getId()); // 링크 공유 추가 - final ReferenceRoomService linkService = new ReferenceRoomService(memberRepository, studyRepository, - linkRepository); + final ReferenceRoomService linkService = new ReferenceRoomService(studyRoomRepository, memberRepository, + studyRepository, linkArticleRepository); - final CreatingLinkRequest request1 = new CreatingLinkRequest("https://github.com/sc0116", "짱구 링크."); - final CreatingLinkRequest request2 = new CreatingLinkRequest("https://github.com/jaejae-yoo", "그린론 링크."); - final CreatingLinkRequest request3 = new CreatingLinkRequest("https://github.com/tco0427", "디우 링크."); - final CreatingLinkRequest request4 = new CreatingLinkRequest("https://github.com/wilgur513", "베루스 링크."); + final LinkArticleRequest request1 = new LinkArticleRequest("https://github.com/sc0116", "짱구 링크."); + final LinkArticleRequest request2 = new LinkArticleRequest("https://github.com/jaejae-yoo", "그린론 링크."); + final LinkArticleRequest request3 = new LinkArticleRequest("https://github.com/tco0427", "디우 링크."); + final LinkArticleRequest request4 = new LinkArticleRequest("https://github.com/wilgur513", "베루스 링크."); - final Link link1 = linkService.createLink(짱구_깃허브_아이디, javaStudy.getId(), request1); - final Link link2 = linkService.createLink(그린론_깃허브_아이디, javaStudy.getId(), request2); - final Link link3 = linkService.createLink(디우_깃허브_아이디, javaStudy.getId(), request3); - final Link link4 = linkService.createLink(베루스_깃허브_아이디, javaStudy.getId(), request4); + final LinkArticle linkArticle1 = linkService.createLink(jjanggu.getId(), javaStudy.getId(), request1); + final LinkArticle linkArticle2 = linkService.createLink(greenlawn.getId(), javaStudy.getId(), request2); + final LinkArticle linkArticle3 = linkService.createLink(dwoo.getId(), javaStudy.getId(), request3); + final LinkArticle linkArticle4 = linkService.createLink(verus.getId(), javaStudy.getId(), request4); entityManager.flush(); entityManager.clear(); final LinkResponse 링크1 = new LinkResponse( - new LinkData(link1.getId(), 짱구_응답, link1.getLinkUrl(), link1.getDescription(), - link1.getCreatedDate().toLocalDate(), link1.getLastModifiedDate().toLocalDate())); + new LinkData(linkArticle1.getId(), 짱구_응답, linkArticle1.getLinkUrl(), linkArticle1.getDescription(), + linkArticle1.getCreatedDate().toLocalDate(), linkArticle1.getLastModifiedDate().toLocalDate())); final LinkResponse 링크2 = new LinkResponse( - new LinkData(link2.getId(), 그린론_응답, link2.getLinkUrl(), link2.getDescription(), - link2.getCreatedDate().toLocalDate(), link2.getLastModifiedDate().toLocalDate())); + new LinkData(linkArticle2.getId(), 그린론_응답, linkArticle2.getLinkUrl(), linkArticle2.getDescription(), + linkArticle2.getCreatedDate().toLocalDate(), linkArticle2.getLastModifiedDate().toLocalDate())); final LinkResponse 링크3 = new LinkResponse( - new LinkData(link3.getId(), 디우_응답, link3.getLinkUrl(), link3.getDescription(), - link3.getCreatedDate().toLocalDate(), link3.getLastModifiedDate().toLocalDate())); + new LinkData(linkArticle3.getId(), 디우_응답, linkArticle3.getLinkUrl(), linkArticle3.getDescription(), + linkArticle3.getCreatedDate().toLocalDate(), linkArticle3.getLastModifiedDate().toLocalDate())); final LinkResponse 링크4 = new LinkResponse( - new LinkData(link4.getId(), 베루스_응답, link4.getLinkUrl(), link4.getDescription(), - link4.getCreatedDate().toLocalDate(), link4.getLastModifiedDate().toLocalDate())); + new LinkData(linkArticle4.getId(), 베루스_응답, linkArticle4.getLinkUrl(), linkArticle4.getDescription(), + linkArticle4.getCreatedDate().toLocalDate(), linkArticle4.getLastModifiedDate().toLocalDate())); linkResponses = List.of(링크1, 링크2, 링크3, 링크4); } @@ -134,7 +143,7 @@ void setUp() { @DisplayName("링크 공유글 전체 목록 조회를 할 수 있다.") @Test void getLinks() { - final ResponseEntity links = sut.getLinks(짱구_깃허브_아이디, javaStudy.getId(), PageRequest.of(0, 5)); + final ResponseEntity links = sut.getLinks(jjanggu.getId(), javaStudy.getId(), PageRequest.of(0, 5)); assertAll( () -> assertThat(links.getStatusCode()).isEqualTo(HttpStatus.OK), @@ -151,7 +160,7 @@ void getLinksByNotParticipatedMember() { final Long javaStudyId = javaStudy.getId(); final PageRequest pageRequest = PageRequest.of(0, 5); - assertThatThrownBy(() -> sut.getLinks(병민_깃허브_아이디, javaStudyId, pageRequest)) + assertThatThrownBy(() -> sut.getLinks(byeongmin.getId(), javaStudyId, pageRequest)) .isInstanceOf(NotParticipatedMemberException.class); } } diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/ArticleTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/ArticleTest.java index ef1f7ac4d..06a091f5f 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/ArticleTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/ArticleTest.java @@ -17,19 +17,6 @@ class ArticleTest { - @DisplayName("스터디에 참여한 참가자만 게시글을 작성할 수 있다.") - @Test - void writeCommunityArticleByParticipant() { - long studyId = 1L; - Member owner = createMember(1L); - Member another = createMember(2L); - StudyRoom studyRoom = createPermittedAccessors(studyId, owner); - Accessor accessor = new Accessor(another.getId(), 1L); - - assertThatThrownBy(() -> studyRoom.write(accessor, "제목", "내용", COMMUNITY)) - .isInstanceOf(NotParticipatedMemberException.class); - } - @DisplayName("스터디 참여자는 게시글을 조회할 수 있다.") @ParameterizedTest @CsvSource({"1,true", "2,true", "3,false"}) diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/LinkArticleTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/LinkArticleTest.java new file mode 100644 index 000000000..3d498ab55 --- /dev/null +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/LinkArticleTest.java @@ -0,0 +1,122 @@ +package com.woowacourse.moamoa.studyroom.domain; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertAll; + +import com.woowacourse.moamoa.member.domain.Member; +import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; +import com.woowacourse.moamoa.studyroom.service.exception.NotLinkAuthorException; +import com.woowacourse.moamoa.studyroom.service.exception.NotRelatedLinkException; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class LinkArticleTest { + + @DisplayName("링크 공유를 수정한다.") + @Test + void update() { + final Member owner = createMember(1L); + final StudyRoom studyRoom = createStudyRoom(1L, owner); + + final LinkArticle linkArticle = studyRoom.writeLinkArticle(new Accessor(owner.getId(), studyRoom.getId()), + "link", "설명"); + final LinkArticle updatedLinkArticle = studyRoom + .writeLinkArticle(new Accessor(owner.getId(), studyRoom.getId()), + "updated link", "수정된 설명"); + + linkArticle.update(updatedLinkArticle); + + assertAll( + () -> assertThat(linkArticle.getLinkUrl()).isEqualTo("updated link"), + () -> assertThat(linkArticle.getDescription()).isEqualTo("수정된 설명") + ); + } + + @DisplayName("작성자가 아니면 수정할 수 없다.") + @Test + void updateByNotAuthor() { + final Member owner = createMember(1L); + final StudyRoom studyRoom = createStudyRoom(1L, owner); + + final LinkArticle linkArticle = studyRoom.writeLinkArticle(new Accessor(owner.getId(), studyRoom.getId()), + "link", "설명"); + + final LinkArticle updatedLinkArticle = new LinkArticle(studyRoom, 2L, "updated link", + "수정된 설명"); + + assertThatThrownBy(() -> linkArticle.update(updatedLinkArticle)) + .isInstanceOf(NotLinkAuthorException.class); + } + + @DisplayName("스터디에 속하지 않은 링크 공유글을 수정할 수 없다.") + @Test + void updateByNotBelongToStudy() { + final Member owner = createMember(1L); + final StudyRoom studyRoom = createStudyRoom(1L, owner); + final StudyRoom anotherStudyRoom = createStudyRoom(2L, owner); + + final LinkArticle linkArticle = studyRoom.writeLinkArticle(new Accessor(owner.getId(), studyRoom.getId()), + "link", "설명"); + + final LinkArticle updatedLinkArticle = anotherStudyRoom.writeLinkArticle(new Accessor(owner.getId(), anotherStudyRoom.getId()), + "updated link", "수정된 설명"); + + assertThatThrownBy(() -> linkArticle.update(updatedLinkArticle)) + .isInstanceOf(NotRelatedLinkException.class); + } + + @DisplayName("링크 공유를 삭제한다.") + @Test + void delete() { + final Member owner = createMember(1L); + final StudyRoom studyRoom = createStudyRoom(1L, owner); + + final LinkArticle linkArticle = studyRoom.writeLinkArticle(new Accessor(owner.getId(), studyRoom.getId()), + "link", "설명"); + + linkArticle.delete(1L, 1L); + + assertThat(linkArticle.isDeleted()).isTrue(); + } + + @DisplayName("작성자가 아니면 삭제할 수 없다.") + @Test + void deleteByNotAuthor() { + final Member owner = createMember(1L); + final StudyRoom studyRoom = createStudyRoom(1L, owner); + + final LinkArticle linkArticle = studyRoom.writeLinkArticle(new Accessor(owner.getId(), studyRoom.getId()), + "link", "설명"); + + assertThatThrownBy(() -> linkArticle.delete(2L, 1L)) + .isInstanceOf(NotLinkAuthorException.class); + } + + @DisplayName("스터디에 속하지 않은 링크 공유글을 삭제할 수 없다.") + @Test + void deleteByNotBelongToStudy() { + final Member owner = createMember(1L); + final StudyRoom studyRoom = createStudyRoom(1L, owner); + + final LinkArticle linkArticle = studyRoom.writeLinkArticle(new Accessor(owner.getId(), studyRoom.getId()), + "link", "설명"); + + assertThatThrownBy(() -> linkArticle.delete(1L, 2L)) + .isInstanceOf(NotRelatedLinkException.class); + } + + private StudyRoom createStudyRoom(long studyId, Member owner, Member... participant) { + final Set participants = Stream.of(participant) + .map(Member::getId) + .collect(Collectors.toSet()); + return new StudyRoom(studyId, owner.getId(), participants); + } + + private Member createMember(final long id) { + return new Member(id, id, "username" + id, "image", "profile"); + } +} diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/LinkTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/LinkTest.java deleted file mode 100644 index 635addc85..000000000 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/LinkTest.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.woowacourse.moamoa.studyroom.domain; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.assertAll; - -import com.woowacourse.moamoa.studyroom.domain.article.Author; -import com.woowacourse.moamoa.studyroom.domain.article.Link; -import com.woowacourse.moamoa.studyroom.service.exception.NotLinkAuthorException; -import com.woowacourse.moamoa.studyroom.service.exception.NotRelatedLinkException; -import com.woowacourse.moamoa.review.domain.AssociatedStudy; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -class LinkTest { - - @DisplayName("링크 공유를 수정한다.") - @Test - void update() { - final Link link = new Link(new AssociatedStudy(1L), new Author(1L), "link", "설명"); - final Link updatedLink = new Link(new AssociatedStudy(1L), new Author(1L), "updated link", "수정된 설명"); - - link.update(updatedLink); - - assertAll( - () -> assertThat(link.getLinkUrl()).isEqualTo("updated link"), - () -> assertThat(link.getDescription()).isEqualTo("수정된 설명") - ); - } - - @DisplayName("작성자가 아니면 수정할 수 없다.") - @Test - void updateByNotAuthor() { - final Author author = new Author(1L); - final Author nonAuthor = new Author(2L); - - final Link link = new Link(new AssociatedStudy(1L), author, "link", "설명"); - final Link updatedLink = new Link(new AssociatedStudy(1L), nonAuthor, "updated link", "수정된 설명"); - - assertThatThrownBy(() -> link.update(updatedLink)) - .isInstanceOf(NotLinkAuthorException.class); - } - - @DisplayName("스터디에 속하지 않은 링크 공유글을 수정할 수 없다.") - @Test - void updateByNotBelongToStudy() { - final AssociatedStudy relatedStudy = new AssociatedStudy(1L); - final AssociatedStudy unrelatedStudy = new AssociatedStudy(2L); - - final Link link = new Link(relatedStudy, new Author(1L), "link", "설명"); - final Link updatedLink = new Link(unrelatedStudy, new Author(1L), "updated link", "수정된 설명"); - - assertThatThrownBy(() -> link.update(updatedLink)) - .isInstanceOf(NotRelatedLinkException.class); - } - - @DisplayName("링크 공유를 삭제한다.") - @Test - void delete() { - final Author author = new Author(1L); - final Link link = new Link(new AssociatedStudy(1L), author, "link", "설명"); - - link.delete(new AssociatedStudy(1L), author); - - assertThat(link.isDeleted()).isTrue(); - } - - @DisplayName("작성자가 아니면 삭제할 수 없다.") - @Test - void deleteByNotAuthor() { - final Link link = new Link(new AssociatedStudy(1L), new Author(1L), "link", "설명"); - final Author nonAuthor = new Author(2L); - final AssociatedStudy associatedStudy = new AssociatedStudy(1L); - - assertThatThrownBy(() -> link.delete(associatedStudy, nonAuthor)) - .isInstanceOf(NotLinkAuthorException.class); - } - - @DisplayName("스터디에 속하지 않은 링크 공유글을 삭제할 수 없다.") - @Test - void deleteByNotBelongToStudy() { - final Link link = new Link(new AssociatedStudy(1L), new Author(1L), "link", "설명"); - final AssociatedStudy unrelatedStudy = new AssociatedStudy(2L); - final Author author = new Author(1L); - - assertThatThrownBy(() -> link.delete(unrelatedStudy, author)) - .isInstanceOf(NotRelatedLinkException.class); - } -} diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/StudyRoomTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/StudyRoomTest.java new file mode 100644 index 000000000..f0c2219d3 --- /dev/null +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/StudyRoomTest.java @@ -0,0 +1,144 @@ +package com.woowacourse.moamoa.studyroom.domain; + +import static com.woowacourse.moamoa.studyroom.domain.article.ArticleType.COMMUNITY; +import static com.woowacourse.moamoa.studyroom.domain.article.ArticleType.NOTICE; +import static org.assertj.core.api.Assertions.assertThatCode; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import com.woowacourse.moamoa.member.domain.Member; +import com.woowacourse.moamoa.studyroom.service.exception.UneditableArticleException; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +public class StudyRoomTest { + + @ParameterizedTest + @DisplayName("스터디에 참여한 참가자는 커뮤니티 게시글을 작성할 수 있다.") + @MethodSource("provideAccessibleAccessorForCommunityArticle") + void writeCommunityArticleByParticipant(final Accessor accessor) { + // arrange + final Member owner = createMember(1L); + final Member participant = createMember(2L); + final StudyRoom studyRoom = createStudyRoom(1L, owner, participant); + + // act & assert + assertThatCode(() -> studyRoom.write(accessor, "제목", "내용", COMMUNITY)) + .doesNotThrowAnyException(); + } + + private static Stream provideAccessibleAccessorForCommunityArticle() { + return Stream.of( + Arguments.of(new Accessor(1L, 1L)), // 방장 + Arguments.of(new Accessor(2L, 1L)) // 일반 참가자 + ); + } + + @ParameterizedTest + @DisplayName("스터디에 참여하지 않은 참가자는 커뮤니티 게시글을 작성할 수 없다.") + @MethodSource("provideNonAccessibleAccessorForCommunityArticle") + void cantWriteCommunityArticleByNonParticipants(final Accessor accessor) { + Member owner = createMember(1L); + StudyRoom studyRoom = createStudyRoom(1L, owner); + + assertThatThrownBy(() -> studyRoom.write(accessor, "제목", "내용", COMMUNITY)) + .isInstanceOf(UneditableArticleException.class); + } + + private static Stream provideNonAccessibleAccessorForCommunityArticle() { + return Stream.of( + Arguments.of(new Accessor(2L, 1L)), // memberId가 잘못된 경우 + Arguments.of(new Accessor(1L, 2L)) // studyId가 잘못된 경우 + ); + } + + @DisplayName("방장은 공지글을 작성할 수 있다.") + @Test + void writeNoticeArticleByOwner() { + // arrange + final Member owner = createMember(1L); + final StudyRoom studyRoom = createStudyRoom(1L, owner); + + // act & assert + assertThatCode(() -> studyRoom.write(new Accessor(1L, 1L), "제목", "내용", NOTICE)) + .doesNotThrowAnyException(); + } + + @ParameterizedTest + @DisplayName("방장 외에는 공지글을 작성할 수 없다.") + @MethodSource("provideNonAccessibleAccessorForNoticeArticle") + void cantWriteNoticeArticleByNonOwner(final Accessor accessor) { + // arrange + final Member owner = createMember(1L); + final Member participant = createMember(2L); + final StudyRoom studyRoom = createStudyRoom(1L, owner, participant); + + // act && assert + assertThatThrownBy(() -> studyRoom.write(accessor, "제목", "내용", NOTICE)) + .isInstanceOf(UneditableArticleException.class); + } + + private static Stream provideNonAccessibleAccessorForNoticeArticle() { + return Stream.of( + Arguments.of(new Accessor(1L, 2L)), // studyId가 잘못된 경우 + Arguments.of(new Accessor(2L, 1L)) // 방장 외에 참여자인 경우 + ); + } + + @ParameterizedTest + @DisplayName("링크 게시글을 스터디에 참여한 인원은 작성할 수 있다.") + @MethodSource("provideAccessibleAccessorForLinkArticle") + void writeLinkArticleByAccessibleAccessor(final Accessor accessor) { + // arrange + final Member owner = createMember(1L); + final Member participant = createMember(2L); + final StudyRoom studyRoom = createStudyRoom(1L, owner, participant); + + // act & assert + assertThatCode(() -> studyRoom.writeLinkArticle(accessor, "link url", "설명")) + .doesNotThrowAnyException(); + } + + private static Stream provideAccessibleAccessorForLinkArticle() { + return Stream.of( + Arguments.of(new Accessor(1L, 1L)), // 방장 + Arguments.of(new Accessor(2L, 1L)) // 일반 참여자 + ); + } + + @ParameterizedTest + @DisplayName("링크글을 스터디 참여자만 작성할 수 있다.") + @MethodSource("provideNonAccessibleAccessorForLinkArticle") + void cantWriteLinkArticleByNonAccessibleAccessor(final Accessor accessor) { + // arrange + final Member owner = createMember(1L); + final StudyRoom studyRoom = createStudyRoom(1L, owner); + + // act & assert + assertThatThrownBy(() -> studyRoom.writeLinkArticle(accessor, "link url", "설명")) + .isInstanceOf(UneditableArticleException.class); + } + + private static Stream provideNonAccessibleAccessorForLinkArticle() { + return Stream.of( + Arguments.of(new Accessor(1L, 2L)), // studyId가 잘못된 경우 + Arguments.of(new Accessor(2L, 1L)) // 스터디에 참여하지 않은 접근자 + ); + } + + private StudyRoom createStudyRoom(long studyId, Member owner, Member... participant) { + final Set participants = Stream.of(participant) + .map(Member::getId) + .collect(Collectors.toSet()); + return new StudyRoom(studyId, owner.getId(), participants); + } + + private Member createMember(final long id) { + return new Member(id, id, "username" + id, "image", "profile"); + } +} diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/query/LinkDaoTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/query/LinkDaoTest.java deleted file mode 100644 index 7fb147a2c..000000000 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/query/LinkDaoTest.java +++ /dev/null @@ -1,119 +0,0 @@ -package com.woowacourse.moamoa.studyroom.query; - -import static com.woowacourse.moamoa.fixtures.StudyFixtures.자바_스터디_신청서; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertAll; - -import com.woowacourse.moamoa.common.RepositoryTest; -import com.woowacourse.moamoa.common.utils.DateTimeSystem; -import com.woowacourse.moamoa.member.domain.Member; -import com.woowacourse.moamoa.member.domain.repository.MemberRepository; -import com.woowacourse.moamoa.member.query.data.MemberData; -import com.woowacourse.moamoa.studyroom.domain.article.Link; -import com.woowacourse.moamoa.studyroom.domain.repository.article.LinkRepository; -import com.woowacourse.moamoa.studyroom.query.data.LinkData; -import com.woowacourse.moamoa.studyroom.service.ReferenceRoomService; -import com.woowacourse.moamoa.studyroom.service.request.CreatingLinkRequest; -import com.woowacourse.moamoa.study.domain.Study; -import com.woowacourse.moamoa.study.domain.repository.StudyRepository; -import com.woowacourse.moamoa.study.service.StudyParticipantService; -import com.woowacourse.moamoa.study.service.StudyService; -import com.woowacourse.moamoa.study.service.request.StudyRequest; -import java.time.LocalDate; -import java.util.List; -import javax.persistence.EntityManager; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Slice; - -@RepositoryTest -class LinkDaoTest { - - private static final MemberData JJANGGU = new MemberData(1L, "jjanggu", "https://image", "github.com"); - private static final MemberData GREENLAWN = new MemberData(2L, "greenlawn", "https://image", "github.com"); - private static final MemberData DWOO = new MemberData(3L, "dwoo", "https://image", "github.com"); - private static final MemberData VERUS = new MemberData(4L, "verus", "https://image", "github.com"); - - @Autowired - private MemberRepository memberRepository; - - @Autowired - private StudyRepository studyRepository; - - @Autowired - private LinkRepository linkRepository; - - @Autowired - private EntityManager entityManager; - - @Autowired - private LinkDao sut; - - private Study javaStudy; - - private List linkData; - - @BeforeEach - void setUp() { - // 사용자 추가 - final Member jjanggu = memberRepository.save(toMember(JJANGGU)); - final Member greenlawn = memberRepository.save(toMember(GREENLAWN)); - final Member dwoo = memberRepository.save(toMember(DWOO)); - final Member verus = memberRepository.save(toMember(VERUS)); - - // 스터디 생성 - StudyService createStudyService = new StudyService(studyRepository, memberRepository, new DateTimeSystem()); - - final LocalDate startDate = LocalDate.now(); - StudyRequest javaStudyRequest = 자바_스터디_신청서(startDate); - - javaStudy = createStudyService.createStudy(JJANGGU.getGithubId(), javaStudyRequest); - - StudyParticipantService participantService = new StudyParticipantService(memberRepository, studyRepository); - participantService.participateStudy(greenlawn.getId(), javaStudy.getId()); - participantService.participateStudy(dwoo.getId(), javaStudy.getId()); - participantService.participateStudy(verus.getId(), javaStudy.getId()); - - // 링크 공유 추가 - final ReferenceRoomService linkService = new ReferenceRoomService(memberRepository, studyRepository, linkRepository); - - final CreatingLinkRequest request1 = new CreatingLinkRequest("https://github.com/sc0116", "짱구 링크."); - final CreatingLinkRequest request2 = new CreatingLinkRequest("https://github.com/jaejae-yoo", "그린론 링크."); - final CreatingLinkRequest request3 = new CreatingLinkRequest("https://github.com/tco0427", "디우 링크."); - final CreatingLinkRequest request4 = new CreatingLinkRequest("https://github.com/wilgur513", "베루스 링크."); - - final Link link1 = linkService.createLink(JJANGGU.getGithubId(), javaStudy.getId(), request1); - final Link link2 = linkService.createLink(GREENLAWN.getGithubId(), javaStudy.getId(), request2); - final Link link3 = linkService.createLink(DWOO.getGithubId(), javaStudy.getId(), request3); - final Link link4 = linkService.createLink(VERUS.getGithubId(), javaStudy.getId(), request4); - - entityManager.flush(); - entityManager.clear(); - - final LinkData 링크1 = new LinkData(link1.getId(), JJANGGU, link1.getLinkUrl(), link1.getDescription(), link1.getCreatedDate().toLocalDate(), link1.getLastModifiedDate().toLocalDate()); - final LinkData 링크2 = new LinkData(link2.getId(), GREENLAWN, link2.getLinkUrl(), link2.getDescription(), link2.getCreatedDate().toLocalDate(), link2.getLastModifiedDate().toLocalDate()); - final LinkData 링크3 = new LinkData(link3.getId(), DWOO, link3.getLinkUrl(), link3.getDescription(), link3.getCreatedDate().toLocalDate(), link3.getLastModifiedDate().toLocalDate()); - final LinkData 링크4 = new LinkData(link4.getId(), VERUS, link4.getLinkUrl(), link4.getDescription(), link4.getCreatedDate().toLocalDate(), link4.getLastModifiedDate().toLocalDate()); - - linkData = List.of(링크1, 링크2, 링크3, 링크4); - } - - private Member toMember(final MemberData data) { - return new Member(data.getGithubId(), data.getUsername(), data.getImageUrl(), data.getProfileUrl()); - } - - @DisplayName("스터디 ID로 링크 공유글을 조회한다.") - @Test - void getLinks() { - final Slice links = sut.findAllByStudyId(javaStudy.getId(), PageRequest.of(0, 5)); - - assertAll( - () -> assertThat(links.hasNext()).isFalse(), - () -> assertThat(links.getContent()) - .containsExactlyInAnyOrderElementsOf(linkData) - ); - } -} diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/ReferenceRoomWebMvcTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/ReferenceRoomWebMvcTest.java index 6794ed829..44c469a61 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/ReferenceRoomWebMvcTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/ReferenceRoomWebMvcTest.java @@ -6,7 +6,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import com.woowacourse.moamoa.WebMVCTest; -import com.woowacourse.moamoa.studyroom.service.request.CreatingLinkRequest; +import com.woowacourse.moamoa.studyroom.service.request.LinkArticleRequest; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.http.HttpHeaders; @@ -18,7 +18,7 @@ class ReferenceRoomWebMvcTest extends WebMVCTest { @Test void requestByNullLinkUrl() throws Exception { final String token = "Bearer " + tokenProvider.createToken(1L).getAccessToken(); - final String content = objectMapper.writeValueAsString(new CreatingLinkRequest(null, "설명")); + final String content = objectMapper.writeValueAsString(new LinkArticleRequest(null, "설명")); mockMvc.perform(post("/api/studies/1/reference-room/links") .header(HttpHeaders.AUTHORIZATION, token) @@ -32,7 +32,7 @@ void requestByNullLinkUrl() throws Exception { @Test void requestByBlankLinkUrl() throws Exception { final String token = "Bearer " + tokenProvider.createToken(1L).getAccessToken(); - final String content = objectMapper.writeValueAsString(new CreatingLinkRequest("", "설명")); + final String content = objectMapper.writeValueAsString(new LinkArticleRequest("", "설명")); mockMvc.perform(post("/api/studies/1/reference-room/links") .header(HttpHeaders.AUTHORIZATION, token) @@ -46,7 +46,7 @@ void requestByBlankLinkUrl() throws Exception { @Test void requestBy40LengthExceededDescription() throws Exception { final String token = "Bearer " + tokenProvider.createToken(1L).getAccessToken(); - final String content = objectMapper.writeValueAsString(new CreatingLinkRequest("링크", + final String content = objectMapper.writeValueAsString(new LinkArticleRequest("링크", "일이삼사오육칠팔구십" + "일이삼사오육칠팔이십" + "일이삼사오육칠팔삼십" @@ -65,7 +65,7 @@ void requestBy40LengthExceededDescription() throws Exception { @Test void requestByInvalidStudyId() throws Exception { final String token = "Bearer " + tokenProvider.createToken(1L).getAccessToken(); - final String content = objectMapper.writeValueAsString(new CreatingLinkRequest("링크", "설명")); + final String content = objectMapper.writeValueAsString(new LinkArticleRequest("링크", "설명")); mockMvc.perform(post("/api/studies/one/reference-room/links") .header(HttpHeaders.AUTHORIZATION, token) @@ -103,7 +103,7 @@ void requestByInvalidSizeParameter() throws Exception { @Test void requestByInvalidToken() throws Exception { final String invalidToken = "Bearer Invalid Token"; - final String content = objectMapper.writeValueAsString(new CreatingLinkRequest("링크", "설명")); + final String content = objectMapper.writeValueAsString(new LinkArticleRequest("링크", "설명")); mockMvc.perform(post("/api/studies/one/reference-room/links") .header(HttpHeaders.AUTHORIZATION, invalidToken) From a72a3c1d15cb89d5f3eed10faf234e0b13e0a515 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=A7=84=ED=98=81?= Date: Wed, 14 Sep 2022 17:02:55 +0900 Subject: [PATCH 03/40] =?UTF-8?q?refactor:=20LinkArticle=20=EC=BB=A8?= =?UTF-8?q?=ED=8A=B8=EB=A1=A4=EB=9F=AC,=20=EC=84=9C=EB=B9=84=EC=8A=A4=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=EB=AA=85=20=EB=B3=80=EA=B2=BD=20?= =?UTF-8?q?=EB=B0=8F=20EditingLinkRequest=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...roller.java => LinkArticleController.java} | 16 ++++++-------- ...va => SearchingLinkArticleController.java} | 9 ++++---- ...omService.java => LinkArticleService.java} | 9 ++++---- ....java => SearchingLinkArticleService.java} | 2 +- .../service/request/EditingLinkRequest.java | 20 ----------------- .../ReferenceRoomAcceptanceTest.java | 3 +-- .../com/woowacourse/moamoa/WebMVCTest.java | 8 +++---- ...st.java => LinkArticleControllerTest.java} | 22 +++++++++---------- ...> SearchingLinkArticleControllerTest.java} | 18 ++++++--------- 9 files changed, 38 insertions(+), 69 deletions(-) rename backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/{ReferenceRoomController.java => LinkArticleController.java} (74%) rename backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/{SearchingReferenceRoomController.java => SearchingLinkArticleController.java} (73%) rename backend/src/main/java/com/woowacourse/moamoa/studyroom/service/{ReferenceRoomService.java => LinkArticleService.java} (93%) rename backend/src/main/java/com/woowacourse/moamoa/studyroom/service/{SearchingReferenceRoomService.java => SearchingLinkArticleService.java} (97%) delete mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/EditingLinkRequest.java rename backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/{ReferenceRoomControllerTest.java => LinkArticleControllerTest.java} (83%) rename backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/{SearchingReferenceRoomControllerTest.java => SearchingLinkArticleControllerTest.java} (89%) diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/ReferenceRoomController.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleController.java similarity index 74% rename from backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/ReferenceRoomController.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleController.java index 63d2f7fbc..6c45d5f70 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/ReferenceRoomController.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleController.java @@ -1,10 +1,8 @@ package com.woowacourse.moamoa.studyroom.controller; import com.woowacourse.moamoa.auth.config.AuthenticatedMember; -import com.woowacourse.moamoa.auth.config.AuthenticationPrincipal; -import com.woowacourse.moamoa.studyroom.service.ReferenceRoomService; +import com.woowacourse.moamoa.studyroom.service.LinkArticleService; import com.woowacourse.moamoa.studyroom.service.request.LinkArticleRequest; -import com.woowacourse.moamoa.studyroom.service.request.EditingLinkRequest; import java.net.URI; import javax.validation.Valid; import lombok.RequiredArgsConstructor; @@ -20,9 +18,9 @@ @RestController @RequestMapping("/api/studies/{study-id}/reference-room/links") @RequiredArgsConstructor -public class ReferenceRoomController { +public class LinkArticleController { - private final ReferenceRoomService referenceRoomService; + private final LinkArticleService linkArticleService; @PostMapping public ResponseEntity createLink( @@ -30,7 +28,7 @@ public ResponseEntity createLink( @PathVariable("study-id") final Long studyId, @Valid @RequestBody final LinkArticleRequest linkArticleRequest ) { - final Long id = referenceRoomService.createLink(memberId, studyId, linkArticleRequest).getId(); + final Long id = linkArticleService.createLink(memberId, studyId, linkArticleRequest).getId(); return ResponseEntity.created(URI.create("/api/studies/" + studyId + "/reference-room/links/" + id)).build(); } @@ -39,9 +37,9 @@ public ResponseEntity updateLink( @AuthenticatedMember final Long memberId, @PathVariable("study-id") final Long studyId, @PathVariable("link-id") final Long linkId, - @Valid @RequestBody final EditingLinkRequest editingLinkRequest + @Valid @RequestBody final LinkArticleRequest linkArticleRequest ) { - referenceRoomService.updateLink(memberId, studyId, linkId, editingLinkRequest); + linkArticleService.updateLink(memberId, studyId, linkId, linkArticleRequest); return ResponseEntity.noContent().build(); } @@ -51,7 +49,7 @@ public ResponseEntity deleteLink( @PathVariable("study-id") final Long studyId, @PathVariable("link-id") final Long linkId ) { - referenceRoomService.deleteLink(memberId, studyId, linkId); + linkArticleService.deleteLink(memberId, studyId, linkId); return ResponseEntity.noContent().build(); } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/SearchingReferenceRoomController.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/SearchingLinkArticleController.java similarity index 73% rename from backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/SearchingReferenceRoomController.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/SearchingLinkArticleController.java index c5bca9663..a310c5630 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/SearchingReferenceRoomController.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/SearchingLinkArticleController.java @@ -1,8 +1,7 @@ package com.woowacourse.moamoa.studyroom.controller; import com.woowacourse.moamoa.auth.config.AuthenticatedMember; -import com.woowacourse.moamoa.auth.config.AuthenticationPrincipal; -import com.woowacourse.moamoa.studyroom.service.SearchingReferenceRoomService; +import com.woowacourse.moamoa.studyroom.service.SearchingLinkArticleService; import com.woowacourse.moamoa.studyroom.service.response.LinksResponse; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Pageable; @@ -16,9 +15,9 @@ @RestController @RequestMapping("/api/studies/{study-id}/reference-room/links") @RequiredArgsConstructor -public class SearchingReferenceRoomController { +public class SearchingLinkArticleController { - private final SearchingReferenceRoomService searchingReferenceRoomService; + private final SearchingLinkArticleService searchingLinkArticleService; @GetMapping public ResponseEntity getLinks( @@ -26,7 +25,7 @@ public ResponseEntity getLinks( @PathVariable("study-id") final Long studyId, @PageableDefault(size = 9) final Pageable pageable ) { - final LinksResponse linksResponse = searchingReferenceRoomService.getLinks(memberId, studyId, pageable); + final LinksResponse linksResponse = searchingLinkArticleService.getLinks(memberId, studyId, pageable); return ResponseEntity.ok().body(linksResponse); } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ReferenceRoomService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java similarity index 93% rename from backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ReferenceRoomService.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java index 9a7a48d4b..55511069b 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ReferenceRoomService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java @@ -13,21 +13,20 @@ import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.service.exception.LinkNotFoundException; import com.woowacourse.moamoa.studyroom.service.exception.NotParticipatedMemberException; -import com.woowacourse.moamoa.studyroom.service.request.EditingLinkRequest; import com.woowacourse.moamoa.studyroom.service.request.LinkArticleRequest; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service @Transactional -public class ReferenceRoomService { +public class LinkArticleService { private final StudyRoomRepository studyRoomRepository; private final MemberRepository memberRepository; private final StudyRepository studyRepository; private final LinkArticleRepository linkArticleRepository; - public ReferenceRoomService( + public LinkArticleService( final StudyRoomRepository studyRoomRepository, final MemberRepository memberRepository, final StudyRepository studyRepository, @@ -48,7 +47,7 @@ public LinkArticle createLink(final Long memberId, final Long studyId, final Lin } public void updateLink( - final Long memberId, final Long studyId, final Long linkId, final EditingLinkRequest editingLinkRequest + final Long memberId, final Long studyId, final Long linkId, final LinkArticleRequest linkArticleRequest ) { final Member member = memberRepository.findById(memberId) .orElseThrow(MemberNotFoundException::new); @@ -64,7 +63,7 @@ public void updateLink( } final LinkArticle updatedLinkArticle = studyRoom.writeLinkArticle(new Accessor(member.getId(), studyId), - editingLinkRequest.getLinkUrl(), editingLinkRequest.getDescription()); + linkArticleRequest.getLinkUrl(), linkArticleRequest.getDescription()); linkArticle.update(updatedLinkArticle); } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/SearchingReferenceRoomService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/SearchingLinkArticleService.java similarity index 97% rename from backend/src/main/java/com/woowacourse/moamoa/studyroom/service/SearchingReferenceRoomService.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/service/SearchingLinkArticleService.java index 2885e9a23..10e74754b 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/SearchingReferenceRoomService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/SearchingLinkArticleService.java @@ -19,7 +19,7 @@ @Service @Transactional(readOnly = true) @RequiredArgsConstructor -public class SearchingReferenceRoomService { +public class SearchingLinkArticleService { private final LinkDao linkDao; private final MemberRepository memberRepository; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/EditingLinkRequest.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/EditingLinkRequest.java deleted file mode 100644 index 9245926e7..000000000 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/EditingLinkRequest.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.woowacourse.moamoa.studyroom.service.request; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.Size; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Getter -public class EditingLinkRequest { - - @NotBlank(message = "공유할 링크 URL을 입력해 주세요.") - @Size(max = 500, message = "링크 URL은 500자를 초과할 수 없습니다.") - private String linkUrl; - - @Size(max = 40, message = "설명은 40자를 초과할 수 없습니다.") - private String description; -} diff --git a/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/ReferenceRoomAcceptanceTest.java b/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/ReferenceRoomAcceptanceTest.java index 69911c322..d9f742c59 100644 --- a/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/ReferenceRoomAcceptanceTest.java +++ b/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/ReferenceRoomAcceptanceTest.java @@ -31,7 +31,6 @@ import com.woowacourse.acceptance.AcceptanceTest; import com.woowacourse.moamoa.studyroom.service.request.LinkArticleRequest; -import com.woowacourse.moamoa.studyroom.service.request.EditingLinkRequest; import com.woowacourse.moamoa.studyroom.service.response.AuthorResponse; import com.woowacourse.moamoa.studyroom.service.response.LinkResponse; import com.woowacourse.moamoa.studyroom.service.response.LinksResponse; @@ -167,7 +166,7 @@ void updateLink() { final Long 짱구_링크공유_ID = 짱구가().로그인하고().스터디에(자바_스터디_ID).링크를_공유한다(linkArticleRequest); final String token = 짱구가().로그인한다(); - final EditingLinkRequest editingLinkRequest = new EditingLinkRequest("https://github.com/woowacourse", + final LinkArticleRequest editingLinkRequest = new LinkArticleRequest("https://github.com/woowacourse", "수정된 링크 설명입니다."); RestAssured.given(spec).log().all() diff --git a/backend/src/test/java/com/woowacourse/moamoa/WebMVCTest.java b/backend/src/test/java/com/woowacourse/moamoa/WebMVCTest.java index 2638ac164..eb40b0de8 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/WebMVCTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/WebMVCTest.java @@ -11,8 +11,8 @@ import com.woowacourse.moamoa.common.MockedServiceObjectsBeanRegister; import com.woowacourse.moamoa.member.domain.Member; import com.woowacourse.moamoa.member.domain.repository.MemberRepository; -import com.woowacourse.moamoa.studyroom.service.ReferenceRoomService; -import com.woowacourse.moamoa.studyroom.service.SearchingReferenceRoomService; +import com.woowacourse.moamoa.studyroom.service.LinkArticleService; +import com.woowacourse.moamoa.studyroom.service.SearchingLinkArticleService; import java.util.Optional; import javax.servlet.http.HttpServletRequest; @@ -50,10 +50,10 @@ public abstract class WebMVCTest { private MemberRepository memberRepository; @MockBean - protected ReferenceRoomService referenceRoomService; + protected LinkArticleService linkArticleService; @MockBean - protected SearchingReferenceRoomService searchingReferenceRoomService; + protected SearchingLinkArticleService searchingLinkArticleService; @MockBean protected HttpServletRequest httpServletRequest; diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/ReferenceRoomControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java similarity index 83% rename from backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/ReferenceRoomControllerTest.java rename to backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java index e0db27a62..b93cb1154 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/ReferenceRoomControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java @@ -1,7 +1,6 @@ package com.woowacourse.moamoa.studyroom.controller; import static com.woowacourse.moamoa.fixtures.MemberFixtures.디우; -import static com.woowacourse.moamoa.fixtures.MemberFixtures.디우_깃허브_아이디; import static com.woowacourse.moamoa.fixtures.MemberFixtures.베루스; import static com.woowacourse.moamoa.fixtures.MemberFixtures.짱구; import static com.woowacourse.moamoa.fixtures.MemberFixtures.짱구_깃허브_아이디; @@ -17,12 +16,11 @@ import com.woowacourse.moamoa.study.service.request.StudyRequest; import com.woowacourse.moamoa.studyroom.domain.repository.article.LinkArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; -import com.woowacourse.moamoa.studyroom.service.ReferenceRoomService; +import com.woowacourse.moamoa.studyroom.service.LinkArticleService; import com.woowacourse.moamoa.studyroom.service.exception.LinkNotFoundException; import com.woowacourse.moamoa.studyroom.service.exception.NotParticipatedMemberException; import com.woowacourse.moamoa.studyroom.service.exception.UneditableArticleException; import com.woowacourse.moamoa.studyroom.service.request.LinkArticleRequest; -import com.woowacourse.moamoa.studyroom.service.request.EditingLinkRequest; import java.time.LocalDate; import javax.persistence.EntityManager; import org.junit.jupiter.api.BeforeEach; @@ -31,7 +29,7 @@ import org.springframework.beans.factory.annotation.Autowired; @RepositoryTest -class ReferenceRoomControllerTest { +class LinkArticleControllerTest { @Autowired private MemberRepository memberRepository; @@ -48,7 +46,7 @@ class ReferenceRoomControllerTest { @Autowired private EntityManager entityManager; - private ReferenceRoomController sut; + private LinkArticleController sut; private Long jjangguId; private Long verusId; @@ -58,8 +56,8 @@ class ReferenceRoomControllerTest { @BeforeEach void setUp() { - sut = new ReferenceRoomController( - new ReferenceRoomService(studyRoomRepository, memberRepository, studyRepository, linkArticleRepository) + sut = new LinkArticleController( + new LinkArticleService(studyRoomRepository, memberRepository, studyRepository, linkArticleRepository) ); // 사용자 추가 @@ -78,12 +76,12 @@ void setUp() { participantService.participateStudy(verusId, javaStudyId); // 링크 공유 생성 - final ReferenceRoomService referenceRoomService = - new ReferenceRoomService(studyRoomRepository, memberRepository, studyRepository, linkArticleRepository); + final LinkArticleService linkArticleService = + new LinkArticleService(studyRoomRepository, memberRepository, studyRepository, linkArticleRepository); final LinkArticleRequest linkArticleRequest = new LinkArticleRequest("https://github.com/sc0116", "링크 설명입니다."); - linkId = referenceRoomService.createLink(jjangguId, javaStudyId, linkArticleRequest).getId(); + linkId = linkArticleService.createLink(jjangguId, javaStudyId, linkArticleRequest).getId(); entityManager.flush(); entityManager.clear(); @@ -102,7 +100,7 @@ void createByNotParticipatedMember() { @DisplayName("존재하지 않는 링크 공유글을 수정할 수 없다.") @Test void updateByInvalidLinkId() { - final EditingLinkRequest editingLinkRequest = new EditingLinkRequest("www.naver.com", "수정"); + final LinkArticleRequest editingLinkRequest = new LinkArticleRequest("www.naver.com", "수정"); assertThatThrownBy(() -> sut.updateLink(jjangguId, javaStudyId, -1L, editingLinkRequest)) .isInstanceOf(LinkNotFoundException.class); @@ -111,7 +109,7 @@ void updateByInvalidLinkId() { @DisplayName("스터디에 참여하지 않은 경우 링크 공유글을 수정할 수 없다.") @Test void updateByNotParticipatedMember() { - final EditingLinkRequest editingLinkRequest = new EditingLinkRequest("https://github.com", "수정된 링크 설명입니다."); + final LinkArticleRequest editingLinkRequest = new LinkArticleRequest("https://github.com", "수정된 링크 설명입니다."); assertThatThrownBy(() -> sut.updateLink(dwooId, javaStudyId, linkId, editingLinkRequest)) .isInstanceOf(NotParticipatedMemberException.class); diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/SearchingReferenceRoomControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/SearchingLinkArticleControllerTest.java similarity index 89% rename from backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/SearchingReferenceRoomControllerTest.java rename to backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/SearchingLinkArticleControllerTest.java index 5b70529e6..816b2b11c 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/SearchingReferenceRoomControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/SearchingLinkArticleControllerTest.java @@ -1,16 +1,12 @@ package com.woowacourse.moamoa.studyroom.controller; import static com.woowacourse.moamoa.fixtures.MemberFixtures.그린론; -import static com.woowacourse.moamoa.fixtures.MemberFixtures.그린론_깃허브_아이디; import static com.woowacourse.moamoa.fixtures.MemberFixtures.그린론_응답; import static com.woowacourse.moamoa.fixtures.MemberFixtures.디우; -import static com.woowacourse.moamoa.fixtures.MemberFixtures.디우_깃허브_아이디; import static com.woowacourse.moamoa.fixtures.MemberFixtures.디우_응답; import static com.woowacourse.moamoa.fixtures.MemberFixtures.베루스; -import static com.woowacourse.moamoa.fixtures.MemberFixtures.베루스_깃허브_아이디; import static com.woowacourse.moamoa.fixtures.MemberFixtures.베루스_응답; import static com.woowacourse.moamoa.fixtures.MemberFixtures.병민; -import static com.woowacourse.moamoa.fixtures.MemberFixtures.병민_깃허브_아이디; import static com.woowacourse.moamoa.fixtures.MemberFixtures.짱구; import static com.woowacourse.moamoa.fixtures.MemberFixtures.짱구_깃허브_아이디; import static com.woowacourse.moamoa.fixtures.MemberFixtures.짱구_응답; @@ -28,8 +24,8 @@ import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.LinkDao; import com.woowacourse.moamoa.studyroom.query.data.LinkData; -import com.woowacourse.moamoa.studyroom.service.ReferenceRoomService; -import com.woowacourse.moamoa.studyroom.service.SearchingReferenceRoomService; +import com.woowacourse.moamoa.studyroom.service.LinkArticleService; +import com.woowacourse.moamoa.studyroom.service.SearchingLinkArticleService; import com.woowacourse.moamoa.studyroom.service.exception.NotParticipatedMemberException; import com.woowacourse.moamoa.studyroom.service.request.LinkArticleRequest; import com.woowacourse.moamoa.studyroom.service.response.LinkResponse; @@ -51,7 +47,7 @@ import org.springframework.http.ResponseEntity; @RepositoryTest -class SearchingReferenceRoomControllerTest { +class SearchingLinkArticleControllerTest { @Autowired private LinkDao linkDao; @@ -71,7 +67,7 @@ class SearchingReferenceRoomControllerTest { @Autowired private EntityManager entityManager; - private SearchingReferenceRoomController sut; + private SearchingLinkArticleController sut; private Study javaStudy; @@ -84,8 +80,8 @@ class SearchingReferenceRoomControllerTest { @BeforeEach void setUp() { - sut = new SearchingReferenceRoomController( - new SearchingReferenceRoomService(linkDao, memberRepository, studyRepository)); + sut = new SearchingLinkArticleController( + new SearchingLinkArticleService(linkDao, memberRepository, studyRepository)); // 사용자 추가 jjanggu = memberRepository.save(짱구()); @@ -108,7 +104,7 @@ void setUp() { participantService.participateStudy(verus.getId(), javaStudy.getId()); // 링크 공유 추가 - final ReferenceRoomService linkService = new ReferenceRoomService(studyRoomRepository, memberRepository, + final LinkArticleService linkService = new LinkArticleService(studyRoomRepository, memberRepository, studyRepository, linkArticleRepository); final LinkArticleRequest request1 = new LinkArticleRequest("https://github.com/sc0116", "짱구 링크."); From 56bffea448698878a493cf57692669e663010d45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=A7=84=ED=98=81?= Date: Wed, 14 Sep 2022 17:24:28 +0900 Subject: [PATCH 04/40] =?UTF-8?q?refactor:=20LinkArticle=20update=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../studyroom/domain/article/LinkArticle.java | 13 +++-- .../studyroom/service/LinkArticleService.java | 21 ++----- .../exception/NotArticleAuthorException.java | 10 ---- .../exception/NotCreatingLinkException.java | 10 ---- .../exception/NotRelatedArticleException.java | 10 ---- .../controller/LinkArticleControllerTest.java | 6 +- .../studyroom/domain/LinkArticleTest.java | 56 +++++++------------ 7 files changed, 36 insertions(+), 90 deletions(-) delete mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/NotArticleAuthorException.java delete mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/NotCreatingLinkException.java delete mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/NotRelatedArticleException.java diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticle.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticle.java index 667478d09..f774b87c7 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticle.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticle.java @@ -1,9 +1,11 @@ package com.woowacourse.moamoa.studyroom.domain.article; import com.woowacourse.moamoa.common.entity.BaseEntity; +import com.woowacourse.moamoa.studyroom.domain.Accessor; import com.woowacourse.moamoa.studyroom.domain.StudyRoom; import com.woowacourse.moamoa.studyroom.service.exception.NotLinkAuthorException; import com.woowacourse.moamoa.studyroom.service.exception.NotRelatedLinkException; +import com.woowacourse.moamoa.studyroom.service.exception.UneditableArticleException; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; @@ -56,12 +58,13 @@ private LinkArticle(final Long id, final StudyRoom studyRoom, final Long authorI this.deleted = deleted; } - public void update(final LinkArticle updatedLinkArticle) { - validateBelongToStudy(updatedLinkArticle.studyRoom.getId()); - validateAuthor(updatedLinkArticle.authorId); + public void update(final Accessor accessor, final String linkUrl, final String description) { + if (!studyRoom.isPermittedAccessor(accessor) || !authorId.equals(accessor.getMemberId())) { + throw new UneditableArticleException(studyRoom.getId(), accessor, ArticleType.LINK); + } - linkUrl = updatedLinkArticle.linkUrl; - description = updatedLinkArticle.description; + this.linkUrl = linkUrl; + this.description = description; } public void delete(Long authorId, Long studyId) { diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java index 55511069b..384d731d7 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java @@ -37,7 +37,9 @@ public LinkArticleService( this.linkArticleRepository = linkArticleRepository; } - public LinkArticle createLink(final Long memberId, final Long studyId, final LinkArticleRequest linkArticleRequest) { + public LinkArticle createLink( + final Long memberId, final Long studyId, final LinkArticleRequest linkArticleRequest + ) { final StudyRoom studyRoom = studyRoomRepository.findByStudyId(studyId) .orElseThrow(StudyNotFoundException::new); final LinkArticle linkArticle = studyRoom.writeLinkArticle( @@ -49,23 +51,12 @@ public LinkArticle createLink(final Long memberId, final Long studyId, final Lin public void updateLink( final Long memberId, final Long studyId, final Long linkId, final LinkArticleRequest linkArticleRequest ) { - final Member member = memberRepository.findById(memberId) - .orElseThrow(MemberNotFoundException::new); - final Study study = studyRepository.findById(studyId) - .orElseThrow(StudyNotFoundException::new); - final StudyRoom studyRoom = studyRoomRepository.findByStudyId(studyId) - .orElseThrow(StudyNotFoundException::new); final LinkArticle linkArticle = linkArticleRepository.findById(linkId) .orElseThrow(LinkNotFoundException::new); - if (!study.isParticipant(member.getId())) { - throw new NotParticipatedMemberException(); - } - - final LinkArticle updatedLinkArticle = studyRoom.writeLinkArticle(new Accessor(member.getId(), studyId), - linkArticleRequest.getLinkUrl(), linkArticleRequest.getDescription()); - - linkArticle.update(updatedLinkArticle); + final String linkUrl = linkArticleRequest.getLinkUrl(); + final String description = linkArticleRequest.getDescription(); + linkArticle.update(new Accessor(memberId, studyId), linkUrl, description); } public void deleteLink(final Long memberId, final Long studyId, final Long linkId) { diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/NotArticleAuthorException.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/NotArticleAuthorException.java deleted file mode 100644 index 4cfd4553b..000000000 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/NotArticleAuthorException.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.woowacourse.moamoa.studyroom.service.exception; - -import com.woowacourse.moamoa.common.exception.BadRequestException; - -public class NotArticleAuthorException extends BadRequestException { - - public NotArticleAuthorException(final Long articleId, final Long authorId) { - super("게시글[" + articleId + "]은 작성자[" + authorId + "]가 아닙니다."); - } -} diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/NotCreatingLinkException.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/NotCreatingLinkException.java deleted file mode 100644 index da45ad83f..000000000 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/NotCreatingLinkException.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.woowacourse.moamoa.studyroom.service.exception; - -import com.woowacourse.moamoa.common.exception.BadRequestException; - -public class NotCreatingLinkException extends BadRequestException { - - public NotCreatingLinkException() { - super("링크 공유를 할 수 없습니다."); - } -} diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/NotRelatedArticleException.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/NotRelatedArticleException.java deleted file mode 100644 index 3d9726e7b..000000000 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/NotRelatedArticleException.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.woowacourse.moamoa.studyroom.service.exception; - -import com.woowacourse.moamoa.common.exception.BadRequestException; - -public class NotRelatedArticleException extends BadRequestException { - - public NotRelatedArticleException(final Long studyId, final Long articleId) { - super("스터디[" + studyId + "] 에 작성된 게시글[" + articleId + "] 가 없습니다."); - } -} diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java index b93cb1154..d6a1652d4 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java @@ -109,10 +109,10 @@ void updateByInvalidLinkId() { @DisplayName("스터디에 참여하지 않은 경우 링크 공유글을 수정할 수 없다.") @Test void updateByNotParticipatedMember() { - final LinkArticleRequest editingLinkRequest = new LinkArticleRequest("https://github.com", "수정된 링크 설명입니다."); + final LinkArticleRequest linkArticleRequest = new LinkArticleRequest("https://github.com", "수정된 링크 설명입니다."); - assertThatThrownBy(() -> sut.updateLink(dwooId, javaStudyId, linkId, editingLinkRequest)) - .isInstanceOf(NotParticipatedMemberException.class); + assertThatThrownBy(() -> sut.updateLink(dwooId, javaStudyId, linkId, linkArticleRequest)) + .isInstanceOf(UneditableArticleException.class); } @DisplayName("존재하지 않는 링크 공유글을 삭제할 수 없다.") diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/LinkArticleTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/LinkArticleTest.java index 3d498ab55..79b38f0dd 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/LinkArticleTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/LinkArticleTest.java @@ -8,65 +8,47 @@ import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; import com.woowacourse.moamoa.studyroom.service.exception.NotLinkAuthorException; import com.woowacourse.moamoa.studyroom.service.exception.NotRelatedLinkException; +import com.woowacourse.moamoa.studyroom.service.exception.UneditableArticleException; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; class LinkArticleTest { - @DisplayName("링크 공유를 수정한다.") + @DisplayName("링크 게시글을 작성자가 수정한다.") @Test void update() { + // arrange final Member owner = createMember(1L); final StudyRoom studyRoom = createStudyRoom(1L, owner); + final Accessor accessor = new Accessor(owner.getId(), studyRoom.getId()); + final LinkArticle sut = studyRoom.writeLinkArticle(accessor, "link", "설명"); - final LinkArticle linkArticle = studyRoom.writeLinkArticle(new Accessor(owner.getId(), studyRoom.getId()), - "link", "설명"); - final LinkArticle updatedLinkArticle = studyRoom - .writeLinkArticle(new Accessor(owner.getId(), studyRoom.getId()), - "updated link", "수정된 설명"); - - linkArticle.update(updatedLinkArticle); + // act + sut.update(accessor, "updated link", "수정된 설명"); + // assert assertAll( - () -> assertThat(linkArticle.getLinkUrl()).isEqualTo("updated link"), - () -> assertThat(linkArticle.getDescription()).isEqualTo("수정된 설명") + () -> assertThat(sut.getLinkUrl()).isEqualTo("updated link"), + () -> assertThat(sut.getDescription()).isEqualTo("수정된 설명") ); } - @DisplayName("작성자가 아니면 수정할 수 없다.") - @Test - void updateByNotAuthor() { + @ParameterizedTest + @DisplayName("스터디에 참여한 작성자 외에는 링크 게시글을 수정할 수 없다.") + @CsvSource({"2,1", "1,2"}) + void updateByNotAuthor(final long memberId, final long studyId) { final Member owner = createMember(1L); final StudyRoom studyRoom = createStudyRoom(1L, owner); - - final LinkArticle linkArticle = studyRoom.writeLinkArticle(new Accessor(owner.getId(), studyRoom.getId()), + final LinkArticle sut = studyRoom.writeLinkArticle(new Accessor(owner.getId(), studyRoom.getId()), "link", "설명"); - final LinkArticle updatedLinkArticle = new LinkArticle(studyRoom, 2L, "updated link", - "수정된 설명"); - - assertThatThrownBy(() -> linkArticle.update(updatedLinkArticle)) - .isInstanceOf(NotLinkAuthorException.class); - } - - @DisplayName("스터디에 속하지 않은 링크 공유글을 수정할 수 없다.") - @Test - void updateByNotBelongToStudy() { - final Member owner = createMember(1L); - final StudyRoom studyRoom = createStudyRoom(1L, owner); - final StudyRoom anotherStudyRoom = createStudyRoom(2L, owner); - - final LinkArticle linkArticle = studyRoom.writeLinkArticle(new Accessor(owner.getId(), studyRoom.getId()), - "link", "설명"); - - final LinkArticle updatedLinkArticle = anotherStudyRoom.writeLinkArticle(new Accessor(owner.getId(), anotherStudyRoom.getId()), - "updated link", "수정된 설명"); - - assertThatThrownBy(() -> linkArticle.update(updatedLinkArticle)) - .isInstanceOf(NotRelatedLinkException.class); + assertThatThrownBy(() -> sut.update(new Accessor(memberId, studyId), "updated link", "수정된 설명")) + .isInstanceOf(UneditableArticleException.class); } @DisplayName("링크 공유를 삭제한다.") From 5de05b1c9ee79978d3ef7545909c3916faddbd4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=A7=84=ED=98=81?= Date: Wed, 14 Sep 2022 17:36:34 +0900 Subject: [PATCH 05/40] =?UTF-8?q?refactor:=20LinkArticle=20delete=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../studyroom/domain/article/LinkArticle.java | 21 ++--------- .../studyroom/service/LinkArticleService.java | 37 ++++++------------- .../exception/NotLinkAuthorException.java | 10 ----- .../exception/NotRelatedLinkException.java | 10 ----- .../controller/LinkArticleControllerTest.java | 9 +++-- .../SearchingLinkArticleControllerTest.java | 4 +- .../studyroom/domain/LinkArticleTest.java | 30 ++++----------- 7 files changed, 30 insertions(+), 91 deletions(-) delete mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/NotLinkAuthorException.java delete mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/NotRelatedLinkException.java diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticle.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticle.java index f774b87c7..8753ba824 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticle.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticle.java @@ -3,8 +3,6 @@ import com.woowacourse.moamoa.common.entity.BaseEntity; import com.woowacourse.moamoa.studyroom.domain.Accessor; import com.woowacourse.moamoa.studyroom.domain.StudyRoom; -import com.woowacourse.moamoa.studyroom.service.exception.NotLinkAuthorException; -import com.woowacourse.moamoa.studyroom.service.exception.NotRelatedLinkException; import com.woowacourse.moamoa.studyroom.service.exception.UneditableArticleException; import javax.persistence.Column; import javax.persistence.Entity; @@ -67,23 +65,12 @@ public void update(final Accessor accessor, final String linkUrl, final String d this.description = description; } - public void delete(Long authorId, Long studyId) { - validateBelongToStudy(studyId); - validateAuthor(authorId); - - deleted = true; - } - - private void validateBelongToStudy(final Long associatedStudy) { - if (!this.studyRoom.getId().equals(associatedStudy)) { - throw new NotRelatedLinkException(); + public void delete(final Accessor accessor) { + if (!studyRoom.isPermittedAccessor(accessor) || !authorId.equals(accessor.getMemberId())) { + throw new UneditableArticleException(studyRoom.getId(), accessor, ArticleType.LINK); } - } - private void validateAuthor(final Long authorId) { - if (!this.authorId.equals(authorId)) { - throw new NotLinkAuthorException(); - } + deleted = true; } public Long getId() { diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java index 384d731d7..c234cf3aa 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java @@ -1,18 +1,13 @@ package com.woowacourse.moamoa.studyroom.service; -import com.woowacourse.moamoa.member.domain.Member; -import com.woowacourse.moamoa.member.domain.repository.MemberRepository; -import com.woowacourse.moamoa.member.service.exception.MemberNotFoundException; -import com.woowacourse.moamoa.study.domain.Study; -import com.woowacourse.moamoa.study.domain.repository.StudyRepository; import com.woowacourse.moamoa.study.service.exception.StudyNotFoundException; import com.woowacourse.moamoa.studyroom.domain.Accessor; import com.woowacourse.moamoa.studyroom.domain.StudyRoom; import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; import com.woowacourse.moamoa.studyroom.domain.repository.article.LinkArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; +import com.woowacourse.moamoa.studyroom.service.exception.ArticleNotFoundException; import com.woowacourse.moamoa.studyroom.service.exception.LinkNotFoundException; -import com.woowacourse.moamoa.studyroom.service.exception.NotParticipatedMemberException; import com.woowacourse.moamoa.studyroom.service.request.LinkArticleRequest; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -22,18 +17,12 @@ public class LinkArticleService { private final StudyRoomRepository studyRoomRepository; - private final MemberRepository memberRepository; - private final StudyRepository studyRepository; private final LinkArticleRepository linkArticleRepository; public LinkArticleService( - final StudyRoomRepository studyRoomRepository, - final MemberRepository memberRepository, - final StudyRepository studyRepository, - final LinkArticleRepository linkArticleRepository) { + final StudyRoomRepository studyRoomRepository, final LinkArticleRepository linkArticleRepository + ) { this.studyRoomRepository = studyRoomRepository; - this.memberRepository = memberRepository; - this.studyRepository = studyRepository; this.linkArticleRepository = linkArticleRepository; } @@ -49,28 +38,24 @@ public LinkArticle createLink( } public void updateLink( - final Long memberId, final Long studyId, final Long linkId, final LinkArticleRequest linkArticleRequest + final Long memberId, final Long studyId, final Long articleId, final LinkArticleRequest linkArticleRequest ) { - final LinkArticle linkArticle = linkArticleRepository.findById(linkId) - .orElseThrow(LinkNotFoundException::new); + final LinkArticle linkArticle = linkArticleRepository.findById(articleId) + .orElseThrow(() -> new ArticleNotFoundException(articleId)); + final Accessor accessor = new Accessor(memberId, studyId); final String linkUrl = linkArticleRequest.getLinkUrl(); final String description = linkArticleRequest.getDescription(); - linkArticle.update(new Accessor(memberId, studyId), linkUrl, description); + + linkArticle.update(accessor, linkUrl, description); } public void deleteLink(final Long memberId, final Long studyId, final Long linkId) { - final Member member = memberRepository.findById(memberId) - .orElseThrow(MemberNotFoundException::new); - final Study study = studyRepository.findById(studyId) - .orElseThrow(StudyNotFoundException::new); final LinkArticle linkArticle = linkArticleRepository.findById(linkId) .orElseThrow(LinkNotFoundException::new); - if (!study.isParticipant(member.getId())) { - throw new NotParticipatedMemberException(); - } + final Accessor accessor = new Accessor(memberId, studyId); - linkArticle.delete(member.getId(), studyId); + linkArticle.delete(accessor); } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/NotLinkAuthorException.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/NotLinkAuthorException.java deleted file mode 100644 index 7f2898377..000000000 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/NotLinkAuthorException.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.woowacourse.moamoa.studyroom.service.exception; - -import com.woowacourse.moamoa.common.exception.BadRequestException; - -public class NotLinkAuthorException extends BadRequestException { - - public NotLinkAuthorException() { - super("내가 작성한 링크 공유글이 아닙니다."); - } -} diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/NotRelatedLinkException.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/NotRelatedLinkException.java deleted file mode 100644 index 876d48f31..000000000 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/NotRelatedLinkException.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.woowacourse.moamoa.studyroom.service.exception; - -import com.woowacourse.moamoa.common.exception.BadRequestException; - -public class NotRelatedLinkException extends BadRequestException { - - public NotRelatedLinkException() { - super("해당 스터디에 작성된 링크 공유글이 아닙니다."); - } -} diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java index d6a1652d4..17f5645d1 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java @@ -17,6 +17,7 @@ import com.woowacourse.moamoa.studyroom.domain.repository.article.LinkArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.service.LinkArticleService; +import com.woowacourse.moamoa.studyroom.service.exception.ArticleNotFoundException; import com.woowacourse.moamoa.studyroom.service.exception.LinkNotFoundException; import com.woowacourse.moamoa.studyroom.service.exception.NotParticipatedMemberException; import com.woowacourse.moamoa.studyroom.service.exception.UneditableArticleException; @@ -57,7 +58,7 @@ class LinkArticleControllerTest { @BeforeEach void setUp() { sut = new LinkArticleController( - new LinkArticleService(studyRoomRepository, memberRepository, studyRepository, linkArticleRepository) + new LinkArticleService(studyRoomRepository, linkArticleRepository) ); // 사용자 추가 @@ -77,7 +78,7 @@ void setUp() { // 링크 공유 생성 final LinkArticleService linkArticleService = - new LinkArticleService(studyRoomRepository, memberRepository, studyRepository, linkArticleRepository); + new LinkArticleService(studyRoomRepository, linkArticleRepository); final LinkArticleRequest linkArticleRequest = new LinkArticleRequest("https://github.com/sc0116", "링크 설명입니다."); @@ -103,7 +104,7 @@ void updateByInvalidLinkId() { final LinkArticleRequest editingLinkRequest = new LinkArticleRequest("www.naver.com", "수정"); assertThatThrownBy(() -> sut.updateLink(jjangguId, javaStudyId, -1L, editingLinkRequest)) - .isInstanceOf(LinkNotFoundException.class); + .isInstanceOf(ArticleNotFoundException.class); } @DisplayName("스터디에 참여하지 않은 경우 링크 공유글을 수정할 수 없다.") @@ -126,6 +127,6 @@ void deleteByInvalidLinkId() { @Test void deleteByNotParticipatedMember() { assertThatThrownBy(() -> sut.deleteLink(dwooId, javaStudyId, linkId)) - .isInstanceOf(NotParticipatedMemberException.class); + .isInstanceOf(UneditableArticleException.class); } } diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/SearchingLinkArticleControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/SearchingLinkArticleControllerTest.java index 816b2b11c..a6db3dc36 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/SearchingLinkArticleControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/SearchingLinkArticleControllerTest.java @@ -104,8 +104,8 @@ void setUp() { participantService.participateStudy(verus.getId(), javaStudy.getId()); // 링크 공유 추가 - final LinkArticleService linkService = new LinkArticleService(studyRoomRepository, memberRepository, - studyRepository, linkArticleRepository); + final LinkArticleService linkService = new LinkArticleService(studyRoomRepository, + linkArticleRepository); final LinkArticleRequest request1 = new LinkArticleRequest("https://github.com/sc0116", "짱구 링크."); final LinkArticleRequest request2 = new LinkArticleRequest("https://github.com/jaejae-yoo", "그린론 링크."); diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/LinkArticleTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/LinkArticleTest.java index 79b38f0dd..35d3425ca 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/LinkArticleTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/LinkArticleTest.java @@ -6,8 +6,6 @@ import com.woowacourse.moamoa.member.domain.Member; import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; -import com.woowacourse.moamoa.studyroom.service.exception.NotLinkAuthorException; -import com.woowacourse.moamoa.studyroom.service.exception.NotRelatedLinkException; import com.woowacourse.moamoa.studyroom.service.exception.UneditableArticleException; import java.util.Set; import java.util.stream.Collectors; @@ -51,7 +49,7 @@ void updateByNotAuthor(final long memberId, final long studyId) { .isInstanceOf(UneditableArticleException.class); } - @DisplayName("링크 공유를 삭제한다.") + @DisplayName("스터디에 참여한 작성자만 링크 게시글을 삭제할 수 있다.") @Test void delete() { final Member owner = createMember(1L); @@ -60,35 +58,23 @@ void delete() { final LinkArticle linkArticle = studyRoom.writeLinkArticle(new Accessor(owner.getId(), studyRoom.getId()), "link", "설명"); - linkArticle.delete(1L, 1L); + linkArticle.delete(new Accessor(1L, 1L)); assertThat(linkArticle.isDeleted()).isTrue(); } - @DisplayName("작성자가 아니면 삭제할 수 없다.") - @Test - void deleteByNotAuthor() { - final Member owner = createMember(1L); - final StudyRoom studyRoom = createStudyRoom(1L, owner); - - final LinkArticle linkArticle = studyRoom.writeLinkArticle(new Accessor(owner.getId(), studyRoom.getId()), - "link", "설명"); - - assertThatThrownBy(() -> linkArticle.delete(2L, 1L)) - .isInstanceOf(NotLinkAuthorException.class); - } - - @DisplayName("스터디에 속하지 않은 링크 공유글을 삭제할 수 없다.") - @Test - void deleteByNotBelongToStudy() { + @ParameterizedTest + @DisplayName("스터디에 참여한 작성자 외에는 링크 게시글을 삭제할 수 없다.") + @CsvSource({"2,1", "1,2"}) + void deleteByNotAuthor(final long memberId, final long studyId) { final Member owner = createMember(1L); final StudyRoom studyRoom = createStudyRoom(1L, owner); final LinkArticle linkArticle = studyRoom.writeLinkArticle(new Accessor(owner.getId(), studyRoom.getId()), "link", "설명"); - assertThatThrownBy(() -> linkArticle.delete(1L, 2L)) - .isInstanceOf(NotRelatedLinkException.class); + assertThatThrownBy(() -> linkArticle.delete(new Accessor(memberId, studyId))) + .isInstanceOf(UneditableArticleException.class); } private StudyRoom createStudyRoom(long studyId, Member owner, Member... participant) { From 84776539c722912979506caf01de931784021ea3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=A7=84=ED=98=81?= Date: Wed, 14 Sep 2022 17:41:47 +0900 Subject: [PATCH 06/40] =?UTF-8?q?refactor:=20LinkNotFoundException=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../moamoa/studyroom/service/ArticleService.java | 8 ++++---- .../moamoa/studyroom/service/LinkArticleService.java | 10 +++++----- .../service/exception/ArticleNotFoundException.java | 5 +++-- .../service/exception/LinkNotFoundException.java | 10 ---------- .../controller/LinkArticleControllerTest.java | 4 +--- 5 files changed, 13 insertions(+), 24 deletions(-) delete mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/LinkNotFoundException.java diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ArticleService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ArticleService.java index f5269fb6a..358bd3d50 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ArticleService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ArticleService.java @@ -57,14 +57,14 @@ public ArticleResponse getArticle(final Long memberId, final Long studyId, final final ArticleType type) { final Article article = articleRepositoryFactory.getRepository(type) .findById(articleId) - .orElseThrow(() -> new ArticleNotFoundException(articleId)); + .orElseThrow(() -> new ArticleNotFoundException(articleId, type)); if (!article.isViewableBy(new Accessor(memberId, studyId))) { throw new UnviewableArticleException(studyId, memberId); } final ArticleData data = articleDao.getById(articleId, type) - .orElseThrow(() -> new ArticleNotFoundException(articleId)); + .orElseThrow(() -> new ArticleNotFoundException(articleId, type)); return new ArticleResponse(data); } @@ -72,7 +72,7 @@ public ArticleResponse getArticle(final Long memberId, final Long studyId, final public void deleteArticle(final Long memberId, final Long studyId, final Long articleId, final ArticleType type) { final Article article = articleRepositoryFactory.getRepository(type) .findById(articleId) - .orElseThrow(() -> new ArticleNotFoundException(articleId)); + .orElseThrow(() -> new ArticleNotFoundException(articleId, type)); if (!article.isEditableBy(new Accessor(memberId, studyId))) { throw new UneditableArticleException(studyId, new Accessor(memberId, studyId), type); @@ -105,7 +105,7 @@ public void updateArticle(final Long memberId, final Long studyId, final Long ar final ArticleRequest request, final ArticleType type) { final Article article = articleRepositoryFactory.getRepository(type) .findById(articleId) - .orElseThrow(() -> new ArticleNotFoundException(articleId)); + .orElseThrow(() -> new ArticleNotFoundException(articleId, type)); final Accessor accessor = new Accessor(memberId, studyId); diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java index c234cf3aa..e2a308b8a 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java @@ -3,11 +3,11 @@ import com.woowacourse.moamoa.study.service.exception.StudyNotFoundException; import com.woowacourse.moamoa.studyroom.domain.Accessor; import com.woowacourse.moamoa.studyroom.domain.StudyRoom; +import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; import com.woowacourse.moamoa.studyroom.domain.repository.article.LinkArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.service.exception.ArticleNotFoundException; -import com.woowacourse.moamoa.studyroom.service.exception.LinkNotFoundException; import com.woowacourse.moamoa.studyroom.service.request.LinkArticleRequest; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -41,7 +41,7 @@ public void updateLink( final Long memberId, final Long studyId, final Long articleId, final LinkArticleRequest linkArticleRequest ) { final LinkArticle linkArticle = linkArticleRepository.findById(articleId) - .orElseThrow(() -> new ArticleNotFoundException(articleId)); + .orElseThrow(() -> new ArticleNotFoundException(articleId, ArticleType.LINK)); final Accessor accessor = new Accessor(memberId, studyId); final String linkUrl = linkArticleRequest.getLinkUrl(); @@ -50,9 +50,9 @@ public void updateLink( linkArticle.update(accessor, linkUrl, description); } - public void deleteLink(final Long memberId, final Long studyId, final Long linkId) { - final LinkArticle linkArticle = linkArticleRepository.findById(linkId) - .orElseThrow(LinkNotFoundException::new); + public void deleteLink(final Long memberId, final Long studyId, final Long articleId) { + final LinkArticle linkArticle = linkArticleRepository.findById(articleId) + .orElseThrow(() -> new ArticleNotFoundException(articleId, ArticleType.LINK)); final Accessor accessor = new Accessor(memberId, studyId); diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/ArticleNotFoundException.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/ArticleNotFoundException.java index 1b54a0e02..b077c1562 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/ArticleNotFoundException.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/ArticleNotFoundException.java @@ -1,10 +1,11 @@ package com.woowacourse.moamoa.studyroom.service.exception; import com.woowacourse.moamoa.common.exception.NotFoundException; +import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; public class ArticleNotFoundException extends NotFoundException { - public ArticleNotFoundException(long articleId) { - super(articleId + "의 식별자를 가진 게시글이 존재하지 않습니다."); + public ArticleNotFoundException(long articleId, ArticleType type) { + super(String.format("%d의 식별자를 가진 타입 %s의 게시글이 존재하지 않습니다.", articleId, type)); } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/LinkNotFoundException.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/LinkNotFoundException.java deleted file mode 100644 index 6ea7c82bf..000000000 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/LinkNotFoundException.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.woowacourse.moamoa.studyroom.service.exception; - -import com.woowacourse.moamoa.common.exception.NotFoundException; - -public class LinkNotFoundException extends NotFoundException { - - public LinkNotFoundException() { - super("링크 공유글을 찾을 수 없습니다."); - } -} diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java index 17f5645d1..3d48cf82b 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java @@ -18,8 +18,6 @@ import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.service.LinkArticleService; import com.woowacourse.moamoa.studyroom.service.exception.ArticleNotFoundException; -import com.woowacourse.moamoa.studyroom.service.exception.LinkNotFoundException; -import com.woowacourse.moamoa.studyroom.service.exception.NotParticipatedMemberException; import com.woowacourse.moamoa.studyroom.service.exception.UneditableArticleException; import com.woowacourse.moamoa.studyroom.service.request.LinkArticleRequest; import java.time.LocalDate; @@ -120,7 +118,7 @@ void updateByNotParticipatedMember() { @Test void deleteByInvalidLinkId() { assertThatThrownBy(() -> sut.deleteLink(jjangguId, javaStudyId, -1L)) - .isInstanceOf(LinkNotFoundException.class); + .isInstanceOf(ArticleNotFoundException.class); } @DisplayName("스터디에 참여하지 않은 경우 링크 공유글을 삭제할 수 없다.") From 66a45f553a337f3703046406d0ee4e37d6c69ee8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=A7=84=ED=98=81?= Date: Wed, 14 Sep 2022 18:06:25 +0900 Subject: [PATCH 07/40] =?UTF-8?q?refactor:=20=EB=A7=81=ED=81=AC=20?= =?UTF-8?q?=EA=B2=8C=EC=8B=9C=EA=B8=80=20=EC=A1=B0=ED=9A=8C=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EC=84=9C=EB=B9=84=EC=8A=A4=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/LinkArticleController.java | 13 ++ .../SearchingLinkArticleController.java | 31 ---- .../studyroom/service/LinkArticleService.java | 15 +- .../service/SearchingLinkArticleService.java | 41 ----- ...st.java => LinkArticleAcceptanceTest.java} | 7 +- .../com/woowacourse/moamoa/WebMVCTest.java | 9 - .../controller/LinkArticleControllerTest.java | 8 +- .../SearchingLinkArticleControllerTest.java | 162 ------------------ 8 files changed, 34 insertions(+), 252 deletions(-) delete mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/SearchingLinkArticleController.java delete mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/service/SearchingLinkArticleService.java rename backend/src/test/java/com/woowacourse/acceptance/test/studyroom/{ReferenceRoomAcceptanceTest.java => LinkArticleAcceptanceTest.java} (97%) delete mode 100644 backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/SearchingLinkArticleControllerTest.java diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleController.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleController.java index 6c45d5f70..7d5a31f0d 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleController.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleController.java @@ -3,11 +3,15 @@ import com.woowacourse.moamoa.auth.config.AuthenticatedMember; import com.woowacourse.moamoa.studyroom.service.LinkArticleService; import com.woowacourse.moamoa.studyroom.service.request.LinkArticleRequest; +import com.woowacourse.moamoa.studyroom.service.response.LinksResponse; import java.net.URI; import javax.validation.Valid; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Pageable; +import org.springframework.data.web.PageableDefault; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; @@ -22,6 +26,15 @@ public class LinkArticleController { private final LinkArticleService linkArticleService; + @GetMapping + public ResponseEntity getLinks( + @PathVariable("study-id") final Long studyId, + @PageableDefault(size = 9) final Pageable pageable + ) { + final LinksResponse linksResponse = linkArticleService.getLinks(studyId, pageable); + return ResponseEntity.ok().body(linksResponse); + } + @PostMapping public ResponseEntity createLink( @AuthenticatedMember final Long memberId, diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/SearchingLinkArticleController.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/SearchingLinkArticleController.java deleted file mode 100644 index a310c5630..000000000 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/SearchingLinkArticleController.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.woowacourse.moamoa.studyroom.controller; - -import com.woowacourse.moamoa.auth.config.AuthenticatedMember; -import com.woowacourse.moamoa.studyroom.service.SearchingLinkArticleService; -import com.woowacourse.moamoa.studyroom.service.response.LinksResponse; -import lombok.RequiredArgsConstructor; -import org.springframework.data.domain.Pageable; -import org.springframework.data.web.PageableDefault; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequestMapping("/api/studies/{study-id}/reference-room/links") -@RequiredArgsConstructor -public class SearchingLinkArticleController { - - private final SearchingLinkArticleService searchingLinkArticleService; - - @GetMapping - public ResponseEntity getLinks( - @AuthenticatedMember final Long memberId, - @PathVariable("study-id") final Long studyId, - @PageableDefault(size = 9) final Pageable pageable - ) { - final LinksResponse linksResponse = searchingLinkArticleService.getLinks(memberId, studyId, pageable); - return ResponseEntity.ok().body(linksResponse); - } -} diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java index e2a308b8a..d9916891b 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java @@ -7,8 +7,13 @@ import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; import com.woowacourse.moamoa.studyroom.domain.repository.article.LinkArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; +import com.woowacourse.moamoa.studyroom.query.LinkDao; +import com.woowacourse.moamoa.studyroom.query.data.LinkData; import com.woowacourse.moamoa.studyroom.service.exception.ArticleNotFoundException; import com.woowacourse.moamoa.studyroom.service.request.LinkArticleRequest; +import com.woowacourse.moamoa.studyroom.service.response.LinksResponse; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -18,12 +23,15 @@ public class LinkArticleService { private final StudyRoomRepository studyRoomRepository; private final LinkArticleRepository linkArticleRepository; + private final LinkDao linkDao; public LinkArticleService( - final StudyRoomRepository studyRoomRepository, final LinkArticleRepository linkArticleRepository + final StudyRoomRepository studyRoomRepository, final LinkArticleRepository linkArticleRepository, + final LinkDao linkDao ) { this.studyRoomRepository = studyRoomRepository; this.linkArticleRepository = linkArticleRepository; + this.linkDao = linkDao; } public LinkArticle createLink( @@ -58,4 +66,9 @@ public void deleteLink(final Long memberId, final Long studyId, final Long artic linkArticle.delete(accessor); } + + public LinksResponse getLinks(final Long studyId, final Pageable pageable) { + final Slice linkData = linkDao.findAllByStudyId(studyId, pageable); + return new LinksResponse(linkData.getContent(), linkData.hasNext()); + } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/SearchingLinkArticleService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/SearchingLinkArticleService.java deleted file mode 100644 index 10e74754b..000000000 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/SearchingLinkArticleService.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.woowacourse.moamoa.studyroom.service; - -import com.woowacourse.moamoa.member.domain.Member; -import com.woowacourse.moamoa.member.domain.repository.MemberRepository; -import com.woowacourse.moamoa.member.service.exception.MemberNotFoundException; -import com.woowacourse.moamoa.studyroom.query.LinkDao; -import com.woowacourse.moamoa.studyroom.query.data.LinkData; -import com.woowacourse.moamoa.studyroom.service.exception.NotParticipatedMemberException; -import com.woowacourse.moamoa.studyroom.service.response.LinksResponse; -import com.woowacourse.moamoa.study.domain.Study; -import com.woowacourse.moamoa.study.domain.repository.StudyRepository; -import com.woowacourse.moamoa.study.service.exception.StudyNotFoundException; -import lombok.RequiredArgsConstructor; -import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Slice; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -@Service -@Transactional(readOnly = true) -@RequiredArgsConstructor -public class SearchingLinkArticleService { - - private final LinkDao linkDao; - private final MemberRepository memberRepository; - private final StudyRepository studyRepository; - - public LinksResponse getLinks(final Long memberId, final Long studyId, final Pageable pageable) { - final Member member = memberRepository.findById(memberId) - .orElseThrow(MemberNotFoundException::new); - final Study study = studyRepository.findById(studyId) - .orElseThrow(StudyNotFoundException::new); - - if (!study.isParticipant(member.getId())) { - throw new NotParticipatedMemberException(); - } - - final Slice linkData = linkDao.findAllByStudyId(studyId, pageable); - return new LinksResponse(linkData.getContent(), linkData.hasNext()); - } -} diff --git a/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/ReferenceRoomAcceptanceTest.java b/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/LinkArticleAcceptanceTest.java similarity index 97% rename from backend/src/test/java/com/woowacourse/acceptance/test/studyroom/ReferenceRoomAcceptanceTest.java rename to backend/src/test/java/com/woowacourse/acceptance/test/studyroom/LinkArticleAcceptanceTest.java index d9f742c59..c4c5b3f28 100644 --- a/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/ReferenceRoomAcceptanceTest.java +++ b/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/LinkArticleAcceptanceTest.java @@ -44,7 +44,7 @@ import org.springframework.restdocs.payload.JsonFieldType; @DisplayName("링크 모음 인수 테스트") -class ReferenceRoomAcceptanceTest extends AcceptanceTest { +class LinkArticleAcceptanceTest extends AcceptanceTest { @DisplayName("참여한 스터디의 링크 공유실에 정상적으로 글을 작성한다.") @Test @@ -97,12 +97,8 @@ void getAllLink() { final Long 짱구_링크공유_ID2 = 짱구가().로그인하고().스터디에(자바_스터디_ID).링크를_공유한다(request1); final Long 짱구_링크공유_ID3 = 짱구가().로그인하고().스터디에(자바_스터디_ID).링크를_공유한다(request1); - final String token = 짱구가().로그인한다(); final LinksResponse linksResponse = RestAssured.given(spec).log().all() .filter(document("reference-room/list", - requestHeaders( - headerWithName("Authorization").description("Bearer Token") - ), responseFields( fieldWithPath("links[].id").type(JsonFieldType.NUMBER).description("링크공유 ID"), fieldWithPath("links[].author.id").type(JsonFieldType.NUMBER).description("링크공유 작성자 ID"), @@ -115,7 +111,6 @@ void getAllLink() { fieldWithPath("links[].lastModifiedDate").type(JsonFieldType.STRING).description("링크공유 수정일자"), fieldWithPath("hasNext").type(JsonFieldType.BOOLEAN).description("데이터가 더 존재하는지 여부") ))) - .header(HttpHeaders.AUTHORIZATION, token) .pathParam("study-id", 자바_스터디_ID) .param("page", 0) .param("size", 5) diff --git a/backend/src/test/java/com/woowacourse/moamoa/WebMVCTest.java b/backend/src/test/java/com/woowacourse/moamoa/WebMVCTest.java index eb40b0de8..18af3ad35 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/WebMVCTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/WebMVCTest.java @@ -11,9 +11,6 @@ import com.woowacourse.moamoa.common.MockedServiceObjectsBeanRegister; import com.woowacourse.moamoa.member.domain.Member; import com.woowacourse.moamoa.member.domain.repository.MemberRepository; -import com.woowacourse.moamoa.studyroom.service.LinkArticleService; -import com.woowacourse.moamoa.studyroom.service.SearchingLinkArticleService; - import java.util.Optional; import javax.servlet.http.HttpServletRequest; import org.junit.jupiter.api.BeforeEach; @@ -49,12 +46,6 @@ public abstract class WebMVCTest { @MockBean private MemberRepository memberRepository; - @MockBean - protected LinkArticleService linkArticleService; - - @MockBean - protected SearchingLinkArticleService searchingLinkArticleService; - @MockBean protected HttpServletRequest httpServletRequest; diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java index 3d48cf82b..f9507b951 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java @@ -16,6 +16,7 @@ import com.woowacourse.moamoa.study.service.request.StudyRequest; import com.woowacourse.moamoa.studyroom.domain.repository.article.LinkArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; +import com.woowacourse.moamoa.studyroom.query.LinkDao; import com.woowacourse.moamoa.studyroom.service.LinkArticleService; import com.woowacourse.moamoa.studyroom.service.exception.ArticleNotFoundException; import com.woowacourse.moamoa.studyroom.service.exception.UneditableArticleException; @@ -42,6 +43,9 @@ class LinkArticleControllerTest { @Autowired private LinkArticleRepository linkArticleRepository; + @Autowired + private LinkDao linkDao; + @Autowired private EntityManager entityManager; @@ -56,7 +60,7 @@ class LinkArticleControllerTest { @BeforeEach void setUp() { sut = new LinkArticleController( - new LinkArticleService(studyRoomRepository, linkArticleRepository) + new LinkArticleService(studyRoomRepository, linkArticleRepository, linkDao) ); // 사용자 추가 @@ -76,7 +80,7 @@ void setUp() { // 링크 공유 생성 final LinkArticleService linkArticleService = - new LinkArticleService(studyRoomRepository, linkArticleRepository); + new LinkArticleService(studyRoomRepository, linkArticleRepository, linkDao); final LinkArticleRequest linkArticleRequest = new LinkArticleRequest("https://github.com/sc0116", "링크 설명입니다."); diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/SearchingLinkArticleControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/SearchingLinkArticleControllerTest.java deleted file mode 100644 index a6db3dc36..000000000 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/SearchingLinkArticleControllerTest.java +++ /dev/null @@ -1,162 +0,0 @@ -package com.woowacourse.moamoa.studyroom.controller; - -import static com.woowacourse.moamoa.fixtures.MemberFixtures.그린론; -import static com.woowacourse.moamoa.fixtures.MemberFixtures.그린론_응답; -import static com.woowacourse.moamoa.fixtures.MemberFixtures.디우; -import static com.woowacourse.moamoa.fixtures.MemberFixtures.디우_응답; -import static com.woowacourse.moamoa.fixtures.MemberFixtures.베루스; -import static com.woowacourse.moamoa.fixtures.MemberFixtures.베루스_응답; -import static com.woowacourse.moamoa.fixtures.MemberFixtures.병민; -import static com.woowacourse.moamoa.fixtures.MemberFixtures.짱구; -import static com.woowacourse.moamoa.fixtures.MemberFixtures.짱구_깃허브_아이디; -import static com.woowacourse.moamoa.fixtures.MemberFixtures.짱구_응답; -import static com.woowacourse.moamoa.fixtures.StudyFixtures.자바_스터디_신청서; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.assertAll; - -import com.woowacourse.moamoa.common.RepositoryTest; -import com.woowacourse.moamoa.common.utils.DateTimeSystem; -import com.woowacourse.moamoa.member.domain.Member; -import com.woowacourse.moamoa.member.domain.repository.MemberRepository; -import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; -import com.woowacourse.moamoa.studyroom.domain.repository.article.LinkArticleRepository; -import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; -import com.woowacourse.moamoa.studyroom.query.LinkDao; -import com.woowacourse.moamoa.studyroom.query.data.LinkData; -import com.woowacourse.moamoa.studyroom.service.LinkArticleService; -import com.woowacourse.moamoa.studyroom.service.SearchingLinkArticleService; -import com.woowacourse.moamoa.studyroom.service.exception.NotParticipatedMemberException; -import com.woowacourse.moamoa.studyroom.service.request.LinkArticleRequest; -import com.woowacourse.moamoa.studyroom.service.response.LinkResponse; -import com.woowacourse.moamoa.studyroom.service.response.LinksResponse; -import com.woowacourse.moamoa.study.domain.Study; -import com.woowacourse.moamoa.study.domain.repository.StudyRepository; -import com.woowacourse.moamoa.study.service.StudyParticipantService; -import com.woowacourse.moamoa.study.service.StudyService; -import com.woowacourse.moamoa.study.service.request.StudyRequest; -import java.time.LocalDate; -import java.util.List; -import javax.persistence.EntityManager; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.PageRequest; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; - -@RepositoryTest -class SearchingLinkArticleControllerTest { - - @Autowired - private LinkDao linkDao; - - @Autowired - private MemberRepository memberRepository; - - @Autowired - private StudyRepository studyRepository; - - @Autowired - private StudyRoomRepository studyRoomRepository; - - @Autowired - private LinkArticleRepository linkArticleRepository; - - @Autowired - private EntityManager entityManager; - - private SearchingLinkArticleController sut; - - private Study javaStudy; - - private List linkResponses; - private Member jjanggu; - private Member greenlawn; - private Member dwoo; - private Member verus; - private Member byeongmin; - - @BeforeEach - void setUp() { - sut = new SearchingLinkArticleController( - new SearchingLinkArticleService(linkDao, memberRepository, studyRepository)); - - // 사용자 추가 - jjanggu = memberRepository.save(짱구()); - greenlawn = memberRepository.save(그린론()); - dwoo = memberRepository.save(디우()); - verus = memberRepository.save(베루스()); - byeongmin = memberRepository.save(병민()); - - // 스터디 생성 - StudyService studyService = new StudyService(studyRepository, memberRepository, new DateTimeSystem()); - - final LocalDate startDate = LocalDate.now(); - StudyRequest javaStudyRequest = 자바_스터디_신청서(startDate); - - javaStudy = studyService.createStudy(짱구_깃허브_아이디, javaStudyRequest); - - StudyParticipantService participantService = new StudyParticipantService(memberRepository, studyRepository); - participantService.participateStudy(greenlawn.getId(), javaStudy.getId()); - participantService.participateStudy(dwoo.getId(), javaStudy.getId()); - participantService.participateStudy(verus.getId(), javaStudy.getId()); - - // 링크 공유 추가 - final LinkArticleService linkService = new LinkArticleService(studyRoomRepository, - linkArticleRepository); - - final LinkArticleRequest request1 = new LinkArticleRequest("https://github.com/sc0116", "짱구 링크."); - final LinkArticleRequest request2 = new LinkArticleRequest("https://github.com/jaejae-yoo", "그린론 링크."); - final LinkArticleRequest request3 = new LinkArticleRequest("https://github.com/tco0427", "디우 링크."); - final LinkArticleRequest request4 = new LinkArticleRequest("https://github.com/wilgur513", "베루스 링크."); - - final LinkArticle linkArticle1 = linkService.createLink(jjanggu.getId(), javaStudy.getId(), request1); - final LinkArticle linkArticle2 = linkService.createLink(greenlawn.getId(), javaStudy.getId(), request2); - final LinkArticle linkArticle3 = linkService.createLink(dwoo.getId(), javaStudy.getId(), request3); - final LinkArticle linkArticle4 = linkService.createLink(verus.getId(), javaStudy.getId(), request4); - - entityManager.flush(); - entityManager.clear(); - - final LinkResponse 링크1 = new LinkResponse( - new LinkData(linkArticle1.getId(), 짱구_응답, linkArticle1.getLinkUrl(), linkArticle1.getDescription(), - linkArticle1.getCreatedDate().toLocalDate(), linkArticle1.getLastModifiedDate().toLocalDate())); - final LinkResponse 링크2 = new LinkResponse( - new LinkData(linkArticle2.getId(), 그린론_응답, linkArticle2.getLinkUrl(), linkArticle2.getDescription(), - linkArticle2.getCreatedDate().toLocalDate(), linkArticle2.getLastModifiedDate().toLocalDate())); - final LinkResponse 링크3 = new LinkResponse( - new LinkData(linkArticle3.getId(), 디우_응답, linkArticle3.getLinkUrl(), linkArticle3.getDescription(), - linkArticle3.getCreatedDate().toLocalDate(), linkArticle3.getLastModifiedDate().toLocalDate())); - final LinkResponse 링크4 = new LinkResponse( - new LinkData(linkArticle4.getId(), 베루스_응답, linkArticle4.getLinkUrl(), linkArticle4.getDescription(), - linkArticle4.getCreatedDate().toLocalDate(), linkArticle4.getLastModifiedDate().toLocalDate())); - - linkResponses = List.of(링크1, 링크2, 링크3, 링크4); - } - - @DisplayName("링크 공유글 전체 목록 조회를 할 수 있다.") - @Test - void getLinks() { - final ResponseEntity links = sut.getLinks(jjanggu.getId(), javaStudy.getId(), PageRequest.of(0, 5)); - - assertAll( - () -> assertThat(links.getStatusCode()).isEqualTo(HttpStatus.OK), - () -> assertThat(links.getBody()).isNotNull(), - () -> assertThat(links.getBody().isHasNext()).isFalse(), - () -> assertThat(links.getBody().getLinks()) - .containsExactlyInAnyOrderElementsOf(linkResponses) - ); - } - - @DisplayName("스터디에 참여하지 않은 회원은 링크 공유글을 조회할 수 없다.") - @Test - void getLinksByNotParticipatedMember() { - final Long javaStudyId = javaStudy.getId(); - final PageRequest pageRequest = PageRequest.of(0, 5); - - assertThatThrownBy(() -> sut.getLinks(byeongmin.getId(), javaStudyId, pageRequest)) - .isInstanceOf(NotParticipatedMemberException.class); - } -} From 970fcb8c25faf113051941eedff81ab1eeac8299 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=A7=84=ED=98=81?= Date: Wed, 14 Sep 2022 18:25:32 +0900 Subject: [PATCH 08/40] =?UTF-8?q?test:=20LinkArticleControllerTest=20setUp?= =?UTF-8?q?=20=EB=A1=9C=EC=A7=81=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/LinkArticleControllerTest.java | 96 ++++++++++--------- 1 file changed, 53 insertions(+), 43 deletions(-) diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java index f9507b951..1a870a7f6 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java @@ -1,19 +1,18 @@ package com.woowacourse.moamoa.studyroom.controller; import static com.woowacourse.moamoa.fixtures.MemberFixtures.디우; -import static com.woowacourse.moamoa.fixtures.MemberFixtures.베루스; import static com.woowacourse.moamoa.fixtures.MemberFixtures.짱구; -import static com.woowacourse.moamoa.fixtures.MemberFixtures.짱구_깃허브_아이디; import static com.woowacourse.moamoa.fixtures.StudyFixtures.자바_스터디_신청서; import static org.assertj.core.api.Assertions.assertThatThrownBy; import com.woowacourse.moamoa.common.RepositoryTest; import com.woowacourse.moamoa.common.utils.DateTimeSystem; +import com.woowacourse.moamoa.member.domain.Member; import com.woowacourse.moamoa.member.domain.repository.MemberRepository; +import com.woowacourse.moamoa.study.domain.Study; import com.woowacourse.moamoa.study.domain.repository.StudyRepository; -import com.woowacourse.moamoa.study.service.StudyParticipantService; import com.woowacourse.moamoa.study.service.StudyService; -import com.woowacourse.moamoa.study.service.request.StudyRequest; +import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; import com.woowacourse.moamoa.studyroom.domain.repository.article.LinkArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.LinkDao; @@ -51,84 +50,95 @@ class LinkArticleControllerTest { private LinkArticleController sut; - private Long jjangguId; - private Long verusId; - private Long dwooId; - private Long javaStudyId; - private Long linkId; + private StudyService studyService; + private LinkArticleService linkArticleService; @BeforeEach void setUp() { - sut = new LinkArticleController( - new LinkArticleService(studyRoomRepository, linkArticleRepository, linkDao) - ); + linkArticleService = new LinkArticleService(studyRoomRepository, linkArticleRepository, linkDao); + studyService = new StudyService(studyRepository, memberRepository, new DateTimeSystem()); - // 사용자 추가 - jjangguId = memberRepository.save(짱구()).getId(); - verusId = memberRepository.save(베루스()).getId(); - dwooId = memberRepository.save(디우()).getId(); - - // 스터디 생성 - final StudyService studyService = new StudyService(studyRepository, memberRepository, new DateTimeSystem()); - final LocalDate startDate = LocalDate.now(); - final StudyRequest javaStudyRequest = 자바_스터디_신청서(startDate); - - javaStudyId = studyService.createStudy(짱구_깃허브_아이디, javaStudyRequest).getId(); - - StudyParticipantService participantService = new StudyParticipantService(memberRepository, studyRepository); - participantService.participateStudy(verusId, javaStudyId); - - // 링크 공유 생성 - final LinkArticleService linkArticleService = - new LinkArticleService(studyRoomRepository, linkArticleRepository, linkDao); - final LinkArticleRequest linkArticleRequest = - new LinkArticleRequest("https://github.com/sc0116", "링크 설명입니다."); - - linkId = linkArticleService.createLink(jjangguId, javaStudyId, linkArticleRequest).getId(); - - entityManager.flush(); - entityManager.clear(); + sut = new LinkArticleController(linkArticleService); } @DisplayName("스터디에 참여하지 않은 회원은 링크 공유를 할 수 없다.") @Test void createByNotParticipatedMember() { + final Member 짱구 = memberRepository.save(짱구()); + final Member 디우 = memberRepository.save(디우()); + final Study 자바_스터디 = studyService.createStudy(짱구.getGithubId(), 자바_스터디_신청서(LocalDate.now())); + + entityManager.flush(); + entityManager.clear(); + final LinkArticleRequest linkArticleRequest = new LinkArticleRequest("https://github.com/sc0116", "링크 설명입니다."); - assertThatThrownBy(() -> sut.createLink(dwooId, javaStudyId, linkArticleRequest)) + assertThatThrownBy(() -> sut.createLink(디우.getId(), 자바_스터디.getId(), linkArticleRequest)) .isInstanceOf(UneditableArticleException.class); } @DisplayName("존재하지 않는 링크 공유글을 수정할 수 없다.") @Test void updateByInvalidLinkId() { + final Member 짱구 = memberRepository.save(짱구()); + final Study 자바_스터디 = studyService.createStudy(짱구.getGithubId(), 자바_스터디_신청서(LocalDate.now())); + + entityManager.flush(); + entityManager.clear(); + final LinkArticleRequest editingLinkRequest = new LinkArticleRequest("www.naver.com", "수정"); - assertThatThrownBy(() -> sut.updateLink(jjangguId, javaStudyId, -1L, editingLinkRequest)) + assertThatThrownBy(() -> sut.updateLink(짱구.getId(), 자바_스터디.getId(), -1L, editingLinkRequest)) .isInstanceOf(ArticleNotFoundException.class); } @DisplayName("스터디에 참여하지 않은 경우 링크 공유글을 수정할 수 없다.") @Test void updateByNotParticipatedMember() { - final LinkArticleRequest linkArticleRequest = new LinkArticleRequest("https://github.com", "수정된 링크 설명입니다."); + final Member 짱구 = memberRepository.save(짱구()); + final Member 디우 = memberRepository.save(디우()); + + final Study 자바_스터디 = studyService.createStudy(짱구.getGithubId(), 자바_스터디_신청서(LocalDate.now())); + + final LinkArticleRequest linkArticleRequest = new LinkArticleRequest("https://github.com/sc0116", "링크 설명입니다."); + final LinkArticle 링크_게시글 = linkArticleService.createLink(짱구.getId(), 자바_스터디.getId(), linkArticleRequest); + + entityManager.flush(); + entityManager.clear(); - assertThatThrownBy(() -> sut.updateLink(dwooId, javaStudyId, linkId, linkArticleRequest)) + assertThatThrownBy(() -> sut.updateLink(디우.getId(), 자바_스터디.getId(), 링크_게시글.getId(), linkArticleRequest)) .isInstanceOf(UneditableArticleException.class); } @DisplayName("존재하지 않는 링크 공유글을 삭제할 수 없다.") @Test void deleteByInvalidLinkId() { - assertThatThrownBy(() -> sut.deleteLink(jjangguId, javaStudyId, -1L)) + final Member 짱구 = memberRepository.save(짱구()); + final Study 자바_스터디 = studyService.createStudy(짱구.getGithubId(), 자바_스터디_신청서(LocalDate.now())); + + entityManager.flush(); + entityManager.clear(); + + assertThatThrownBy(() -> sut.deleteLink(짱구.getId(), 자바_스터디.getId(), -1L)) .isInstanceOf(ArticleNotFoundException.class); } @DisplayName("스터디에 참여하지 않은 경우 링크 공유글을 삭제할 수 없다.") @Test void deleteByNotParticipatedMember() { - assertThatThrownBy(() -> sut.deleteLink(dwooId, javaStudyId, linkId)) + final Member 짱구 = memberRepository.save(짱구()); + final Member 디우 = memberRepository.save(디우()); + + final Study 자바_스터디 = studyService.createStudy(짱구.getGithubId(), 자바_스터디_신청서(LocalDate.now())); + + final LinkArticleRequest linkArticleRequest = new LinkArticleRequest("https://github.com/sc0116", "링크 설명입니다."); + final LinkArticle 링크_게시글 = linkArticleService.createLink(짱구.getId(), 자바_스터디.getId(), linkArticleRequest); + + entityManager.flush(); + entityManager.clear(); + + assertThatThrownBy(() -> sut.deleteLink(디우.getId(), 자바_스터디.getId(), 링크_게시글.getId())) .isInstanceOf(UneditableArticleException.class); } } From 2d360cc608fe42e87de96d748ad96af41c064073 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=A7=84=ED=98=81?= Date: Wed, 14 Sep 2022 18:36:51 +0900 Subject: [PATCH 09/40] =?UTF-8?q?refactor:=20=EB=A7=81=ED=81=AC=20?= =?UTF-8?q?=EA=B2=8C=EC=8B=9C=EA=B8=80=20=EB=AA=A9=EB=A1=9D=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EC=8B=9C=20Authentication=20URI=EC=97=90=EC=84=9C?= =?UTF-8?q?=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../woowacourse/moamoa/auth/config/AuthRequestMatchConfig.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/backend/src/main/java/com/woowacourse/moamoa/auth/config/AuthRequestMatchConfig.java b/backend/src/main/java/com/woowacourse/moamoa/auth/config/AuthRequestMatchConfig.java index 7cd7c9f54..0e2995201 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/auth/config/AuthRequestMatchConfig.java +++ b/backend/src/main/java/com/woowacourse/moamoa/auth/config/AuthRequestMatchConfig.java @@ -27,8 +27,7 @@ public AuthenticationRequestMatcher authenticationRequestMatcher() { "/api/members/me", "/api/members/me/role", "/api/studies/\\w+/community/articles/\\w+", - "/api/studies/\\w+/community/articles", - "/api/studies/\\d+/reference-room/links" + "/api/studies/\\w+/community/articles" ) .addUpAuthenticationPath(HttpMethod.PUT, "/api/studies/\\d+/reviews/\\d+", From 4d154ca7f8fec61744d14efb416521dcb953f8d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=A7=84=ED=98=81?= Date: Wed, 14 Sep 2022 19:16:44 +0900 Subject: [PATCH 10/40] =?UTF-8?q?refactor:=20Community=EC=99=80=20Notice?= =?UTF-8?q?=20=EC=BB=A8=ED=8A=B8=EB=A1=A4=EB=9F=AC,=20=EC=84=9C=EB=B9=84?= =?UTF-8?q?=EC=8A=A4=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CommunityArticleController.java | 76 +++++++++++++++ ...ller.java => NoticeArticleController.java} | 25 ++--- .../moamoa/studyroom/domain/StudyRoom.java | 8 ++ .../article/CommunityArticleRepository.java | 8 +- .../JpaCommunityArticleRepository.java | 13 +++ .../article/NoticeArticleRepository.java | 2 +- .../studyroom/query/CommunityArticleDao.java | 81 ++++++++++++++++ .../{LinkDao.java => LinkArticleDao.java} | 26 ++--- .../{LinkData.java => LinkArticleData.java} | 2 +- .../service/CommunityArticleService.java | 97 +++++++++++++++++++ .../studyroom/service/LinkArticleService.java | 12 +-- .../service/response/LinkResponse.java | 10 +- .../service/response/LinksResponse.java | 10 +- ... DeletingNoticeArticleControllerTest.java} | 22 ++--- ...mmunityArticleSummariesControllerTest.java | 21 ++-- ...> GettingNoticeArticleControllerTest.java} | 16 +-- .../controller/LinkArticleControllerTest.java | 6 +- ....java => NoticeArticleControllerTest.java} | 26 +++-- ... UpdatingNoticeArticleControllerTest.java} | 30 +++--- .../studyroom/domain/StudyRoomTest.java | 4 +- .../domain/{ => article}/ArticleTest.java | 4 +- .../domain/{ => article}/LinkArticleTest.java | 4 +- ...ingNoticeArticleControllerWebMvcTest.java} | 19 +--- ...ingNoticeArticleControllerWebMvcTest.java} | 2 +- ...ingNoticeArticleControllerWebMvcTest.java} | 22 +---- ...ingNoticeArticleControllerWebMvcTest.java} | 2 +- 26 files changed, 389 insertions(+), 159 deletions(-) create mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/CommunityArticleController.java rename backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/{ArticleController.java => NoticeArticleController.java} (79%) create mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/JpaCommunityArticleRepository.java create mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/query/CommunityArticleDao.java rename backend/src/main/java/com/woowacourse/moamoa/studyroom/query/{LinkDao.java => LinkArticleDao.java} (68%) rename backend/src/main/java/com/woowacourse/moamoa/studyroom/query/data/{LinkData.java => LinkArticleData.java} (94%) create mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleService.java rename backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/{DeletingArticleControllerTest.java => DeletingNoticeArticleControllerTest.java} (93%) rename backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/{GettingArticleControllerTest.java => GettingNoticeArticleControllerTest.java} (94%) rename backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/{ArticleControllerTest.java => NoticeArticleControllerTest.java} (88%) rename backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/{UpdatingArticleControllerTest.java => UpdatingNoticeArticleControllerTest.java} (87%) rename backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/{ => article}/ArticleTest.java (95%) rename backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/{ => article}/LinkArticleTest.java (95%) rename backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/{CreatingArticleControllerWebMvcTest.java => CreatingNoticeArticleControllerWebMvcTest.java} (86%) rename backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/{DeletingArticleControllerWebMvcTest.java => DeletingNoticeArticleControllerWebMvcTest.java} (96%) rename backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/{GettingArticleControllerWebMvcTest.java => GettingNoticeArticleControllerWebMvcTest.java} (81%) rename backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/{UpdatingArticleControllerWebMvcTest.java => UpdatingNoticeArticleControllerWebMvcTest.java} (98%) diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/CommunityArticleController.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/CommunityArticleController.java new file mode 100644 index 000000000..e2aedc34a --- /dev/null +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/CommunityArticleController.java @@ -0,0 +1,76 @@ +package com.woowacourse.moamoa.studyroom.controller; + +import com.woowacourse.moamoa.auth.config.AuthenticatedMember; +import com.woowacourse.moamoa.studyroom.domain.article.Article; +import com.woowacourse.moamoa.studyroom.service.CommunityArticleService; +import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; +import com.woowacourse.moamoa.studyroom.service.response.ArticleResponse; +import com.woowacourse.moamoa.studyroom.service.response.ArticleSummariesResponse; +import java.net.URI; +import javax.validation.Valid; +import org.springframework.data.domain.Pageable; +import org.springframework.data.web.PageableDefault; +import org.springframework.http.HttpHeaders; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("api/studies/{study-id}/community/articles") +public class CommunityArticleController { + + private final CommunityArticleService communityArticleService; + + public CommunityArticleController(final CommunityArticleService communityArticleService) { + this.communityArticleService = communityArticleService; + } + + @PostMapping + public ResponseEntity createArticle(@AuthenticatedMember final Long id, + @PathVariable("study-id") final Long studyId, + @Valid @RequestBody final ArticleRequest request + ) { + final Article article = communityArticleService.createArticle(id, studyId, request); + final URI location = URI.create("/api/studies/" + studyId + "/community/articles/" + article.getId()); + return ResponseEntity.created(location).header("Access-Control-Allow-Headers", HttpHeaders.LOCATION).build(); + } + + @GetMapping("/{article-id}") + public ResponseEntity getArticle(@PathVariable("article-id") final Long articleId) { + ArticleResponse response = communityArticleService.getArticle(articleId); + return ResponseEntity.ok().body(response); + } + + @DeleteMapping("{article-id}") + public ResponseEntity deleteArticle(@AuthenticatedMember final Long id, + @PathVariable("study-id") final Long studyId, + @PathVariable("article-id") final Long articleId + ) { + communityArticleService.deleteArticle(id, studyId, articleId); + return ResponseEntity.noContent().build(); + } + + @GetMapping + public ResponseEntity getArticles( + @PathVariable("study-id") final Long studyId, @PageableDefault final Pageable pageable + ) { + ArticleSummariesResponse response = communityArticleService.getArticles(studyId, pageable); + return ResponseEntity.ok().body(response); + } + + @PutMapping("/{article-id}") + public ResponseEntity updateArticle(@AuthenticatedMember final Long id, + @PathVariable("study-id") final Long studyId, + @PathVariable("article-id") final Long articleId, + @Valid @RequestBody final ArticleRequest request + ) { + communityArticleService.updateArticle(id, studyId, articleId, request); + return ResponseEntity.noContent().build(); + } +} diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/ArticleController.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/NoticeArticleController.java similarity index 79% rename from backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/ArticleController.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/NoticeArticleController.java index 97b66d20a..00d965252 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/ArticleController.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/NoticeArticleController.java @@ -23,53 +23,49 @@ import org.springframework.web.bind.annotation.RestController; @RestController -@RequestMapping("api/studies/{study-id}/{article-type}/articles") -public class ArticleController { +@RequestMapping("api/studies/{study-id}/notice/articles") +public class NoticeArticleController { private final ArticleService articleService; - public ArticleController(final ArticleService articleService) { + public NoticeArticleController(final ArticleService articleService) { this.articleService = articleService; } @PostMapping public ResponseEntity createArticle(@AuthenticatedMember final Long id, @PathVariable("study-id") final Long studyId, - @PathVariable("article-type") final ArticleType type, @Valid @RequestBody final ArticleRequest request ) { - final Article article = articleService.createArticle(id, studyId, request, type); - final URI location = URI.create("/api/studies/" + studyId + "/" + type.lowerName() + "/articles/" + article.getId()); + final Article article = articleService.createArticle(id, studyId, request, ArticleType.NOTICE); + final URI location = URI.create("/api/studies/" + studyId + "/notice/articles/" + article.getId()); return ResponseEntity.created(location).header("Access-Control-Allow-Headers", HttpHeaders.LOCATION).build(); } @GetMapping("/{article-id}") public ResponseEntity getArticle(@AuthenticatedMember final Long id, @PathVariable("study-id") final Long studyId, - @PathVariable("article-type") final ArticleType articleType, @PathVariable("article-id") final Long articleId ) { - ArticleResponse response = articleService.getArticle(id, studyId, articleId, articleType); + ArticleResponse response = articleService.getArticle(id, studyId, articleId, ArticleType.NOTICE); return ResponseEntity.ok().body(response); } @DeleteMapping("{article-id}") public ResponseEntity deleteArticle(@AuthenticatedMember final Long id, @PathVariable("study-id") final Long studyId, - @PathVariable("article-id") final Long articleId, - @PathVariable("article-type") final ArticleType type + @PathVariable("article-id") final Long articleId ) { - articleService.deleteArticle(id, studyId, articleId, type); + articleService.deleteArticle(id, studyId, articleId, ArticleType.NOTICE); return ResponseEntity.noContent().build(); } @GetMapping public ResponseEntity getArticles(@AuthenticatedMember final Long id, @PathVariable("study-id") final Long studyId, - @PathVariable("article-type") final ArticleType type, @PageableDefault final Pageable pageable ) { - ArticleSummariesResponse response = articleService.getArticles(id, studyId, pageable, type); + ArticleSummariesResponse response = articleService.getArticles(id, studyId, pageable, ArticleType.NOTICE); return ResponseEntity.ok().body(response); } @@ -77,10 +73,9 @@ public ResponseEntity getArticles(@AuthenticatedMember public ResponseEntity updateArticle(@AuthenticatedMember final Long id, @PathVariable("study-id") final Long studyId, @PathVariable("article-id") final Long articleId, - @PathVariable("article-type") final ArticleType type, @Valid @RequestBody final ArticleRequest request ) { - articleService.updateArticle(id, studyId, articleId, request, type); + articleService.updateArticle(id, studyId, articleId, request, ArticleType.NOTICE); return ResponseEntity.noContent().build(); } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/StudyRoom.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/StudyRoom.java index d7d6a6e67..dd99d87f2 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/StudyRoom.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/StudyRoom.java @@ -41,6 +41,14 @@ public boolean isPermittedAccessor(final Accessor accessor) { return studyId.equals(accessor.getStudyId()) && permittedParticipants.isPermittedAccessor(accessor); } + public CommunityArticle writeCommunityArticle(final Accessor accessor, final String title, final String content) { + if (!isPermittedAccessor(accessor)) { + throw new UneditableArticleException(studyId, accessor, ArticleType.COMMUNITY); + } + + return new CommunityArticle(title, content, accessor.getMemberId(),this); + } + public Article write(final Accessor accessor, final String title, final String content, final ArticleType type) { if (type == ArticleType.COMMUNITY && isPermittedAccessor(accessor)) { return new CommunityArticle(title, content, accessor.getMemberId(), this); diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/CommunityArticleRepository.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/CommunityArticleRepository.java index e738944eb..c2ccad9e1 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/CommunityArticleRepository.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/CommunityArticleRepository.java @@ -1,13 +1,7 @@ package com.woowacourse.moamoa.studyroom.domain.repository.article; -import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; import com.woowacourse.moamoa.studyroom.domain.article.CommunityArticle; import org.springframework.data.jpa.repository.JpaRepository; -interface CommunityArticleRepository extends JpaRepository, ArticleRepository { - - @Override - default boolean isSupportType(ArticleType articleType) { - return articleType.equals(ArticleType.COMMUNITY); - } +public interface CommunityArticleRepository extends JpaRepository { } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/JpaCommunityArticleRepository.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/JpaCommunityArticleRepository.java new file mode 100644 index 000000000..65ed1ee5d --- /dev/null +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/JpaCommunityArticleRepository.java @@ -0,0 +1,13 @@ +package com.woowacourse.moamoa.studyroom.domain.repository.article; + +import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; +import com.woowacourse.moamoa.studyroom.domain.article.CommunityArticle; +import org.springframework.data.jpa.repository.JpaRepository; + +interface JpaCommunityArticleRepository extends JpaRepository, ArticleRepository { + + @Override + default boolean isSupportType(ArticleType articleType) { + return articleType.equals(ArticleType.COMMUNITY); + } +} diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/NoticeArticleRepository.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/NoticeArticleRepository.java index 4cd25fed5..89dfcae58 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/NoticeArticleRepository.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/NoticeArticleRepository.java @@ -4,7 +4,7 @@ import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; import org.springframework.data.jpa.repository.JpaRepository; -interface NoticeArticleRepository extends JpaRepository, ArticleRepository { +public interface NoticeArticleRepository extends JpaRepository, ArticleRepository { @Override default boolean isSupportType(ArticleType articleType) { diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/query/CommunityArticleDao.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/query/CommunityArticleDao.java new file mode 100644 index 000000000..c26f89540 --- /dev/null +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/query/CommunityArticleDao.java @@ -0,0 +1,81 @@ +package com.woowacourse.moamoa.studyroom.query; + +import com.woowacourse.moamoa.member.query.data.MemberData; +import com.woowacourse.moamoa.studyroom.query.data.ArticleData; +import java.time.LocalDate; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.stereotype.Repository; + +@Repository +public class CommunityArticleDao { + + public static final RowMapper ROW_MAPPER = (rs, rn) -> { + final long id = rs.getLong("article_id"); + final String title = rs.getString("article_title"); + final String content = rs.getString("article_content"); + final LocalDate createdDate = rs.getObject("article_created_date", LocalDate.class); + final LocalDate lastModifiedDate = rs.getObject("article_last_modified_date", LocalDate.class); + + final long githubId = rs.getLong("member.github_id"); + final String username = rs.getString("member.username"); + final String imageUrl = rs.getString("member.image_url"); + final String profileUrl = rs.getString("member.profile_url"); + MemberData memberData = new MemberData(githubId, username, imageUrl, profileUrl); + + return new ArticleData(id, memberData, title, content, createdDate, lastModifiedDate); + }; + private final NamedParameterJdbcTemplate namedParameterJdbcTemplate; + + + public CommunityArticleDao(final NamedParameterJdbcTemplate namedParameterJdbcTemplate) { + this.namedParameterJdbcTemplate = namedParameterJdbcTemplate; + } + + public Optional getById(final Long articleId) { + final String sql = "SELECT community.id as article_id, community.title as article_title, community.content as article_content, " + + "community.created_date as article_created_date, community.last_modified_date as article_last_modified_date, " + + "member.github_id, member.username, member.image_url, member.profile_url " + + "FROM community JOIN member ON community.author_id = member.id " + + "WHERE community.id = :communityId"; + + final Map params = Map.of("communityId", articleId); + return namedParameterJdbcTemplate.query(sql, params, ROW_MAPPER).stream().findAny(); + } + + public Page getAllByStudyId(final Long studyId, final Pageable pageable) { + final List content = getContent(studyId, pageable); + final int totalCount = getTotalCount(studyId); + return new PageImpl<>(content, pageable, totalCount); + } + + private List getContent(final Long studyId, final Pageable pageable) { + final String sql = "SELECT community.id as article_id, community.title as article_title, community.content as article_content, " + + "community.created_date as article_created_date, community.last_modified_date as article_last_modified_date, " + + "member.github_id, member.username, member.image_url, member.profile_url " + + "FROM community JOIN member ON community.author_id = member.id " + + "WHERE community.study_id = :studyId " + + "ORDER BY created_date DESC, community.id DESC " + + "LIMIT :size OFFSET :offset"; + + final Map params = Map.of( + "studyId", studyId, + "size", pageable.getPageSize(), + "offset", pageable.getOffset() + ); + + return namedParameterJdbcTemplate.query(sql, params, ROW_MAPPER); + } + + private Integer getTotalCount(final Long studyId) { + final String sql = "SELECT count(community.id) FROM community WHERE community.study_id = :studyId"; + final Map param = Map.of("studyId", studyId); + return namedParameterJdbcTemplate.queryForObject(sql, param, (rs, rn) -> rs.getInt(1)); + } +} diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/query/LinkDao.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/query/LinkArticleDao.java similarity index 68% rename from backend/src/main/java/com/woowacourse/moamoa/studyroom/query/LinkDao.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/query/LinkArticleDao.java index 84472beda..9eaf4d9e6 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/query/LinkDao.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/query/LinkArticleDao.java @@ -1,7 +1,7 @@ package com.woowacourse.moamoa.studyroom.query; import com.woowacourse.moamoa.member.query.data.MemberData; -import com.woowacourse.moamoa.studyroom.query.data.LinkData; +import com.woowacourse.moamoa.studyroom.query.data.LinkArticleData; import java.time.LocalDate; import java.util.List; import lombok.RequiredArgsConstructor; @@ -15,11 +15,11 @@ @Repository @RequiredArgsConstructor -public class LinkDao { +public class LinkArticleDao { private final NamedParameterJdbcTemplate namedParameterJdbcTemplate; - public Slice findAllByStudyId(final Long studyId, final Pageable pageable) { + public Slice findAllByStudyId(final Long studyId, final Pageable pageable) { final String sql = "SELECT link.id, link.link_url, link.description, link.created_date, link.last_modified_date, " + "member.github_id, member.username, member.image_url, member.profile_url " + "FROM link " @@ -32,22 +32,22 @@ public Slice findAllByStudyId(final Long studyId, final Pageable pagea .addValue("limit", pageable.getPageSize() + 1) .addValue("offset", pageable.getOffset()); - final List linkData = namedParameterJdbcTemplate.query(sql, params, rowMapper()); - return new SliceImpl<>(getCurrentPageLinks(linkData, pageable), pageable, hasNext(linkData, pageable)); + final List linkArticleData = namedParameterJdbcTemplate.query(sql, params, rowMapper()); + return new SliceImpl<>(getCurrentPageLinks(linkArticleData, pageable), pageable, hasNext(linkArticleData, pageable)); } - private List getCurrentPageLinks(final List linkData, final Pageable pageable) { - if (hasNext(linkData, pageable)) { - return linkData.subList(0, linkData.size() - 1); + private List getCurrentPageLinks(final List linkArticleData, final Pageable pageable) { + if (hasNext(linkArticleData, pageable)) { + return linkArticleData.subList(0, linkArticleData.size() - 1); } - return linkData; + return linkArticleData; } - private boolean hasNext(final List linkData, final Pageable pageable) { - return linkData.size() > pageable.getPageSize(); + private boolean hasNext(final List linkArticleData, final Pageable pageable) { + return linkArticleData.size() > pageable.getPageSize(); } - private RowMapper rowMapper() { + private RowMapper rowMapper() { return (rs, rn) -> { final Long id = rs.getLong("id"); final String linkUrl = rs.getString("link_url"); @@ -61,7 +61,7 @@ private RowMapper rowMapper() { final String profileUrl = rs.getString("profile_url"); final MemberData memberData = new MemberData(githubId, username, imageUrl, profileUrl); - return new LinkData(id, memberData, linkUrl, description, createdDate, lastModifiedDate); + return new LinkArticleData(id, memberData, linkUrl, description, createdDate, lastModifiedDate); }; } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/query/data/LinkData.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/query/data/LinkArticleData.java similarity index 94% rename from backend/src/main/java/com/woowacourse/moamoa/studyroom/query/data/LinkData.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/query/data/LinkArticleData.java index 4415d8bdf..7954e9f0a 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/query/data/LinkData.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/query/data/LinkArticleData.java @@ -12,7 +12,7 @@ @AllArgsConstructor @Getter @EqualsAndHashCode -public class LinkData { +public class LinkArticleData { private Long id; private MemberData memberData; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleService.java new file mode 100644 index 000000000..d97071fb7 --- /dev/null +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleService.java @@ -0,0 +1,97 @@ +package com.woowacourse.moamoa.studyroom.service; + +import com.woowacourse.moamoa.study.service.exception.StudyNotFoundException; +import com.woowacourse.moamoa.studyroom.domain.Accessor; +import com.woowacourse.moamoa.studyroom.domain.StudyRoom; +import com.woowacourse.moamoa.studyroom.domain.article.Article; +import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; +import com.woowacourse.moamoa.studyroom.domain.article.CommunityArticle; +import com.woowacourse.moamoa.studyroom.domain.repository.article.CommunityArticleRepository; +import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; +import com.woowacourse.moamoa.studyroom.query.CommunityArticleDao; +import com.woowacourse.moamoa.studyroom.query.data.ArticleData; +import com.woowacourse.moamoa.studyroom.service.exception.ArticleNotFoundException; +import com.woowacourse.moamoa.studyroom.service.exception.UneditableArticleException; +import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; +import com.woowacourse.moamoa.studyroom.service.response.ArticleResponse; +import com.woowacourse.moamoa.studyroom.service.response.ArticleSummariesResponse; +import com.woowacourse.moamoa.studyroom.service.response.ArticleSummaryResponse; +import java.util.List; +import java.util.stream.Collectors; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@Transactional(readOnly = true) +public class CommunityArticleService { + + private final StudyRoomRepository studyRoomRepository; + private final CommunityArticleRepository communityArticleRepository; + private final CommunityArticleDao communityArticleDao; + + public CommunityArticleService( + final StudyRoomRepository studyRoomRepository, + final CommunityArticleRepository communityArticleRepository, + final CommunityArticleDao communityArticleDao) { + this.studyRoomRepository = studyRoomRepository; + this.communityArticleRepository = communityArticleRepository; + this.communityArticleDao = communityArticleDao; + } + + @Transactional + public Article createArticle(final Long memberId, final Long studyId, final ArticleRequest request) { + final StudyRoom studyRoom = studyRoomRepository.findByStudyId(studyId) + .orElseThrow(StudyNotFoundException::new); + final Accessor accessor = new Accessor(memberId, studyId); + final CommunityArticle article = studyRoom.writeCommunityArticle(accessor, request.getTitle(), request.getContent()); + return communityArticleRepository.save(article); + } + + public ArticleResponse getArticle(final Long articleId) { + final ArticleData data = communityArticleDao.getById(articleId) + .orElseThrow(() -> new ArticleNotFoundException(articleId, ArticleType.COMMUNITY)); + return new ArticleResponse(data); + } + + @Transactional + public void deleteArticle(final Long memberId, final Long studyId, final Long articleId) { + final Article article = communityArticleRepository + .findById(articleId) + .orElseThrow(() -> new ArticleNotFoundException(articleId, ArticleType.COMMUNITY)); + + if (!article.isEditableBy(new Accessor(memberId, studyId))) { + throw new UneditableArticleException(studyId, new Accessor(memberId, studyId), ArticleType.COMMUNITY); + } + + communityArticleRepository.deleteById(articleId); + } + + public ArticleSummariesResponse getArticles(final Long studyId, final Pageable pageable) { + final Page page = communityArticleDao.getAllByStudyId(studyId, pageable); + + final List articles = page.getContent().stream() + .map(ArticleSummaryResponse::new) + .collect(Collectors.toList()); + + return new ArticleSummariesResponse(articles, page.getNumber(), page.getTotalPages() - 1, + page.getTotalElements()); + } + + @Transactional + public void updateArticle(final Long memberId, final Long studyId, final Long articleId, + final ArticleRequest request) { + final Article article = communityArticleRepository + .findById(articleId) + .orElseThrow(() -> new ArticleNotFoundException(articleId, ArticleType.COMMUNITY)); + + final Accessor accessor = new Accessor(memberId, studyId); + + if (!article.isEditableBy(accessor)) { + throw new UneditableArticleException(studyId, accessor, ArticleType.COMMUNITY); + } + + article.update(accessor, request.getTitle(), request.getContent()); + } +} diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java index d9916891b..c0d08dd81 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java @@ -7,8 +7,8 @@ import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; import com.woowacourse.moamoa.studyroom.domain.repository.article.LinkArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; -import com.woowacourse.moamoa.studyroom.query.LinkDao; -import com.woowacourse.moamoa.studyroom.query.data.LinkData; +import com.woowacourse.moamoa.studyroom.query.LinkArticleDao; +import com.woowacourse.moamoa.studyroom.query.data.LinkArticleData; import com.woowacourse.moamoa.studyroom.service.exception.ArticleNotFoundException; import com.woowacourse.moamoa.studyroom.service.request.LinkArticleRequest; import com.woowacourse.moamoa.studyroom.service.response.LinksResponse; @@ -23,15 +23,15 @@ public class LinkArticleService { private final StudyRoomRepository studyRoomRepository; private final LinkArticleRepository linkArticleRepository; - private final LinkDao linkDao; + private final LinkArticleDao linkArticleDao; public LinkArticleService( final StudyRoomRepository studyRoomRepository, final LinkArticleRepository linkArticleRepository, - final LinkDao linkDao + final LinkArticleDao linkArticleDao ) { this.studyRoomRepository = studyRoomRepository; this.linkArticleRepository = linkArticleRepository; - this.linkDao = linkDao; + this.linkArticleDao = linkArticleDao; } public LinkArticle createLink( @@ -68,7 +68,7 @@ public void deleteLink(final Long memberId, final Long studyId, final Long artic } public LinksResponse getLinks(final Long studyId, final Pageable pageable) { - final Slice linkData = linkDao.findAllByStudyId(studyId, pageable); + final Slice linkData = linkArticleDao.findAllByStudyId(studyId, pageable); return new LinksResponse(linkData.getContent(), linkData.hasNext()); } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/response/LinkResponse.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/response/LinkResponse.java index 47ecb8a5e..bbdd6c76a 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/response/LinkResponse.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/response/LinkResponse.java @@ -1,6 +1,6 @@ package com.woowacourse.moamoa.studyroom.service.response; -import com.woowacourse.moamoa.studyroom.query.data.LinkData; +import com.woowacourse.moamoa.studyroom.query.data.LinkArticleData; import java.time.LocalDate; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -28,11 +28,11 @@ public class LinkResponse { private LocalDate lastModifiedDate; - public LinkResponse(final LinkData linkData) { + public LinkResponse(final LinkArticleData linkArticleData) { this( - linkData.getId(), new AuthorResponse(linkData.getMemberData()), - linkData.getLinkUrl(), linkData.getDescription(), - linkData.getCreatedDate(), linkData.getLastModifiedDate() + linkArticleData.getId(), new AuthorResponse(linkArticleData.getMemberData()), + linkArticleData.getLinkUrl(), linkArticleData.getDescription(), + linkArticleData.getCreatedDate(), linkArticleData.getLastModifiedDate() ); } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/response/LinksResponse.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/response/LinksResponse.java index 8cc82ec0a..77c0b3f59 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/response/LinksResponse.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/response/LinksResponse.java @@ -1,6 +1,6 @@ package com.woowacourse.moamoa.studyroom.service.response; -import com.woowacourse.moamoa.studyroom.query.data.LinkData; +import com.woowacourse.moamoa.studyroom.query.data.LinkArticleData; import java.util.List; import java.util.stream.Collectors; import lombok.AccessLevel; @@ -15,13 +15,13 @@ public class LinksResponse { private boolean hasNext; - public LinksResponse(final List linkData, final boolean hasNext) { - this.links = getLinkResponses(linkData); + public LinksResponse(final List linkArticleData, final boolean hasNext) { + this.links = getLinkResponses(linkArticleData); this.hasNext = hasNext; } - private List getLinkResponses(final List linkData) { - return linkData.stream() + private List getLinkResponses(final List linkArticleData) { + return linkArticleData.stream() .map(LinkResponse::new) .collect(Collectors.toList()); } diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/DeletingArticleControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/DeletingNoticeArticleControllerTest.java similarity index 93% rename from backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/DeletingArticleControllerTest.java rename to backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/DeletingNoticeArticleControllerTest.java index 4e8108cc1..586b707dd 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/DeletingArticleControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/DeletingNoticeArticleControllerTest.java @@ -1,6 +1,6 @@ package com.woowacourse.moamoa.studyroom.controller; -import static com.woowacourse.moamoa.studyroom.domain.article.ArticleType.COMMUNITY; +import static com.woowacourse.moamoa.studyroom.domain.article.ArticleType.NOTICE; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -13,9 +13,9 @@ import com.woowacourse.moamoa.study.service.StudyService; import com.woowacourse.moamoa.study.service.request.StudyRequestBuilder; import com.woowacourse.moamoa.studyroom.domain.article.Article; -import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepositoryFactory; +import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.ArticleDao; import com.woowacourse.moamoa.studyroom.service.ArticleService; import com.woowacourse.moamoa.studyroom.service.exception.ArticleNotFoundException; @@ -28,7 +28,7 @@ import org.springframework.beans.factory.annotation.Autowired; @RepositoryTest -class DeletingArticleControllerTest { +class DeletingNoticeArticleControllerTest { StudyRequestBuilder javaStudyRequest = new StudyRequestBuilder() .title("java 스터디").excerpt("자바 설명").thumbnail("java image").description("자바 소개"); @@ -49,7 +49,7 @@ class DeletingArticleControllerTest { private ArticleDao articleDao; private StudyService studyService; - private ArticleController sut; + private NoticeArticleController sut; private ArticleService articleService; @BeforeEach @@ -57,7 +57,7 @@ void setUp() { studyService = new StudyService(studyRepository, memberRepository, new DateTimeSystem()); articleService = new ArticleService(studyRoomRepository, articleRepositoryFactory, articleDao); - sut = new ArticleController(articleService); + sut = new NoticeArticleController(articleService); } @DisplayName("스터디 커뮤니티 게시글을 삭제한다.") @@ -70,13 +70,13 @@ void deleteCommunityArticle() { .createStudy(member.getGithubId(), javaStudyRequest.startDate(LocalDate.now()).build()); ArticleRequest request = new ArticleRequest("게시글 제목", "게시글 내용"); - Article article = articleService.createArticle(member.getId(), study.getId(), request, COMMUNITY); + Article article = articleService.createArticle(member.getId(), study.getId(), request, NOTICE); //act - sut.deleteArticle(member.getId(), study.getId(), article.getId(), COMMUNITY); + sut.deleteArticle(member.getId(), study.getId(), article.getId()); //assert - ArticleRepository
articleRepository = articleRepositoryFactory.getRepository(COMMUNITY); + ArticleRepository
articleRepository = articleRepositoryFactory.getRepository(NOTICE); assertThat(articleRepository.existsById(article.getId())).isFalse(); } @@ -92,7 +92,7 @@ void throwExceptionWhenGettingToNotFoundArticle() { final Long studyId = study.getId(); // act & assert - assertThatThrownBy(() -> sut.deleteArticle(memberId, studyId, 1L, COMMUNITY)) + assertThatThrownBy(() -> sut.deleteArticle(memberId, studyId, 1L)) .isInstanceOf(ArticleNotFoundException.class); } @@ -107,14 +107,14 @@ void throwExceptionWhenDeletingByNotParticipant() { .createStudy(member.getGithubId(), javaStudyRequest.startDate(LocalDate.now()).build()); ArticleRequest request = new ArticleRequest("게시글 제목", "게시글 내용"); - Article article = articleService.createArticle(member.getId(), study.getId(), request, COMMUNITY); + Article article = articleService.createArticle(member.getId(), study.getId(), request, NOTICE); final Long otherId = other.getId(); final Long studyId = study.getId(); final Long articleId = article.getId(); // act & assert - assertThatThrownBy(() -> sut.deleteArticle(otherId, studyId, articleId, COMMUNITY)) + assertThatThrownBy(() -> sut.deleteArticle(otherId, studyId, articleId)) .isInstanceOf(UneditableArticleException.class); } } diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingCommunityArticleSummariesControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingCommunityArticleSummariesControllerTest.java index 420b37541..707f9f9bf 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingCommunityArticleSummariesControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingCommunityArticleSummariesControllerTest.java @@ -58,14 +58,14 @@ class GettingCommunityArticleSummariesControllerTest { @Autowired private ArticleDao articleDao; - private ArticleController sut; + private NoticeArticleController sut; @BeforeEach void setUp() { articleService = new ArticleService(studyRoomRepository, articleRepositoryFactory, articleDao); studyService = new StudyService(studyRepository, memberRepository, new DateTimeSystem()); - sut = new ArticleController(articleService); + sut = new NoticeArticleController(articleService); } @DisplayName("스터디 커뮤니티 글 목록을 조회한다.") @@ -77,19 +77,18 @@ void getCommunityArticles() { Study study = studyService.createStudy(그린론.getGithubId(), javaStudyRequest.startDate(LocalDate.now()).build()); articleService - .createArticle(그린론.getId(), study.getId(), new ArticleRequest("제목1", "내용1"), COMMUNITY); + .createArticle(그린론.getId(), study.getId(), new ArticleRequest("제목1", "내용1"), NOTICE); articleService - .createArticle(그린론.getId(), study.getId(), new ArticleRequest("제목2", "내용2"), COMMUNITY); + .createArticle(그린론.getId(), study.getId(), new ArticleRequest("제목2", "내용2"), NOTICE); Article article3 = articleService - .createArticle(그린론.getId(), study.getId(), new ArticleRequest("제목3", "내용3"), COMMUNITY); + .createArticle(그린론.getId(), study.getId(), new ArticleRequest("제목3", "내용3"), NOTICE); Article article4 = articleService - .createArticle(그린론.getId(), study.getId(), new ArticleRequest("제목4", "내용4"), COMMUNITY); + .createArticle(그린론.getId(), study.getId(), new ArticleRequest("제목4", "내용4"), NOTICE); Article article5 = articleService - .createArticle(그린론.getId(), study.getId(), new ArticleRequest("제목5", "내용5"), COMMUNITY); + .createArticle(그린론.getId(), study.getId(), new ArticleRequest("제목5", "내용5"), NOTICE); // act - ResponseEntity response = sut.getArticles(그린론.getId(), study.getId(), - COMMUNITY, PageRequest.of(0, 3)); + ResponseEntity response = sut.getArticles(그린론.getId(), study.getId(), PageRequest.of(0, 3)); // assert AuthorResponse author = new AuthorResponse(1L, "그린론", "http://image", "http://profile"); @@ -116,7 +115,7 @@ void throwExceptionWhenWriteToNotFoundStudy() { final PageRequest pageRequest = PageRequest.of(0, 3); // act & assert - assertThatThrownBy(() -> sut.getArticles(memberId, 1L, COMMUNITY, pageRequest)) + assertThatThrownBy(() -> sut.getArticles(memberId, 1L, pageRequest)) .isInstanceOf(StudyNotFoundException.class); } @@ -135,7 +134,7 @@ void throwExceptionWhenGettingByNotParticipant() { final PageRequest pageRequest = PageRequest.of(0, 3); // act & assert - assertThatThrownBy(() -> sut.getArticles(otherId, studyId, COMMUNITY, pageRequest)) + assertThatThrownBy(() -> sut.getArticles(otherId, studyId, pageRequest)) .isInstanceOf(UnviewableArticleException.class); } } diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingArticleControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingNoticeArticleControllerTest.java similarity index 94% rename from backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingArticleControllerTest.java rename to backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingNoticeArticleControllerTest.java index 089c13c02..0665f2c9f 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingArticleControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingNoticeArticleControllerTest.java @@ -31,7 +31,7 @@ import org.springframework.http.ResponseEntity; @RepositoryTest -class GettingArticleControllerTest { +class GettingNoticeArticleControllerTest { StudyRequestBuilder javaStudyRequest = new StudyRequestBuilder() .title("java 스터디").excerpt("자바 설명").thumbnail("java image").description("자바 소개"); @@ -52,14 +52,14 @@ class GettingArticleControllerTest { private ArticleDao articleDao; private StudyService studyService; - private ArticleController sut; + private NoticeArticleController sut; private ArticleService articleService; @BeforeEach void setUp() { studyService = new StudyService(studyRepository, memberRepository, new DateTimeSystem()); articleService = new ArticleService(studyRoomRepository, articleRepositoryFactory, articleDao); - sut = new ArticleController(articleService); + sut = new NoticeArticleController(articleService); } @DisplayName("스터디 게시글을 단건 조회한다.") @@ -71,11 +71,11 @@ void getStudyCommunityArticle() { .createStudy(member.getGithubId(), javaStudyRequest.startDate(LocalDate.now()).build()); ArticleRequest request = new ArticleRequest("게시글 제목", "게시글 내용"); - Article article = articleService.createArticle(member.getId(), study.getId(), request, COMMUNITY); + Article article = articleService.createArticle(member.getId(), study.getId(), request, NOTICE); //act final ResponseEntity response = sut.getArticle(member.getId(), study.getId(), - COMMUNITY, article.getId()); + article.getId()); //assert final AuthorResponse expectedAuthorResponse = new AuthorResponse( @@ -99,7 +99,7 @@ void throwExceptionWhenGettingToNotFoundArticle() { final Long studyId = study.getId(); // act & assert - assertThatThrownBy(() -> sut.getArticle(memberId, studyId, COMMUNITY, 1L)) + assertThatThrownBy(() -> sut.getArticle(memberId, studyId, 1L)) .isInstanceOf(ArticleNotFoundException.class); } @@ -114,14 +114,14 @@ void throwExceptionWhenGettingByNotParticipant() { .createStudy(member.getGithubId(), javaStudyRequest.startDate(LocalDate.now()).build()); ArticleRequest request = new ArticleRequest("게시글 제목", "게시글 내용"); - Article article = articleService.createArticle(member.getId(), study.getId(), request, COMMUNITY); + Article article = articleService.createArticle(member.getId(), study.getId(), request, NOTICE); final Long otherId = other.getId(); final Long studyId = study.getId(); final Long articleId = article.getId(); // act & assert - assertThatThrownBy(() -> sut.getArticle(otherId, studyId, COMMUNITY, articleId)) + assertThatThrownBy(() -> sut.getArticle(otherId, studyId, articleId)) .isInstanceOf(UnviewableArticleException.class); } } diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java index 1a870a7f6..0529f28d1 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java @@ -15,7 +15,7 @@ import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; import com.woowacourse.moamoa.studyroom.domain.repository.article.LinkArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; -import com.woowacourse.moamoa.studyroom.query.LinkDao; +import com.woowacourse.moamoa.studyroom.query.LinkArticleDao; import com.woowacourse.moamoa.studyroom.service.LinkArticleService; import com.woowacourse.moamoa.studyroom.service.exception.ArticleNotFoundException; import com.woowacourse.moamoa.studyroom.service.exception.UneditableArticleException; @@ -43,7 +43,7 @@ class LinkArticleControllerTest { private LinkArticleRepository linkArticleRepository; @Autowired - private LinkDao linkDao; + private LinkArticleDao linkArticleDao; @Autowired private EntityManager entityManager; @@ -55,7 +55,7 @@ class LinkArticleControllerTest { @BeforeEach void setUp() { - linkArticleService = new LinkArticleService(studyRoomRepository, linkArticleRepository, linkDao); + linkArticleService = new LinkArticleService(studyRoomRepository, linkArticleRepository, linkArticleDao); studyService = new StudyService(studyRepository, memberRepository, new DateTimeSystem()); sut = new LinkArticleController(linkArticleService); diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/ArticleControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/NoticeArticleControllerTest.java similarity index 88% rename from backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/ArticleControllerTest.java rename to backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/NoticeArticleControllerTest.java index ba436800d..378280f6b 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/ArticleControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/NoticeArticleControllerTest.java @@ -1,6 +1,5 @@ package com.woowacourse.moamoa.studyroom.controller; -import static com.woowacourse.moamoa.studyroom.domain.article.ArticleType.COMMUNITY; import static com.woowacourse.moamoa.studyroom.domain.article.ArticleType.NOTICE; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -14,10 +13,9 @@ import com.woowacourse.moamoa.study.service.StudyService; import com.woowacourse.moamoa.study.service.exception.StudyNotFoundException; import com.woowacourse.moamoa.study.service.request.StudyRequestBuilder; +import com.woowacourse.moamoa.studyroom.domain.StudyRoom; import com.woowacourse.moamoa.studyroom.domain.article.Article; -import com.woowacourse.moamoa.studyroom.domain.article.CommunityArticle; import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; -import com.woowacourse.moamoa.studyroom.domain.StudyRoom; import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepositoryFactory; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.ArticleDao; @@ -33,7 +31,7 @@ import org.springframework.http.ResponseEntity; @RepositoryTest -class ArticleControllerTest { +class NoticeArticleControllerTest { StudyRequestBuilder javaStudyRequest = new StudyRequestBuilder() .title("java 스터디").excerpt("자바 설명").thumbnail("java image").description("자바 소개"); @@ -54,12 +52,12 @@ class ArticleControllerTest { private ArticleDao articleDao; private StudyService studyService; - private ArticleController sut; + private NoticeArticleController sut; @BeforeEach void setUp() { studyService = new StudyService(studyRepository, memberRepository, new DateTimeSystem()); - sut = new ArticleController( + sut = new NoticeArticleController( new ArticleService(studyRoomRepository, articleRepositoryFactory, articleDao)); } @@ -74,20 +72,20 @@ void createCommunityArticle() { ArticleRequest request = new ArticleRequest("게시글 제목", "게시글 내용"); // act - ResponseEntity response = sut.createArticle(owner.getId(), study.getId(), COMMUNITY, request); + ResponseEntity response = sut.createArticle(owner.getId(), study.getId(), request); // assert String location = response.getHeaders().getLocation().getPath(); - Long articleId = Long.valueOf(location.replaceAll("/api/studies/\\d+/community/articles/", "")); + Long articleId = Long.valueOf(location.replaceAll("/api/studies/\\d+/notice/articles/", "")); - Article actualArticle = articleRepositoryFactory.getRepository(COMMUNITY).findById(articleId) + Article actualArticle = articleRepositoryFactory.getRepository(NOTICE).findById(articleId) .orElseThrow(); StudyRoom expectStudyRoom = new StudyRoom(study.getId(), owner.getId(), Set.of()); assertThat(response.getStatusCode()).isEqualTo(HttpStatus.CREATED); - assertThat(location).matches("/api/studies/\\d+/community/articles/\\d+"); + assertThat(location).matches("/api/studies/\\d+/notice/articles/\\d+"); assertThat(actualArticle).isEqualTo( - new CommunityArticle(articleId, "게시글 제목", "게시글 내용", owner.getId(), expectStudyRoom) + new NoticeArticle(articleId, "게시글 제목", "게시글 내용", owner.getId(), expectStudyRoom) ); } @@ -102,7 +100,7 @@ void createNoticeArticle() { ArticleRequest request = new ArticleRequest("게시글 제목", "게시글 내용"); // act - ResponseEntity response = sut.createArticle(owner.getId(), study.getId(), NOTICE, request); + ResponseEntity response = sut.createArticle(owner.getId(), study.getId(), request); // assert String location = response.getHeaders().getLocation().getPath(); @@ -128,9 +126,7 @@ void throwExceptionWhenWriteToNotFoundStudy() { final ArticleRequest articleRequest = new ArticleRequest("제목", "내용"); // act & assert - assertThatThrownBy(() -> sut.createArticle(memberId, 1L, COMMUNITY, - articleRequest - )) + assertThatThrownBy(() -> sut.createArticle(memberId, 1L, articleRequest)) .isInstanceOf(StudyNotFoundException.class); } } diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/UpdatingArticleControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/UpdatingNoticeArticleControllerTest.java similarity index 87% rename from backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/UpdatingArticleControllerTest.java rename to backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/UpdatingNoticeArticleControllerTest.java index 9a7b3dda5..bb0b885f4 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/UpdatingArticleControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/UpdatingNoticeArticleControllerTest.java @@ -1,6 +1,6 @@ package com.woowacourse.moamoa.studyroom.controller; -import static com.woowacourse.moamoa.studyroom.domain.article.ArticleType.COMMUNITY; +import static com.woowacourse.moamoa.studyroom.domain.article.ArticleType.NOTICE; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -12,9 +12,9 @@ import com.woowacourse.moamoa.study.domain.repository.StudyRepository; import com.woowacourse.moamoa.study.service.StudyService; import com.woowacourse.moamoa.study.service.request.StudyRequestBuilder; -import com.woowacourse.moamoa.studyroom.domain.article.Article; -import com.woowacourse.moamoa.studyroom.domain.article.CommunityArticle; import com.woowacourse.moamoa.studyroom.domain.StudyRoom; +import com.woowacourse.moamoa.studyroom.domain.article.Article; +import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepositoryFactory; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; @@ -33,7 +33,7 @@ import org.springframework.http.ResponseEntity; @RepositoryTest -class UpdatingArticleControllerTest { +class UpdatingNoticeArticleControllerTest { StudyRequestBuilder javaStudyBuilder = new StudyRequestBuilder() .title("java 스터디").excerpt("자바 설명").thumbnail("java image").description("자바 소개"); @@ -54,7 +54,7 @@ class UpdatingArticleControllerTest { private ArticleDao articleDao; private StudyService studyService; - private ArticleController sut; + private NoticeArticleController sut; private ArticleService articleService; @BeforeEach @@ -62,7 +62,7 @@ void setUp() { studyService = new StudyService(studyRepository, memberRepository, new DateTimeSystem()); articleService = new ArticleService(studyRoomRepository, articleRepositoryFactory, articleDao); - sut = new ArticleController(articleService); + sut = new NoticeArticleController(articleService); } @DisplayName("게시글을 수정한다.") @@ -73,19 +73,19 @@ void updateArticle() { Study study = studyService .createStudy(owner.getGithubId(), javaStudyBuilder.startDate(LocalDate.now()).build()); Article article = articleService - .createArticle(owner.getId(), study.getId(), new ArticleRequest("제목", "내용"), COMMUNITY); + .createArticle(owner.getId(), study.getId(), new ArticleRequest("제목", "내용"), NOTICE); // act final ResponseEntity response = sut - .updateArticle(owner.getId(), study.getId(), article.getId(), COMMUNITY, + .updateArticle(owner.getId(), study.getId(), article.getId(), new ArticleRequest("제목 수정", "내용 수정")); // assert - ArticleRepository
articleRepository = articleRepositoryFactory.getRepository(COMMUNITY); + ArticleRepository
articleRepository = articleRepositoryFactory.getRepository(NOTICE); Article actualArticle = articleRepository.findById(article.getId()).orElseThrow(); StudyRoom expectStudyRoom = new StudyRoom(study.getId(), owner.getId(), Set.of()); - CommunityArticle expectArticle = new CommunityArticle(article.getId(), "제목 수정", "내용 수정", owner.getId(), + NoticeArticle expectArticle = new NoticeArticle(article.getId(), "제목 수정", "내용 수정", owner.getId(), expectStudyRoom); assertThat(response.getStatusCode()).isEqualTo(HttpStatus.NO_CONTENT); @@ -106,7 +106,7 @@ void throwExceptionWhenUpdateToNotFoundArticle() { // act & assert assertThatThrownBy(() -> - sut.updateArticle(memberId, studyId, 1L, COMMUNITY, articleRequest) + sut.updateArticle(memberId, studyId, 1L, articleRequest) ).isInstanceOf(ArticleNotFoundException.class); } @@ -122,7 +122,7 @@ void throwExceptionWhenUpdateByNotParticipant() { ArticleRequest request = new ArticleRequest("게시글 제목", "게시글 내용"); final Article article = articleService - .createArticle(member.getId(), study.getId(), request, COMMUNITY); + .createArticle(member.getId(), study.getId(), request, NOTICE); final Long otherId = other.getId(); final Long studyId = study.getId(); @@ -130,9 +130,7 @@ void throwExceptionWhenUpdateByNotParticipant() { final ArticleRequest articleRequest = new ArticleRequest("제목 수정", "내용 수정"); // act & assert - assertThatThrownBy(() -> - sut.updateArticle(otherId, studyId, articleId, COMMUNITY, - articleRequest - )).isInstanceOf(UneditableArticleException.class); + assertThatThrownBy(() -> sut.updateArticle(otherId, studyId, articleId, articleRequest)) + .isInstanceOf(UneditableArticleException.class); } } diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/StudyRoomTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/StudyRoomTest.java index f0c2219d3..2b1027f27 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/StudyRoomTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/StudyRoomTest.java @@ -28,7 +28,7 @@ void writeCommunityArticleByParticipant(final Accessor accessor) { final StudyRoom studyRoom = createStudyRoom(1L, owner, participant); // act & assert - assertThatCode(() -> studyRoom.write(accessor, "제목", "내용", COMMUNITY)) + assertThatCode(() -> studyRoom.writeCommunityArticle(accessor, "제목", "내용")) .doesNotThrowAnyException(); } @@ -46,7 +46,7 @@ void cantWriteCommunityArticleByNonParticipants(final Accessor accessor) { Member owner = createMember(1L); StudyRoom studyRoom = createStudyRoom(1L, owner); - assertThatThrownBy(() -> studyRoom.write(accessor, "제목", "내용", COMMUNITY)) + assertThatThrownBy(() -> studyRoom.writeCommunityArticle(accessor, "제목", "내용")) .isInstanceOf(UneditableArticleException.class); } diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/ArticleTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleTest.java similarity index 95% rename from backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/ArticleTest.java rename to backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleTest.java index 06a091f5f..ab6067007 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/ArticleTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleTest.java @@ -1,4 +1,4 @@ -package com.woowacourse.moamoa.studyroom.domain; +package com.woowacourse.moamoa.studyroom.domain.article; import static com.woowacourse.moamoa.studyroom.domain.article.ArticleType.COMMUNITY; import static org.assertj.core.api.Assertions.assertThat; @@ -6,6 +6,8 @@ import com.woowacourse.moamoa.member.domain.Member; import com.woowacourse.moamoa.member.service.exception.NotParticipatedMemberException; +import com.woowacourse.moamoa.studyroom.domain.Accessor; +import com.woowacourse.moamoa.studyroom.domain.StudyRoom; import com.woowacourse.moamoa.studyroom.domain.article.Article; import java.util.Set; import java.util.stream.Collectors; diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/LinkArticleTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticleTest.java similarity index 95% rename from backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/LinkArticleTest.java rename to backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticleTest.java index 35d3425ca..d1a6b8c36 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/LinkArticleTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticleTest.java @@ -1,10 +1,12 @@ -package com.woowacourse.moamoa.studyroom.domain; +package com.woowacourse.moamoa.studyroom.domain.article; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertAll; import com.woowacourse.moamoa.member.domain.Member; +import com.woowacourse.moamoa.studyroom.domain.Accessor; +import com.woowacourse.moamoa.studyroom.domain.StudyRoom; import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; import com.woowacourse.moamoa.studyroom.service.exception.UneditableArticleException; import java.util.Set; diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/CreatingArticleControllerWebMvcTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/CreatingNoticeArticleControllerWebMvcTest.java similarity index 86% rename from backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/CreatingArticleControllerWebMvcTest.java rename to backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/CreatingNoticeArticleControllerWebMvcTest.java index 054c056d1..338843f55 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/CreatingArticleControllerWebMvcTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/CreatingNoticeArticleControllerWebMvcTest.java @@ -19,7 +19,7 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; -class CreatingArticleControllerWebMvcTest extends WebMVCTest { +class CreatingNoticeArticleControllerWebMvcTest extends WebMVCTest { @MockBean private ArticleService articleService; @@ -142,21 +142,4 @@ void badRequestByInvalidLengthContent() throws Exception { .andExpect(status().isBadRequest()) .andDo(print()); } - - @DisplayName("스터디에 참여한 참가자가 아닌 경우, NotParticipatedMemberException이 발생하고 401을 반환한다.") - @Test - void unauthorizedByNotParticipant() throws Exception { - when(articleService.createArticle(any(), any(), any(), any())).thenThrow(NotParticipatedMemberException.class); - - final String token = "Bearer" + tokenProvider.createToken(1L).getAccessToken(); - - mockMvc.perform( - post("/api/studies/{study-id}/community/articles", "1") - .header(HttpHeaders.AUTHORIZATION, token) - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(new ArticleRequest("title", "content"))) - ) - .andExpect(status().isUnauthorized()) - .andDo(print()); - } } diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/DeletingArticleControllerWebMvcTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/DeletingNoticeArticleControllerWebMvcTest.java similarity index 96% rename from backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/DeletingArticleControllerWebMvcTest.java rename to backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/DeletingNoticeArticleControllerWebMvcTest.java index c90d64373..6a867ba76 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/DeletingArticleControllerWebMvcTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/DeletingNoticeArticleControllerWebMvcTest.java @@ -11,7 +11,7 @@ import org.junit.jupiter.params.provider.ValueSource; import org.springframework.http.HttpHeaders; -class DeletingArticleControllerWebMvcTest extends WebMVCTest { +class DeletingNoticeArticleControllerWebMvcTest extends WebMVCTest { @DisplayName("잘못된 토큰으로 커뮤니티 글을 생성할 경우 401을 반환한다.") @ParameterizedTest diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/GettingArticleControllerWebMvcTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/GettingNoticeArticleControllerWebMvcTest.java similarity index 81% rename from backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/GettingArticleControllerWebMvcTest.java rename to backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/GettingNoticeArticleControllerWebMvcTest.java index e913ecf1c..104133b51 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/GettingArticleControllerWebMvcTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/GettingNoticeArticleControllerWebMvcTest.java @@ -12,7 +12,7 @@ import org.junit.jupiter.params.provider.ValueSource; import org.springframework.http.HttpHeaders; -class GettingArticleControllerWebMvcTest extends WebMVCTest { +class GettingNoticeArticleControllerWebMvcTest extends WebMVCTest { @DisplayName("잘못된 토큰으로 커뮤니티 글을 조회할 경우 401을 반환한다.") @ParameterizedTest @@ -27,13 +27,12 @@ void unauthorizedGetArticleByInvalidToken(String token) throws Exception { } @DisplayName("스터디 ID 또는 게시글 ID가 잘못된 형식인 경우 400에러를 반환한다.") - @ParameterizedTest - @CsvSource({"one, 1", "1, one"}) - void badRequestByInvalidIdFormat(String studyId, String articleId) throws Exception { + @Test + void badRequestByInvalidIdFormat() throws Exception { final String token = "Bearer" + tokenProvider.createToken(1L).getAccessToken(); mockMvc.perform( - get("/api/studies/{study-id}/community/articles/{article-id}", studyId, articleId) + get("/api/studies/1/community/articles/one") .header(HttpHeaders.AUTHORIZATION, token) ) .andExpect(status().isBadRequest()) @@ -52,19 +51,6 @@ void unauthorizedGetArticleListByInvalidToken(String token) throws Exception { .andDo(print()); } - @DisplayName("스터디 ID가 잘못된 형식인 경우 400에러를 반환한다.") - @Test - void badRequestByInvalidIdFormat() throws Exception { - final String token = "Bearer" + tokenProvider.createToken(1L).getAccessToken(); - - mockMvc.perform( - get("/api/studies/{study-id}/community/articles", "one") - .header(HttpHeaders.AUTHORIZATION, token) - ) - .andExpect(status().isBadRequest()) - .andDo(print()); - } - @DisplayName("잘못된 형식의 파라미터를 전달한 경우 400 에러를 반환한다.") @ParameterizedTest @CsvSource({"one,1", "1,one", "-1,3", "1,-1", "1,0"}) diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/UpdatingArticleControllerWebMvcTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/UpdatingNoticeArticleControllerWebMvcTest.java similarity index 98% rename from backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/UpdatingArticleControllerWebMvcTest.java rename to backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/UpdatingNoticeArticleControllerWebMvcTest.java index d4f50b63e..b1b6b18e1 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/UpdatingArticleControllerWebMvcTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/UpdatingNoticeArticleControllerWebMvcTest.java @@ -15,7 +15,7 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; -class UpdatingArticleControllerWebMvcTest extends WebMVCTest { +class UpdatingNoticeArticleControllerWebMvcTest extends WebMVCTest { @DisplayName("잘못된 토큰으로 커뮤니티 글을 수정할 경우 401을 반환한다.") @ParameterizedTest From 96c659572e849afcaf9e7f1af3af705a8877ad6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=A7=84=ED=98=81?= Date: Wed, 14 Sep 2022 19:52:20 +0900 Subject: [PATCH 11/40] =?UTF-8?q?refactor:=20ArticleRepositoryFactory=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/NoticeArticleController.java | 19 +++--- .../moamoa/studyroom/domain/StudyRoom.java | 11 +--- .../repository/article/ArticleRepository.java | 18 ----- .../article/ArticleRepositoryFactory.java | 24 ------- .../JpaCommunityArticleRepository.java | 13 ---- .../article/LinkArticleRepository.java | 4 -- .../article/NoticeArticleRepository.java | 8 +-- ...{ArticleDao.java => NoticeArticleDao.java} | 49 +++++++------- .../service/CommunityArticleService.java | 6 +- ...Service.java => NoticeArticleService.java} | 66 +++++++++---------- .../DeletingNoticeArticleControllerTest.java | 27 ++++---- ...mmunityArticleSummariesControllerTest.java | 53 ++++++++------- .../GettingNoticeArticleControllerTest.java | 21 +++--- .../NoticeArticleControllerTest.java | 17 +++-- .../UpdatingNoticeArticleControllerTest.java | 31 ++++----- .../studyroom/domain/StudyRoomTest.java | 6 +- .../studyroom/domain/article/ArticleTest.java | 11 ++-- ...tingNoticeArticleControllerWebMvcTest.java | 6 +- 18 files changed, 147 insertions(+), 243 deletions(-) delete mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/ArticleRepository.java delete mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/ArticleRepositoryFactory.java delete mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/JpaCommunityArticleRepository.java rename backend/src/main/java/com/woowacourse/moamoa/studyroom/query/{ArticleDao.java => NoticeArticleDao.java} (56%) rename backend/src/main/java/com/woowacourse/moamoa/studyroom/service/{ArticleService.java => NoticeArticleService.java} (65%) diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/NoticeArticleController.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/NoticeArticleController.java index 00d965252..a2da68dfb 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/NoticeArticleController.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/NoticeArticleController.java @@ -2,8 +2,7 @@ import com.woowacourse.moamoa.auth.config.AuthenticatedMember; import com.woowacourse.moamoa.studyroom.domain.article.Article; -import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; -import com.woowacourse.moamoa.studyroom.service.ArticleService; +import com.woowacourse.moamoa.studyroom.service.NoticeArticleService; import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; import com.woowacourse.moamoa.studyroom.service.response.ArticleResponse; import com.woowacourse.moamoa.studyroom.service.response.ArticleSummariesResponse; @@ -26,10 +25,10 @@ @RequestMapping("api/studies/{study-id}/notice/articles") public class NoticeArticleController { - private final ArticleService articleService; + private final NoticeArticleService noticeArticleService; - public NoticeArticleController(final ArticleService articleService) { - this.articleService = articleService; + public NoticeArticleController(final NoticeArticleService noticeArticleService) { + this.noticeArticleService = noticeArticleService; } @PostMapping @@ -37,7 +36,7 @@ public ResponseEntity createArticle(@AuthenticatedMember final Long id, @PathVariable("study-id") final Long studyId, @Valid @RequestBody final ArticleRequest request ) { - final Article article = articleService.createArticle(id, studyId, request, ArticleType.NOTICE); + final Article article = noticeArticleService.createArticle(id, studyId, request); final URI location = URI.create("/api/studies/" + studyId + "/notice/articles/" + article.getId()); return ResponseEntity.created(location).header("Access-Control-Allow-Headers", HttpHeaders.LOCATION).build(); } @@ -47,7 +46,7 @@ public ResponseEntity getArticle(@AuthenticatedMember final Lon @PathVariable("study-id") final Long studyId, @PathVariable("article-id") final Long articleId ) { - ArticleResponse response = articleService.getArticle(id, studyId, articleId, ArticleType.NOTICE); + ArticleResponse response = noticeArticleService.getArticle(id, studyId, articleId); return ResponseEntity.ok().body(response); } @@ -56,7 +55,7 @@ public ResponseEntity deleteArticle(@AuthenticatedMember final Long id, @PathVariable("study-id") final Long studyId, @PathVariable("article-id") final Long articleId ) { - articleService.deleteArticle(id, studyId, articleId, ArticleType.NOTICE); + noticeArticleService.deleteArticle(id, studyId, articleId); return ResponseEntity.noContent().build(); } @@ -65,7 +64,7 @@ public ResponseEntity getArticles(@AuthenticatedMember @PathVariable("study-id") final Long studyId, @PageableDefault final Pageable pageable ) { - ArticleSummariesResponse response = articleService.getArticles(id, studyId, pageable, ArticleType.NOTICE); + ArticleSummariesResponse response = noticeArticleService.getArticles(id, studyId, pageable); return ResponseEntity.ok().body(response); } @@ -75,7 +74,7 @@ public ResponseEntity updateArticle(@AuthenticatedMember final Long id, @PathVariable("article-id") final Long articleId, @Valid @RequestBody final ArticleRequest request ) { - articleService.updateArticle(id, studyId, articleId, request, ArticleType.NOTICE); + noticeArticleService.updateArticle(id, studyId, articleId, request); return ResponseEntity.noContent().build(); } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/StudyRoom.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/StudyRoom.java index dd99d87f2..fc5fd219e 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/StudyRoom.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/StudyRoom.java @@ -1,6 +1,5 @@ package com.woowacourse.moamoa.studyroom.domain; -import com.woowacourse.moamoa.studyroom.domain.article.Article; import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; import com.woowacourse.moamoa.studyroom.domain.article.CommunityArticle; import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; @@ -49,16 +48,12 @@ public CommunityArticle writeCommunityArticle(final Accessor accessor, final Str return new CommunityArticle(title, content, accessor.getMemberId(),this); } - public Article write(final Accessor accessor, final String title, final String content, final ArticleType type) { - if (type == ArticleType.COMMUNITY && isPermittedAccessor(accessor)) { - return new CommunityArticle(title, content, accessor.getMemberId(), this); - } - - if (type == ArticleType.NOTICE && isOwner(accessor)) { + public NoticeArticle writeNoticeArticle(final Accessor accessor, final String title, final String content) { + if (isOwner(accessor)) { return new NoticeArticle(title, content, accessor.getMemberId(), this); } - throw new UneditableArticleException(studyId, accessor, type); + throw new UneditableArticleException(studyId, accessor, ArticleType.NOTICE); } public LinkArticle writeLinkArticle(final Accessor accessor, final String linkUrl, final String description) { diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/ArticleRepository.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/ArticleRepository.java deleted file mode 100644 index 6f03a67b4..000000000 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/ArticleRepository.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.woowacourse.moamoa.studyroom.domain.repository.article; - -import com.woowacourse.moamoa.studyroom.domain.article.Article; -import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; -import java.util.Optional; - -public interface ArticleRepository { - - T save(T article); - - Optional findById(Long id); - - void deleteById(Long id); - - boolean existsById(Long id); - - boolean isSupportType(ArticleType articleType); -} diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/ArticleRepositoryFactory.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/ArticleRepositoryFactory.java deleted file mode 100644 index 1d6e61ca4..000000000 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/ArticleRepositoryFactory.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.woowacourse.moamoa.studyroom.domain.repository.article; - -import com.woowacourse.moamoa.studyroom.domain.article.Article; -import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; -import java.util.List; -import org.springframework.stereotype.Repository; - -@Repository -public class ArticleRepositoryFactory { - - private final List> repositories; - - public ArticleRepositoryFactory(List> repositories) { - this.repositories = repositories; - } - - @SuppressWarnings("unchecked") - public ArticleRepository
getRepository(final ArticleType articleType) { - return (ArticleRepository
) repositories.stream() - .filter(repository -> repository.isSupportType(articleType)) - .findFirst() - .orElseThrow(); - } -} diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/JpaCommunityArticleRepository.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/JpaCommunityArticleRepository.java deleted file mode 100644 index 65ed1ee5d..000000000 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/JpaCommunityArticleRepository.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.woowacourse.moamoa.studyroom.domain.repository.article; - -import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; -import com.woowacourse.moamoa.studyroom.domain.article.CommunityArticle; -import org.springframework.data.jpa.repository.JpaRepository; - -interface JpaCommunityArticleRepository extends JpaRepository, ArticleRepository { - - @Override - default boolean isSupportType(ArticleType articleType) { - return articleType.equals(ArticleType.COMMUNITY); - } -} diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/LinkArticleRepository.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/LinkArticleRepository.java index 693bc79b2..5dfbb40d9 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/LinkArticleRepository.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/LinkArticleRepository.java @@ -5,8 +5,4 @@ import org.springframework.data.jpa.repository.JpaRepository; public interface LinkArticleRepository extends JpaRepository { - - LinkArticle save(LinkArticle linkArticle); - - Optional findById(Long id); } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/NoticeArticleRepository.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/NoticeArticleRepository.java index 89dfcae58..a74fd76fc 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/NoticeArticleRepository.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/NoticeArticleRepository.java @@ -1,13 +1,7 @@ package com.woowacourse.moamoa.studyroom.domain.repository.article; -import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; import org.springframework.data.jpa.repository.JpaRepository; -public interface NoticeArticleRepository extends JpaRepository, ArticleRepository { - - @Override - default boolean isSupportType(ArticleType articleType) { - return articleType.equals(ArticleType.NOTICE); - } +public interface NoticeArticleRepository extends JpaRepository { } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/query/ArticleDao.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/query/NoticeArticleDao.java similarity index 56% rename from backend/src/main/java/com/woowacourse/moamoa/studyroom/query/ArticleDao.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/query/NoticeArticleDao.java index 2b4cc77fa..7824b2126 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/query/ArticleDao.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/query/NoticeArticleDao.java @@ -1,6 +1,5 @@ package com.woowacourse.moamoa.studyroom.query; -import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; import com.woowacourse.moamoa.studyroom.query.data.ArticleData; import com.woowacourse.moamoa.member.query.data.MemberData; import java.time.LocalDate; @@ -15,7 +14,7 @@ import org.springframework.stereotype.Repository; @Repository -public class ArticleDao { +public class NoticeArticleDao { public static final RowMapper ROW_MAPPER = (rs, rn) -> { final long id = rs.getLong("article_id"); @@ -35,34 +34,34 @@ public class ArticleDao { private final NamedParameterJdbcTemplate namedParameterJdbcTemplate; - public ArticleDao(final NamedParameterJdbcTemplate namedParameterJdbcTemplate) { + public NoticeArticleDao(final NamedParameterJdbcTemplate namedParameterJdbcTemplate) { this.namedParameterJdbcTemplate = namedParameterJdbcTemplate; } - public Optional getById(final Long articleId, ArticleType type) { - final String sql = "SELECT {}.id as article_id, {}.title as article_title, {}.content as article_content, " - + "{}.created_date as article_created_date, {}.last_modified_date as article_last_modified_date, " + public Optional getById(final Long articleId) { + final String sql = "SELECT notice.id as article_id, notice.title as article_title, notice.content as article_content, " + + "notice.created_date as article_created_date, notice.last_modified_date as article_last_modified_date, " + "member.github_id, member.username, member.image_url, member.profile_url " - + "FROM {} JOIN member ON {}.author_id = member.id " - + "WHERE {}.id = :{}Id"; + + "FROM notice JOIN member ON notice.author_id = member.id " + + "WHERE notice.id = :noticeId"; - final Map params = Map.of(nameOf(type) + "Id", articleId); - return namedParameterJdbcTemplate.query(sql.replaceAll("\\{\\}", nameOf(type)), params, ROW_MAPPER).stream().findAny(); + final Map params = Map.of("noticeId", articleId); + return namedParameterJdbcTemplate.query(sql, params, ROW_MAPPER).stream().findAny(); } - public Page getAllByStudyId(final Long studyId, final Pageable pageable, ArticleType type) { - final List content = getContent(studyId, pageable, type); - final int totalCount = getTotalCount(studyId, type); + public Page getAllByStudyId(final Long studyId, final Pageable pageable) { + final List content = getContent(studyId, pageable); + final int totalCount = getTotalCount(studyId); return new PageImpl<>(content, pageable, totalCount); } - private List getContent(final Long studyId, final Pageable pageable, ArticleType type) { - final String sql = "SELECT {}.id as article_id, {}.title as article_title, {}.content as article_content, " - + "{}.created_date as article_created_date, {}.last_modified_date as article_last_modified_date, " + private List getContent(final Long studyId, final Pageable pageable) { + final String sql = "SELECT notice.id as article_id, notice.title as article_title, notice.content as article_content, " + + "notice.created_date as article_created_date, notice.last_modified_date as article_last_modified_date, " + "member.github_id, member.username, member.image_url, member.profile_url " - + "FROM {} JOIN member ON {}.author_id = member.id " - + "WHERE {}.study_id = :studyId " - + "ORDER BY created_date DESC, {}.id DESC " + + "FROM notice JOIN member ON notice.author_id = member.id " + + "WHERE notice.study_id = :studyId " + + "ORDER BY created_date DESC, notice.id DESC " + "LIMIT :size OFFSET :offset"; final Map params = Map.of( @@ -71,16 +70,12 @@ private List getContent(final Long studyId, final Pageable pageable "offset", pageable.getOffset() ); - return namedParameterJdbcTemplate.query(sql.replaceAll("\\{\\}", nameOf(type)), params, ROW_MAPPER); + return namedParameterJdbcTemplate.query(sql, params, ROW_MAPPER); } - private Integer getTotalCount(final Long studyId, ArticleType type) { - final String sql = "SELECT count({}.id) FROM {} WHERE {}.study_id = :studyId"; + private Integer getTotalCount(final Long studyId) { + final String sql = "SELECT count(notice.id) FROM notice WHERE notice.study_id = :studyId"; final Map param = Map.of("studyId", studyId); - return namedParameterJdbcTemplate.queryForObject(sql.replaceAll("\\{\\}", nameOf(type)), param, (rs, rn) -> rs.getInt(1)); - } - - private String nameOf(final ArticleType type) { - return type.name().toLowerCase(); + return namedParameterJdbcTemplate.queryForObject(sql, param, (rs, rn) -> rs.getInt(1)); } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleService.java index d97071fb7..e85615b20 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleService.java @@ -41,7 +41,7 @@ public CommunityArticleService( } @Transactional - public Article createArticle(final Long memberId, final Long studyId, final ArticleRequest request) { + public CommunityArticle createArticle(final Long memberId, final Long studyId, final ArticleRequest request) { final StudyRoom studyRoom = studyRoomRepository.findByStudyId(studyId) .orElseThrow(StudyNotFoundException::new); final Accessor accessor = new Accessor(memberId, studyId); @@ -57,7 +57,7 @@ public ArticleResponse getArticle(final Long articleId) { @Transactional public void deleteArticle(final Long memberId, final Long studyId, final Long articleId) { - final Article article = communityArticleRepository + final CommunityArticle article = communityArticleRepository .findById(articleId) .orElseThrow(() -> new ArticleNotFoundException(articleId, ArticleType.COMMUNITY)); @@ -82,7 +82,7 @@ public ArticleSummariesResponse getArticles(final Long studyId, final Pageable p @Transactional public void updateArticle(final Long memberId, final Long studyId, final Long articleId, final ArticleRequest request) { - final Article article = communityArticleRepository + final CommunityArticle article = communityArticleRepository .findById(articleId) .orElseThrow(() -> new ArticleNotFoundException(articleId, ArticleType.COMMUNITY)); diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ArticleService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleService.java similarity index 65% rename from backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ArticleService.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleService.java index 358bd3d50..b4089e6e2 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ArticleService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleService.java @@ -4,10 +4,10 @@ import com.woowacourse.moamoa.studyroom.domain.article.Article; import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; import com.woowacourse.moamoa.studyroom.domain.StudyRoom; +import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; +import com.woowacourse.moamoa.studyroom.domain.repository.article.NoticeArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; -import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepository; -import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepositoryFactory; -import com.woowacourse.moamoa.studyroom.query.ArticleDao; +import com.woowacourse.moamoa.studyroom.query.NoticeArticleDao; import com.woowacourse.moamoa.studyroom.query.data.ArticleData; import com.woowacourse.moamoa.studyroom.service.exception.ArticleNotFoundException; import com.woowacourse.moamoa.studyroom.service.exception.UneditableArticleException; @@ -27,62 +27,59 @@ @Service @Transactional(readOnly = true) -public class ArticleService { +public class NoticeArticleService { private final StudyRoomRepository studyRoomRepository; - private final ArticleRepositoryFactory articleRepositoryFactory; - private final ArticleDao articleDao; + private final NoticeArticleRepository noticeArticleRepository; + private final NoticeArticleDao noticeArticleDao; @Autowired - public ArticleService(final StudyRoomRepository studyRoomRepository, - final ArticleRepositoryFactory articleRepositoryFactory, - final ArticleDao articleDao) { + public NoticeArticleService(final StudyRoomRepository studyRoomRepository, + final NoticeArticleRepository noticeArticleRepository, + final NoticeArticleDao noticeArticleDao) { this.studyRoomRepository = studyRoomRepository; - this.articleRepositoryFactory = articleRepositoryFactory; - this.articleDao = articleDao; + this.noticeArticleRepository = noticeArticleRepository; + this.noticeArticleDao = noticeArticleDao; } @Transactional - public Article createArticle(final Long memberId, final Long studyId, - final ArticleRequest request, final ArticleType articleType) { + public NoticeArticle createArticle(final Long memberId, final Long studyId, + final ArticleRequest request) { final StudyRoom studyRoom = studyRoomRepository.findByStudyId(studyId) .orElseThrow(StudyNotFoundException::new); final Accessor accessor = new Accessor(memberId, studyId); - final Article article = studyRoom.write(accessor, request.getTitle(), request.getContent(), articleType); - final ArticleRepository
repository = articleRepositoryFactory.getRepository(articleType); - return repository.save(article); + final NoticeArticle article = studyRoom.writeNoticeArticle(accessor, request.getTitle(), request.getContent()); + return noticeArticleRepository.save(article); } - public ArticleResponse getArticle(final Long memberId, final Long studyId, final Long articleId, - final ArticleType type) { - final Article article = articleRepositoryFactory.getRepository(type) + public ArticleResponse getArticle(final Long memberId, final Long studyId, final Long articleId) { + final NoticeArticle article = noticeArticleRepository .findById(articleId) - .orElseThrow(() -> new ArticleNotFoundException(articleId, type)); + .orElseThrow(() -> new ArticleNotFoundException(articleId, ArticleType.NOTICE)); if (!article.isViewableBy(new Accessor(memberId, studyId))) { throw new UnviewableArticleException(studyId, memberId); } - final ArticleData data = articleDao.getById(articleId, type) - .orElseThrow(() -> new ArticleNotFoundException(articleId, type)); + final ArticleData data = noticeArticleDao.getById(articleId) + .orElseThrow(() -> new ArticleNotFoundException(articleId, ArticleType.NOTICE)); return new ArticleResponse(data); } @Transactional - public void deleteArticle(final Long memberId, final Long studyId, final Long articleId, final ArticleType type) { - final Article article = articleRepositoryFactory.getRepository(type) + public void deleteArticle(final Long memberId, final Long studyId, final Long articleId) { + final Article article = noticeArticleRepository .findById(articleId) - .orElseThrow(() -> new ArticleNotFoundException(articleId, type)); + .orElseThrow(() -> new ArticleNotFoundException(articleId, ArticleType.NOTICE)); if (!article.isEditableBy(new Accessor(memberId, studyId))) { - throw new UneditableArticleException(studyId, new Accessor(memberId, studyId), type); + throw new UneditableArticleException(studyId, new Accessor(memberId, studyId), ArticleType.NOTICE); } - articleRepositoryFactory.getRepository(type).deleteById(articleId); + noticeArticleRepository.deleteById(articleId); } - public ArticleSummariesResponse getArticles(final Long memberId, final Long studyId, final Pageable pageable, - final ArticleType type) { + public ArticleSummariesResponse getArticles(final Long memberId, final Long studyId, final Pageable pageable) { final StudyRoom studyRoom = studyRoomRepository.findByStudyId(studyId) .orElseThrow(StudyNotFoundException::new); @@ -90,7 +87,7 @@ public ArticleSummariesResponse getArticles(final Long memberId, final Long stud throw new UnviewableArticleException(studyId, memberId); } - final Page page = articleDao.getAllByStudyId(studyId, pageable, type); + final Page page = noticeArticleDao.getAllByStudyId(studyId, pageable); final List articles = page.getContent().stream() .map(ArticleSummaryResponse::new) @@ -101,16 +98,15 @@ public ArticleSummariesResponse getArticles(final Long memberId, final Long stud } @Transactional - public void updateArticle(final Long memberId, final Long studyId, final Long articleId, - final ArticleRequest request, final ArticleType type) { - final Article article = articleRepositoryFactory.getRepository(type) + public void updateArticle(final Long memberId, final Long studyId, final Long articleId, final ArticleRequest request) { + final Article article = noticeArticleRepository .findById(articleId) - .orElseThrow(() -> new ArticleNotFoundException(articleId, type)); + .orElseThrow(() -> new ArticleNotFoundException(articleId, ArticleType.NOTICE)); final Accessor accessor = new Accessor(memberId, studyId); if (!article.isEditableBy(accessor)) { - throw new UneditableArticleException(studyId, accessor, type); + throw new UneditableArticleException(studyId, accessor, ArticleType.NOTICE); } article.update(accessor, request.getTitle(), request.getContent()); diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/DeletingNoticeArticleControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/DeletingNoticeArticleControllerTest.java index 586b707dd..1f0b39a88 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/DeletingNoticeArticleControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/DeletingNoticeArticleControllerTest.java @@ -1,6 +1,5 @@ package com.woowacourse.moamoa.studyroom.controller; -import static com.woowacourse.moamoa.studyroom.domain.article.ArticleType.NOTICE; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -13,11 +12,10 @@ import com.woowacourse.moamoa.study.service.StudyService; import com.woowacourse.moamoa.study.service.request.StudyRequestBuilder; import com.woowacourse.moamoa.studyroom.domain.article.Article; -import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepository; -import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepositoryFactory; +import com.woowacourse.moamoa.studyroom.domain.repository.article.NoticeArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; -import com.woowacourse.moamoa.studyroom.query.ArticleDao; -import com.woowacourse.moamoa.studyroom.service.ArticleService; +import com.woowacourse.moamoa.studyroom.query.NoticeArticleDao; +import com.woowacourse.moamoa.studyroom.service.NoticeArticleService; import com.woowacourse.moamoa.studyroom.service.exception.ArticleNotFoundException; import com.woowacourse.moamoa.studyroom.service.exception.UneditableArticleException; import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; @@ -43,21 +41,21 @@ class DeletingNoticeArticleControllerTest { private MemberRepository memberRepository; @Autowired - private ArticleRepositoryFactory articleRepositoryFactory; + private NoticeArticleRepository noticeArticleRepository; @Autowired - private ArticleDao articleDao; + private NoticeArticleDao noticeArticleDao; private StudyService studyService; private NoticeArticleController sut; - private ArticleService articleService; + private NoticeArticleService noticeArticleService; @BeforeEach void setUp() { studyService = new StudyService(studyRepository, memberRepository, new DateTimeSystem()); - articleService = new ArticleService(studyRoomRepository, - articleRepositoryFactory, articleDao); - sut = new NoticeArticleController(articleService); + noticeArticleService = new NoticeArticleService(studyRoomRepository, + noticeArticleRepository, noticeArticleDao); + sut = new NoticeArticleController(noticeArticleService); } @DisplayName("스터디 커뮤니티 게시글을 삭제한다.") @@ -70,14 +68,13 @@ void deleteCommunityArticle() { .createStudy(member.getGithubId(), javaStudyRequest.startDate(LocalDate.now()).build()); ArticleRequest request = new ArticleRequest("게시글 제목", "게시글 내용"); - Article article = articleService.createArticle(member.getId(), study.getId(), request, NOTICE); + Article article = noticeArticleService.createArticle(member.getId(), study.getId(), request); //act sut.deleteArticle(member.getId(), study.getId(), article.getId()); //assert - ArticleRepository
articleRepository = articleRepositoryFactory.getRepository(NOTICE); - assertThat(articleRepository.existsById(article.getId())).isFalse(); + assertThat(noticeArticleRepository.existsById(article.getId())).isFalse(); } @DisplayName("게시글이 없는 경우 조회 시 예외가 발생한다.") @@ -107,7 +104,7 @@ void throwExceptionWhenDeletingByNotParticipant() { .createStudy(member.getGithubId(), javaStudyRequest.startDate(LocalDate.now()).build()); ArticleRequest request = new ArticleRequest("게시글 제목", "게시글 내용"); - Article article = articleService.createArticle(member.getId(), study.getId(), request, NOTICE); + Article article = noticeArticleService.createArticle(member.getId(), study.getId(), request); final Long otherId = other.getId(); final Long studyId = study.getId(); diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingCommunityArticleSummariesControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingCommunityArticleSummariesControllerTest.java index 707f9f9bf..cf4888b69 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingCommunityArticleSummariesControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingCommunityArticleSummariesControllerTest.java @@ -1,21 +1,10 @@ package com.woowacourse.moamoa.studyroom.controller; -import static com.woowacourse.moamoa.studyroom.domain.article.ArticleType.*; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import com.woowacourse.moamoa.common.RepositoryTest; import com.woowacourse.moamoa.common.utils.DateTimeSystem; -import com.woowacourse.moamoa.studyroom.domain.article.Article; -import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; -import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepositoryFactory; -import com.woowacourse.moamoa.studyroom.query.ArticleDao; -import com.woowacourse.moamoa.studyroom.service.ArticleService; -import com.woowacourse.moamoa.studyroom.service.exception.UnviewableArticleException; -import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; -import com.woowacourse.moamoa.studyroom.service.response.ArticleSummariesResponse; -import com.woowacourse.moamoa.studyroom.service.response.ArticleSummaryResponse; -import com.woowacourse.moamoa.studyroom.service.response.AuthorResponse; import com.woowacourse.moamoa.member.domain.Member; import com.woowacourse.moamoa.member.domain.repository.MemberRepository; import com.woowacourse.moamoa.study.domain.Study; @@ -23,6 +12,16 @@ import com.woowacourse.moamoa.study.service.StudyService; import com.woowacourse.moamoa.study.service.exception.StudyNotFoundException; import com.woowacourse.moamoa.study.service.request.StudyRequestBuilder; +import com.woowacourse.moamoa.studyroom.domain.article.Article; +import com.woowacourse.moamoa.studyroom.domain.repository.article.NoticeArticleRepository; +import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; +import com.woowacourse.moamoa.studyroom.query.NoticeArticleDao; +import com.woowacourse.moamoa.studyroom.service.NoticeArticleService; +import com.woowacourse.moamoa.studyroom.service.exception.UnviewableArticleException; +import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; +import com.woowacourse.moamoa.studyroom.service.response.ArticleSummariesResponse; +import com.woowacourse.moamoa.studyroom.service.response.ArticleSummaryResponse; +import com.woowacourse.moamoa.studyroom.service.response.AuthorResponse; import java.time.LocalDate; import java.util.List; import org.junit.jupiter.api.BeforeEach; @@ -39,7 +38,7 @@ class GettingCommunityArticleSummariesControllerTest { StudyRequestBuilder javaStudyRequest = new StudyRequestBuilder() .title("java 스터디").excerpt("자바 설명").thumbnail("java image").description("자바 소개"); - private ArticleService articleService; + private NoticeArticleService noticeArticleService; private StudyService studyService; @@ -53,19 +52,19 @@ class GettingCommunityArticleSummariesControllerTest { private StudyRepository studyRepository; @Autowired - private ArticleRepositoryFactory articleRepositoryFactory; + private NoticeArticleRepository noticeArticleRepository; @Autowired - private ArticleDao articleDao; + private NoticeArticleDao noticeArticleDao; private NoticeArticleController sut; @BeforeEach void setUp() { - articleService = new ArticleService(studyRoomRepository, - articleRepositoryFactory, articleDao); + noticeArticleService = new NoticeArticleService(studyRoomRepository, + noticeArticleRepository, noticeArticleDao); studyService = new StudyService(studyRepository, memberRepository, new DateTimeSystem()); - sut = new NoticeArticleController(articleService); + sut = new NoticeArticleController(noticeArticleService); } @DisplayName("스터디 커뮤니티 글 목록을 조회한다.") @@ -76,16 +75,16 @@ void getCommunityArticles() { Study study = studyService.createStudy(그린론.getGithubId(), javaStudyRequest.startDate(LocalDate.now()).build()); - articleService - .createArticle(그린론.getId(), study.getId(), new ArticleRequest("제목1", "내용1"), NOTICE); - articleService - .createArticle(그린론.getId(), study.getId(), new ArticleRequest("제목2", "내용2"), NOTICE); - Article article3 = articleService - .createArticle(그린론.getId(), study.getId(), new ArticleRequest("제목3", "내용3"), NOTICE); - Article article4 = articleService - .createArticle(그린론.getId(), study.getId(), new ArticleRequest("제목4", "내용4"), NOTICE); - Article article5 = articleService - .createArticle(그린론.getId(), study.getId(), new ArticleRequest("제목5", "내용5"), NOTICE); + noticeArticleService + .createArticle(그린론.getId(), study.getId(), new ArticleRequest("제목1", "내용1")); + noticeArticleService + .createArticle(그린론.getId(), study.getId(), new ArticleRequest("제목2", "내용2")); + Article article3 = noticeArticleService + .createArticle(그린론.getId(), study.getId(), new ArticleRequest("제목3", "내용3")); + Article article4 = noticeArticleService + .createArticle(그린론.getId(), study.getId(), new ArticleRequest("제목4", "내용4")); + Article article5 = noticeArticleService + .createArticle(그린론.getId(), study.getId(), new ArticleRequest("제목5", "내용5")); // act ResponseEntity response = sut.getArticles(그린론.getId(), study.getId(), PageRequest.of(0, 3)); diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingNoticeArticleControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingNoticeArticleControllerTest.java index 0665f2c9f..d8e528924 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingNoticeArticleControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingNoticeArticleControllerTest.java @@ -1,6 +1,5 @@ package com.woowacourse.moamoa.studyroom.controller; -import static com.woowacourse.moamoa.studyroom.domain.article.ArticleType.*; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -13,10 +12,10 @@ import com.woowacourse.moamoa.study.service.StudyService; import com.woowacourse.moamoa.study.service.request.StudyRequestBuilder; import com.woowacourse.moamoa.studyroom.domain.article.Article; +import com.woowacourse.moamoa.studyroom.domain.repository.article.NoticeArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; -import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepositoryFactory; -import com.woowacourse.moamoa.studyroom.query.ArticleDao; -import com.woowacourse.moamoa.studyroom.service.ArticleService; +import com.woowacourse.moamoa.studyroom.query.NoticeArticleDao; +import com.woowacourse.moamoa.studyroom.service.NoticeArticleService; import com.woowacourse.moamoa.studyroom.service.exception.ArticleNotFoundException; import com.woowacourse.moamoa.studyroom.service.exception.UnviewableArticleException; import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; @@ -46,20 +45,20 @@ class GettingNoticeArticleControllerTest { private MemberRepository memberRepository; @Autowired - private ArticleRepositoryFactory articleRepositoryFactory; + private NoticeArticleRepository noticeArticleRepository; @Autowired - private ArticleDao articleDao; + private NoticeArticleDao noticeArticleDao; private StudyService studyService; private NoticeArticleController sut; - private ArticleService articleService; + private NoticeArticleService noticeArticleService; @BeforeEach void setUp() { studyService = new StudyService(studyRepository, memberRepository, new DateTimeSystem()); - articleService = new ArticleService(studyRoomRepository, articleRepositoryFactory, articleDao); - sut = new NoticeArticleController(articleService); + noticeArticleService = new NoticeArticleService(studyRoomRepository, noticeArticleRepository, noticeArticleDao); + sut = new NoticeArticleController(noticeArticleService); } @DisplayName("스터디 게시글을 단건 조회한다.") @@ -71,7 +70,7 @@ void getStudyCommunityArticle() { .createStudy(member.getGithubId(), javaStudyRequest.startDate(LocalDate.now()).build()); ArticleRequest request = new ArticleRequest("게시글 제목", "게시글 내용"); - Article article = articleService.createArticle(member.getId(), study.getId(), request, NOTICE); + Article article = noticeArticleService.createArticle(member.getId(), study.getId(), request); //act final ResponseEntity response = sut.getArticle(member.getId(), study.getId(), @@ -114,7 +113,7 @@ void throwExceptionWhenGettingByNotParticipant() { .createStudy(member.getGithubId(), javaStudyRequest.startDate(LocalDate.now()).build()); ArticleRequest request = new ArticleRequest("게시글 제목", "게시글 내용"); - Article article = articleService.createArticle(member.getId(), study.getId(), request, NOTICE); + Article article = noticeArticleService.createArticle(member.getId(), study.getId(), request); final Long otherId = other.getId(); final Long studyId = study.getId(); diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/NoticeArticleControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/NoticeArticleControllerTest.java index 378280f6b..2c552fd84 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/NoticeArticleControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/NoticeArticleControllerTest.java @@ -14,12 +14,11 @@ import com.woowacourse.moamoa.study.service.exception.StudyNotFoundException; import com.woowacourse.moamoa.study.service.request.StudyRequestBuilder; import com.woowacourse.moamoa.studyroom.domain.StudyRoom; -import com.woowacourse.moamoa.studyroom.domain.article.Article; import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; -import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepositoryFactory; +import com.woowacourse.moamoa.studyroom.domain.repository.article.NoticeArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; -import com.woowacourse.moamoa.studyroom.query.ArticleDao; -import com.woowacourse.moamoa.studyroom.service.ArticleService; +import com.woowacourse.moamoa.studyroom.query.NoticeArticleDao; +import com.woowacourse.moamoa.studyroom.service.NoticeArticleService; import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; import java.time.LocalDate; import java.util.Set; @@ -43,13 +42,13 @@ class NoticeArticleControllerTest { private MemberRepository memberRepository; @Autowired - private ArticleRepositoryFactory articleRepositoryFactory; + private NoticeArticleRepository noticeArticleRepository; @Autowired private StudyRoomRepository studyRoomRepository; @Autowired - private ArticleDao articleDao; + private NoticeArticleDao noticeArticleDao; private StudyService studyService; private NoticeArticleController sut; @@ -58,7 +57,7 @@ class NoticeArticleControllerTest { void setUp() { studyService = new StudyService(studyRepository, memberRepository, new DateTimeSystem()); sut = new NoticeArticleController( - new ArticleService(studyRoomRepository, articleRepositoryFactory, articleDao)); + new NoticeArticleService(studyRoomRepository, noticeArticleRepository, noticeArticleDao)); } @DisplayName("커뮤니티 게시글을 작성한다.") @@ -78,7 +77,7 @@ void createCommunityArticle() { String location = response.getHeaders().getLocation().getPath(); Long articleId = Long.valueOf(location.replaceAll("/api/studies/\\d+/notice/articles/", "")); - Article actualArticle = articleRepositoryFactory.getRepository(NOTICE).findById(articleId) + NoticeArticle actualArticle = noticeArticleRepository.findById(articleId) .orElseThrow(); StudyRoom expectStudyRoom = new StudyRoom(study.getId(), owner.getId(), Set.of()); @@ -105,7 +104,7 @@ void createNoticeArticle() { // assert String location = response.getHeaders().getLocation().getPath(); Long articleId = Long.valueOf(location.replaceAll("/api/studies/\\d+/notice/articles/", "")); - Article actualArticle = articleRepositoryFactory.getRepository(NOTICE).findById(articleId).orElseThrow(); + NoticeArticle actualArticle = noticeArticleRepository.findById(articleId).orElseThrow(); StudyRoom expectStudyRoom = new StudyRoom(study.getId(), owner.getId(), Set.of()); diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/UpdatingNoticeArticleControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/UpdatingNoticeArticleControllerTest.java index bb0b885f4..990d8793b 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/UpdatingNoticeArticleControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/UpdatingNoticeArticleControllerTest.java @@ -1,6 +1,5 @@ package com.woowacourse.moamoa.studyroom.controller; -import static com.woowacourse.moamoa.studyroom.domain.article.ArticleType.NOTICE; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -15,11 +14,10 @@ import com.woowacourse.moamoa.studyroom.domain.StudyRoom; import com.woowacourse.moamoa.studyroom.domain.article.Article; import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; -import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepository; -import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepositoryFactory; +import com.woowacourse.moamoa.studyroom.domain.repository.article.NoticeArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; -import com.woowacourse.moamoa.studyroom.query.ArticleDao; -import com.woowacourse.moamoa.studyroom.service.ArticleService; +import com.woowacourse.moamoa.studyroom.query.NoticeArticleDao; +import com.woowacourse.moamoa.studyroom.service.NoticeArticleService; import com.woowacourse.moamoa.studyroom.service.exception.ArticleNotFoundException; import com.woowacourse.moamoa.studyroom.service.exception.UneditableArticleException; import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; @@ -48,21 +46,21 @@ class UpdatingNoticeArticleControllerTest { private MemberRepository memberRepository; @Autowired - private ArticleRepositoryFactory articleRepositoryFactory; + private NoticeArticleRepository noticeArticleRepository; @Autowired - private ArticleDao articleDao; + private NoticeArticleDao noticeArticleDao; private StudyService studyService; private NoticeArticleController sut; - private ArticleService articleService; + private NoticeArticleService noticeArticleService; @BeforeEach void setUp() { studyService = new StudyService(studyRepository, memberRepository, new DateTimeSystem()); - articleService = new ArticleService(studyRoomRepository, - articleRepositoryFactory, articleDao); - sut = new NoticeArticleController(articleService); + noticeArticleService = new NoticeArticleService(studyRoomRepository, + noticeArticleRepository, noticeArticleDao); + sut = new NoticeArticleController(noticeArticleService); } @DisplayName("게시글을 수정한다.") @@ -72,8 +70,8 @@ void updateArticle() { Member owner = memberRepository.save(new Member(1L, "username", "image", "profile")); Study study = studyService .createStudy(owner.getGithubId(), javaStudyBuilder.startDate(LocalDate.now()).build()); - Article article = articleService - .createArticle(owner.getId(), study.getId(), new ArticleRequest("제목", "내용"), NOTICE); + Article article = noticeArticleService + .createArticle(owner.getId(), study.getId(), new ArticleRequest("제목", "내용")); // act final ResponseEntity response = sut @@ -81,8 +79,7 @@ void updateArticle() { new ArticleRequest("제목 수정", "내용 수정")); // assert - ArticleRepository
articleRepository = articleRepositoryFactory.getRepository(NOTICE); - Article actualArticle = articleRepository.findById(article.getId()).orElseThrow(); + NoticeArticle actualArticle = noticeArticleRepository.findById(article.getId()).orElseThrow(); StudyRoom expectStudyRoom = new StudyRoom(study.getId(), owner.getId(), Set.of()); NoticeArticle expectArticle = new NoticeArticle(article.getId(), "제목 수정", "내용 수정", owner.getId(), @@ -121,8 +118,8 @@ void throwExceptionWhenUpdateByNotParticipant() { .createStudy(member.getGithubId(), javaStudyBuilder.startDate(LocalDate.now()).build()); ArticleRequest request = new ArticleRequest("게시글 제목", "게시글 내용"); - final Article article = articleService - .createArticle(member.getId(), study.getId(), request, NOTICE); + final Article article = noticeArticleService + .createArticle(member.getId(), study.getId(), request); final Long otherId = other.getId(); final Long studyId = study.getId(); diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/StudyRoomTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/StudyRoomTest.java index 2b1027f27..cf61d9ef4 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/StudyRoomTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/StudyRoomTest.java @@ -1,7 +1,5 @@ package com.woowacourse.moamoa.studyroom.domain; -import static com.woowacourse.moamoa.studyroom.domain.article.ArticleType.COMMUNITY; -import static com.woowacourse.moamoa.studyroom.domain.article.ArticleType.NOTICE; import static org.assertj.core.api.Assertions.assertThatCode; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -65,7 +63,7 @@ void writeNoticeArticleByOwner() { final StudyRoom studyRoom = createStudyRoom(1L, owner); // act & assert - assertThatCode(() -> studyRoom.write(new Accessor(1L, 1L), "제목", "내용", NOTICE)) + assertThatCode(() -> studyRoom.writeNoticeArticle(new Accessor(1L, 1L), "제목", "내용")) .doesNotThrowAnyException(); } @@ -79,7 +77,7 @@ void cantWriteNoticeArticleByNonOwner(final Accessor accessor) { final StudyRoom studyRoom = createStudyRoom(1L, owner, participant); // act && assert - assertThatThrownBy(() -> studyRoom.write(accessor, "제목", "내용", NOTICE)) + assertThatThrownBy(() -> studyRoom.writeNoticeArticle(accessor, "제목", "내용")) .isInstanceOf(UneditableArticleException.class); } diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleTest.java index ab6067007..d5cce22e9 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleTest.java @@ -1,14 +1,11 @@ package com.woowacourse.moamoa.studyroom.domain.article; -import static com.woowacourse.moamoa.studyroom.domain.article.ArticleType.COMMUNITY; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import com.woowacourse.moamoa.member.domain.Member; -import com.woowacourse.moamoa.member.service.exception.NotParticipatedMemberException; import com.woowacourse.moamoa.studyroom.domain.Accessor; import com.woowacourse.moamoa.studyroom.domain.StudyRoom; -import com.woowacourse.moamoa.studyroom.domain.article.Article; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -28,7 +25,7 @@ void getArticle(Long viewerId, boolean expected) { Member participant = createMember(2L); StudyRoom studyRoom = createPermittedAccessors(studyId, owner, participant); Accessor accessor = new Accessor(owner.getId(), studyId); - Article article = studyRoom.write(accessor, "제목", "내용", COMMUNITY); + Article article = studyRoom.writeNoticeArticle(accessor, "제목", "내용"); assertThat(article.isViewableBy(new Accessor(viewerId, studyId))).isEqualTo(expected); } @@ -40,7 +37,7 @@ void deleteArticle(Long studyId, Long wantToViewStudyId, boolean expected) { Member member = createMember(1L); StudyRoom studyRoom = createPermittedAccessors(studyId, member); Accessor accessor = new Accessor(member.getId(), studyId); - Article article = studyRoom.write(accessor, "제목", "내용", COMMUNITY); + Article article = studyRoom.writeNoticeArticle(accessor, "제목", "내용"); assertThat(article.isViewableBy(new Accessor(member.getId(), wantToViewStudyId))).isEqualTo(expected); } @@ -53,7 +50,7 @@ void updateArticle(Long editorId, boolean expected) { Member participant = createMember(2L); StudyRoom studyRoom = createPermittedAccessors(1L, owner, participant); Accessor accessor = new Accessor(owner.getId(), 1L); - Article article = studyRoom.write(accessor, "제목", "내용", COMMUNITY); + Article article = studyRoom.writeNoticeArticle(accessor, "제목", "내용"); assertThat(article.isEditableBy(new Accessor(editorId, 1L))).isEqualTo(expected); } @@ -64,7 +61,7 @@ void editArticleByInvalidStudyId() { Member member = createMember(1L); StudyRoom studyRoom = createPermittedAccessors(1L, member); Accessor accessor = new Accessor(member.getId(), 1L); - Article article = studyRoom.write(accessor, "제목", "내용", COMMUNITY); + Article article = studyRoom.writeNoticeArticle(accessor, "제목", "내용"); assertThat(article.isViewableBy(new Accessor(member.getId(), 2L))).isFalse(); } diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/CreatingNoticeArticleControllerWebMvcTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/CreatingNoticeArticleControllerWebMvcTest.java index 338843f55..04ae5f368 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/CreatingNoticeArticleControllerWebMvcTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/CreatingNoticeArticleControllerWebMvcTest.java @@ -1,15 +1,13 @@ package com.woowacourse.moamoa.studyroom.webmvc; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.when; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import com.woowacourse.moamoa.WebMVCTest; -import com.woowacourse.moamoa.studyroom.service.ArticleService; +import com.woowacourse.moamoa.studyroom.service.NoticeArticleService; import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; -import com.woowacourse.moamoa.member.service.exception.NotParticipatedMemberException; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -22,7 +20,7 @@ class CreatingNoticeArticleControllerWebMvcTest extends WebMVCTest { @MockBean - private ArticleService articleService; + private NoticeArticleService noticeArticleService; @DisplayName("잘못된 토큰으로 커뮤니티 글을 생성할 경우 401을 반환한다.") @ParameterizedTest From 89c0efac27c87cbe29090d403f0382ed7a12a8b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=A7=84=ED=98=81?= Date: Wed, 14 Sep 2022 21:41:06 +0900 Subject: [PATCH 12/40] =?UTF-8?q?refactor:=20Article=20=EB=B0=8F=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20=EC=8B=9C=20=EC=9D=B8=EA=B0=80=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/config/AuthRequestMatchConfig.java | 4 +- .../CommunityArticleController.java | 4 +- .../controller/NoticeArticleController.java | 14 ++--- .../studyroom/domain/article/Article.java | 58 ------------------- .../domain/article/CommunityArticle.java | 41 +++++++++---- .../domain/article/NoticeArticle.java | 41 ++++++++++--- .../service/CommunityArticleService.java | 1 - .../service/NoticeArticleService.java | 29 ++-------- ...va => CommunityArticleAcceptanceTest.java} | 13 +---- .../studyroom/LinkArticleAcceptanceTest.java | 2 - .../test/studyroom/NoticeAcceptanceTest.java | 11 ---- .../DeletingNoticeArticleControllerTest.java | 6 +- ...mmunityArticleSummariesControllerTest.java | 42 ++++---------- .../GettingNoticeArticleControllerTest.java | 31 ++-------- .../UpdatingNoticeArticleControllerTest.java | 5 +- .../domain/article/LinkArticleTest.java | 1 - ...rticleTest.java => NoticeArticleTest.java} | 11 ++-- ...tingNoticeArticleControllerWebMvcTest.java | 24 -------- 18 files changed, 105 insertions(+), 233 deletions(-) delete mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java rename backend/src/test/java/com/woowacourse/acceptance/test/studyroom/{CommunityAcceptanceTest.java => CommunityArticleAcceptanceTest.java} (96%) rename backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/{ArticleTest.java => NoticeArticleTest.java} (87%) diff --git a/backend/src/main/java/com/woowacourse/moamoa/auth/config/AuthRequestMatchConfig.java b/backend/src/main/java/com/woowacourse/moamoa/auth/config/AuthRequestMatchConfig.java index 0e2995201..b9a3f2a2d 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/auth/config/AuthRequestMatchConfig.java +++ b/backend/src/main/java/com/woowacourse/moamoa/auth/config/AuthRequestMatchConfig.java @@ -25,9 +25,7 @@ public AuthenticationRequestMatcher authenticationRequestMatcher() { "/api/my/studies", "/api/auth/refresh", "/api/members/me", - "/api/members/me/role", - "/api/studies/\\w+/community/articles/\\w+", - "/api/studies/\\w+/community/articles" + "/api/members/me/role" ) .addUpAuthenticationPath(HttpMethod.PUT, "/api/studies/\\d+/reviews/\\d+", diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/CommunityArticleController.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/CommunityArticleController.java index e2aedc34a..c53a9c3ff 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/CommunityArticleController.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/CommunityArticleController.java @@ -1,7 +1,7 @@ package com.woowacourse.moamoa.studyroom.controller; import com.woowacourse.moamoa.auth.config.AuthenticatedMember; -import com.woowacourse.moamoa.studyroom.domain.article.Article; +import com.woowacourse.moamoa.studyroom.domain.article.CommunityArticle; import com.woowacourse.moamoa.studyroom.service.CommunityArticleService; import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; import com.woowacourse.moamoa.studyroom.service.response.ArticleResponse; @@ -36,7 +36,7 @@ public ResponseEntity createArticle(@AuthenticatedMember final Long id, @PathVariable("study-id") final Long studyId, @Valid @RequestBody final ArticleRequest request ) { - final Article article = communityArticleService.createArticle(id, studyId, request); + final CommunityArticle article = communityArticleService.createArticle(id, studyId, request); final URI location = URI.create("/api/studies/" + studyId + "/community/articles/" + article.getId()); return ResponseEntity.created(location).header("Access-Control-Allow-Headers", HttpHeaders.LOCATION).build(); } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/NoticeArticleController.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/NoticeArticleController.java index a2da68dfb..ca5968f4c 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/NoticeArticleController.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/NoticeArticleController.java @@ -1,7 +1,7 @@ package com.woowacourse.moamoa.studyroom.controller; import com.woowacourse.moamoa.auth.config.AuthenticatedMember; -import com.woowacourse.moamoa.studyroom.domain.article.Article; +import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; import com.woowacourse.moamoa.studyroom.service.NoticeArticleService; import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; import com.woowacourse.moamoa.studyroom.service.response.ArticleResponse; @@ -36,17 +36,16 @@ public ResponseEntity createArticle(@AuthenticatedMember final Long id, @PathVariable("study-id") final Long studyId, @Valid @RequestBody final ArticleRequest request ) { - final Article article = noticeArticleService.createArticle(id, studyId, request); + final NoticeArticle article = noticeArticleService.createArticle(id, studyId, request); final URI location = URI.create("/api/studies/" + studyId + "/notice/articles/" + article.getId()); return ResponseEntity.created(location).header("Access-Control-Allow-Headers", HttpHeaders.LOCATION).build(); } @GetMapping("/{article-id}") - public ResponseEntity getArticle(@AuthenticatedMember final Long id, - @PathVariable("study-id") final Long studyId, + public ResponseEntity getArticle(@PathVariable("study-id") final Long studyId, @PathVariable("article-id") final Long articleId ) { - ArticleResponse response = noticeArticleService.getArticle(id, studyId, articleId); + ArticleResponse response = noticeArticleService.getArticle(articleId); return ResponseEntity.ok().body(response); } @@ -60,11 +59,10 @@ public ResponseEntity deleteArticle(@AuthenticatedMember final Long id, } @GetMapping - public ResponseEntity getArticles(@AuthenticatedMember final Long id, - @PathVariable("study-id") final Long studyId, + public ResponseEntity getArticles(@PathVariable("study-id") final Long studyId, @PageableDefault final Pageable pageable ) { - ArticleSummariesResponse response = noticeArticleService.getArticles(id, studyId, pageable); + ArticleSummariesResponse response = noticeArticleService.getArticles(studyId, pageable); return ResponseEntity.ok().body(response); } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java deleted file mode 100644 index 849106681..000000000 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.woowacourse.moamoa.studyroom.domain.article; - -import static javax.persistence.GenerationType.IDENTITY; - -import com.woowacourse.moamoa.common.entity.BaseEntity; -import com.woowacourse.moamoa.member.service.exception.NotParticipatedMemberException; -import com.woowacourse.moamoa.studyroom.domain.Accessor; -import com.woowacourse.moamoa.studyroom.domain.StudyRoom; -import javax.persistence.Column; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.MappedSuperclass; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@MappedSuperclass -@NoArgsConstructor -@Getter -public abstract class Article extends BaseEntity { - - @Id - @GeneratedValue(strategy = IDENTITY) - private Long id; - - @Column(name = "author_id") - private Long authorId; - - @ManyToOne(fetch = FetchType.EAGER) - @JoinColumn(name = "study_id") - private StudyRoom studyRoom; - - public Article(final Long id, final Long authorId, StudyRoom studyRoom) { - this.id = id; - this.authorId = authorId; - this.studyRoom = studyRoom; - } - - protected final boolean isPermittedAccessor(final Accessor accessor) { - return studyRoom.isPermittedAccessor(accessor); - } - - protected final boolean isAuthor(final Accessor accessor) { - return this.authorId.equals(accessor.getMemberId()); - } - - protected final boolean isOwner(final Accessor accessor) { - return studyRoom.isOwner(accessor); - } - - public abstract void update(Accessor accessor, String title, String content); - - public abstract boolean isEditableBy(final Accessor accessor); - - public abstract boolean isViewableBy(final Accessor accessor); -} diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticle.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticle.java index d3937357a..7c7b6d917 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticle.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticle.java @@ -1,9 +1,18 @@ package com.woowacourse.moamoa.studyroom.domain.article; +import static javax.persistence.GenerationType.IDENTITY; + +import com.woowacourse.moamoa.common.entity.BaseEntity; import com.woowacourse.moamoa.studyroom.domain.Accessor; import com.woowacourse.moamoa.studyroom.domain.StudyRoom; import java.util.Objects; +import javax.persistence.Column; import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; import javax.persistence.Table; import lombok.AccessLevel; import lombok.Getter; @@ -13,7 +22,18 @@ @NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter @Table(name = "community") -public class CommunityArticle extends Article { +public class CommunityArticle extends BaseEntity { + + @Id + @GeneratedValue(strategy = IDENTITY) + private Long id; + + @Column(name = "author_id") + private Long authorId; + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "study_id") + private StudyRoom studyRoom; private String title; @@ -21,29 +41,30 @@ public class CommunityArticle extends Article { public CommunityArticle(final String title, final String content, final Long authorId, final StudyRoom studyRoom) { - super(null, authorId, studyRoom); - this.title = title; - this.content = content; + this(null, title, content, authorId, studyRoom); } public CommunityArticle(final Long id, final String title, final String content, final Long authorId, final StudyRoom studyRoom) { - super(id, authorId, studyRoom); + this.id = id; + this.authorId = authorId; + this.studyRoom = studyRoom; this.title = title; this.content = content; } - @Override - public boolean isViewableBy(final Accessor accessor) { - return isPermittedAccessor(accessor); + protected final boolean isPermittedAccessor(final Accessor accessor) { + return studyRoom.isPermittedAccessor(accessor); + } + + protected final boolean isAuthor(final Accessor accessor) { + return this.authorId.equals(accessor.getMemberId()); } - @Override public boolean isEditableBy(final Accessor accessor) { return isPermittedAccessor(accessor) && isAuthor(accessor); } - @Override public void update(final Accessor accessor, final String title, final String content) { if (!isEditableBy(accessor)) { throw new IllegalArgumentException(); diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticle.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticle.java index e2ac823ea..bbc9b7062 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticle.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticle.java @@ -1,9 +1,18 @@ package com.woowacourse.moamoa.studyroom.domain.article; +import static javax.persistence.GenerationType.IDENTITY; + +import com.woowacourse.moamoa.common.entity.BaseEntity; import com.woowacourse.moamoa.studyroom.domain.Accessor; import com.woowacourse.moamoa.studyroom.domain.StudyRoom; import java.util.Objects; +import javax.persistence.Column; import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; import javax.persistence.Table; import lombok.AccessLevel; import lombok.Getter; @@ -13,7 +22,18 @@ @NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter @Table(name = "notice") -public class NoticeArticle extends Article { +public class NoticeArticle extends BaseEntity { + + @Id + @GeneratedValue(strategy = IDENTITY) + private Long id; + + @Column(name = "author_id") + private Long authorId; + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "study_id") + private StudyRoom studyRoom; private String title; @@ -21,29 +41,34 @@ public class NoticeArticle extends Article { public NoticeArticle(final String title, final String content, final Long authorId, final StudyRoom studyRoom) { - super(null, authorId, studyRoom); - this.title = title; - this.content = content; + this(null, title, content, authorId, studyRoom); } public NoticeArticle(final Long id, final String title, final String content, final Long authorId, final StudyRoom studyRoom) { - super(id, authorId, studyRoom); this.title = title; this.content = content; + this.id = id; + this.authorId = authorId; + this.studyRoom = studyRoom; + } + + protected final boolean isPermittedAccessor(final Accessor accessor) { + return studyRoom.isPermittedAccessor(accessor); + } + + protected final boolean isOwner(final Accessor accessor) { + return studyRoom.isOwner(accessor); } - @Override public final boolean isViewableBy(final Accessor accessor) { return isPermittedAccessor(accessor); } - @Override public final boolean isEditableBy(final Accessor accessor) { return isOwner(accessor); } - @Override public final void update(final Accessor accessor, final String title, final String content) { if (!isEditableBy(accessor)) { throw new IllegalArgumentException(); diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleService.java index e85615b20..9d4ff84e3 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleService.java @@ -3,7 +3,6 @@ import com.woowacourse.moamoa.study.service.exception.StudyNotFoundException; import com.woowacourse.moamoa.studyroom.domain.Accessor; import com.woowacourse.moamoa.studyroom.domain.StudyRoom; -import com.woowacourse.moamoa.studyroom.domain.article.Article; import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; import com.woowacourse.moamoa.studyroom.domain.article.CommunityArticle; import com.woowacourse.moamoa.studyroom.domain.repository.article.CommunityArticleRepository; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleService.java index b4089e6e2..237509476 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleService.java @@ -1,9 +1,9 @@ package com.woowacourse.moamoa.studyroom.service; +import com.woowacourse.moamoa.study.service.exception.StudyNotFoundException; import com.woowacourse.moamoa.studyroom.domain.Accessor; -import com.woowacourse.moamoa.studyroom.domain.article.Article; -import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; import com.woowacourse.moamoa.studyroom.domain.StudyRoom; +import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; import com.woowacourse.moamoa.studyroom.domain.repository.article.NoticeArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; @@ -11,12 +11,10 @@ import com.woowacourse.moamoa.studyroom.query.data.ArticleData; import com.woowacourse.moamoa.studyroom.service.exception.ArticleNotFoundException; import com.woowacourse.moamoa.studyroom.service.exception.UneditableArticleException; -import com.woowacourse.moamoa.studyroom.service.exception.UnviewableArticleException; import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; import com.woowacourse.moamoa.studyroom.service.response.ArticleResponse; import com.woowacourse.moamoa.studyroom.service.response.ArticleSummariesResponse; import com.woowacourse.moamoa.studyroom.service.response.ArticleSummaryResponse; -import com.woowacourse.moamoa.study.service.exception.StudyNotFoundException; import java.util.List; import java.util.stream.Collectors; import org.springframework.beans.factory.annotation.Autowired; @@ -52,15 +50,7 @@ public NoticeArticle createArticle(final Long memberId, final Long studyId, return noticeArticleRepository.save(article); } - public ArticleResponse getArticle(final Long memberId, final Long studyId, final Long articleId) { - final NoticeArticle article = noticeArticleRepository - .findById(articleId) - .orElseThrow(() -> new ArticleNotFoundException(articleId, ArticleType.NOTICE)); - - if (!article.isViewableBy(new Accessor(memberId, studyId))) { - throw new UnviewableArticleException(studyId, memberId); - } - + public ArticleResponse getArticle(final Long articleId) { final ArticleData data = noticeArticleDao.getById(articleId) .orElseThrow(() -> new ArticleNotFoundException(articleId, ArticleType.NOTICE)); return new ArticleResponse(data); @@ -68,7 +58,7 @@ public ArticleResponse getArticle(final Long memberId, final Long studyId, final @Transactional public void deleteArticle(final Long memberId, final Long studyId, final Long articleId) { - final Article article = noticeArticleRepository + final NoticeArticle article = noticeArticleRepository .findById(articleId) .orElseThrow(() -> new ArticleNotFoundException(articleId, ArticleType.NOTICE)); @@ -79,14 +69,7 @@ public void deleteArticle(final Long memberId, final Long studyId, final Long ar noticeArticleRepository.deleteById(articleId); } - public ArticleSummariesResponse getArticles(final Long memberId, final Long studyId, final Pageable pageable) { - final StudyRoom studyRoom = studyRoomRepository.findByStudyId(studyId) - .orElseThrow(StudyNotFoundException::new); - - if (!studyRoom.isPermittedAccessor(new Accessor(memberId, studyId))) { - throw new UnviewableArticleException(studyId, memberId); - } - + public ArticleSummariesResponse getArticles(final Long studyId, final Pageable pageable) { final Page page = noticeArticleDao.getAllByStudyId(studyId, pageable); final List articles = page.getContent().stream() @@ -99,7 +82,7 @@ public ArticleSummariesResponse getArticles(final Long memberId, final Long stud @Transactional public void updateArticle(final Long memberId, final Long studyId, final Long articleId, final ArticleRequest request) { - final Article article = noticeArticleRepository + final NoticeArticle article = noticeArticleRepository .findById(articleId) .orElseThrow(() -> new ArticleNotFoundException(articleId, ArticleType.NOTICE)); diff --git a/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/CommunityAcceptanceTest.java b/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/CommunityArticleAcceptanceTest.java similarity index 96% rename from backend/src/test/java/com/woowacourse/acceptance/test/studyroom/CommunityAcceptanceTest.java rename to backend/src/test/java/com/woowacourse/acceptance/test/studyroom/CommunityArticleAcceptanceTest.java index be0cded07..d12ee30bb 100644 --- a/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/CommunityAcceptanceTest.java +++ b/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/CommunityArticleAcceptanceTest.java @@ -39,7 +39,7 @@ import org.springframework.http.MediaType; import org.springframework.restdocs.payload.JsonFieldType; -class CommunityAcceptanceTest extends AcceptanceTest { +class CommunityArticleAcceptanceTest extends AcceptanceTest { @DisplayName("커뮤니티에 글을 작성한다.") @Test @@ -83,14 +83,10 @@ void writeArticleToCommunity() throws Exception { final ArticleResponse actualResponse = RestAssured .given(spec).log().all() - .header(HttpHeaders.AUTHORIZATION, 토큰) .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) .pathParam("study-id", 스터디_ID) .pathParam("article-id", articleId) .filter(document("article/get", - requestHeaders( - headerWithName(HttpHeaders.AUTHORIZATION).description("JWT 토큰") - ), pathParameters( parameterWithName("study-id").description("스터디 식별 ID"), parameterWithName("article-id").description("게시글 식별 ID") @@ -159,7 +155,6 @@ void deleteCommunityArticle() { // assert RestAssured .given(spec).log().all() - .header(HttpHeaders.AUTHORIZATION, 토큰) .pathParam("study-id", 스터디_ID) .pathParam("article-id", 게시글_ID) .when().log().all() @@ -187,14 +182,10 @@ void getStudyCommunityArticles() { // act final ArticleSummariesResponse response = RestAssured.given(spec).log().all() - .header(HttpHeaders.AUTHORIZATION, 토큰) .pathParam("study-id", 자바_스터디_ID) .queryParam("page", 0) .queryParam("size", 3) .filter(document("article/list", - requestHeaders( - headerWithName(HttpHeaders.AUTHORIZATION).description("Jwt 토큰") - ), pathParameters( parameterWithName("study-id").description("스터디 ID") ), @@ -256,7 +247,6 @@ void getStudyCommunityArticlesByDefaultPageable() { // act final ArticleSummariesResponse response = RestAssured.given(spec).log().all() - .header(HttpHeaders.AUTHORIZATION, 토큰) .pathParam("study-id", 스터디_ID) .when().log().all() .get("/api/studies/{study-id}/community/articles") @@ -315,7 +305,6 @@ void updateArticleToCommunity() throws JsonProcessingException { // assert final ArticleResponse response = RestAssured .given().log().all() - .header(HttpHeaders.AUTHORIZATION, 토큰) .pathParam("study-id", 스터디_ID) .pathParam("article-id", 게시글_ID) .when().log().all() diff --git a/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/LinkArticleAcceptanceTest.java b/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/LinkArticleAcceptanceTest.java index c4c5b3f28..785515073 100644 --- a/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/LinkArticleAcceptanceTest.java +++ b/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/LinkArticleAcceptanceTest.java @@ -180,7 +180,6 @@ void updateLink() { .then().statusCode(HttpStatus.NO_CONTENT.value()); final LinksResponse response = RestAssured.given().log().all() - .header(HttpHeaders.AUTHORIZATION, token) .pathParam("study-id", 자바_스터디_ID) .when().log().all() .get("/api/studies/{study-id}/reference-room/links") @@ -222,7 +221,6 @@ void deleteLink() { .then().statusCode(HttpStatus.NO_CONTENT.value()); final LinksResponse response = RestAssured.given().log().all() - .header(HttpHeaders.AUTHORIZATION, token) .pathParam("study-id", 자바_스터디_ID) .when().log().all() .get("/api/studies/{study-id}/reference-room/links") diff --git a/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/NoticeAcceptanceTest.java b/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/NoticeAcceptanceTest.java index 2e5ae63e1..7a6360c5f 100644 --- a/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/NoticeAcceptanceTest.java +++ b/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/NoticeAcceptanceTest.java @@ -79,14 +79,10 @@ void writeNotice() throws Exception { final ArticleResponse actualResponse = RestAssured .given(spec).log().all() - .header(HttpHeaders.AUTHORIZATION, 토큰) .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) .pathParam("study-id", 스터디_ID) .pathParam("article-id", articleId) .filter(document("get/notice", - requestHeaders( - headerWithName(HttpHeaders.AUTHORIZATION).description("JWT 토큰") - ), pathParameters( parameterWithName("study-id").description("스터디 식별 ID"), parameterWithName("article-id").description("공지사항 식별 ID") @@ -155,7 +151,6 @@ void deleteCommunityArticle() { // assert RestAssured .given(spec).log().all() - .header(HttpHeaders.AUTHORIZATION, 토큰) .pathParam("study-id", 스터디_ID) .pathParam("article-id", 공지사항_ID) .when().log().all() @@ -181,14 +176,10 @@ void getStudyCommunityArticles() { // act final ArticleSummariesResponse response = RestAssured.given(spec).log().all() - .header(HttpHeaders.AUTHORIZATION, 토큰) .pathParam("study-id", 자바_스터디_ID) .queryParam("page", 0) .queryParam("size", 3) .filter(document("get/notices", - requestHeaders( - headerWithName(HttpHeaders.AUTHORIZATION).description("Jwt 토큰") - ), pathParameters( parameterWithName("study-id").description("스터디 ID") ), @@ -250,7 +241,6 @@ void getStudyCommunityArticlesByDefaultPageable() { // act final ArticleSummariesResponse response = RestAssured.given(spec).log().all() - .header(HttpHeaders.AUTHORIZATION, 토큰) .pathParam("study-id", 스터디_ID) .when().log().all() .get("/api/studies/{study-id}/notice/articles") @@ -309,7 +299,6 @@ void updateArticleToCommunity() throws JsonProcessingException { // assert final ArticleResponse response = RestAssured .given().log().all() - .header(HttpHeaders.AUTHORIZATION, 토큰) .pathParam("study-id", 스터디_ID) .pathParam("article-id", 공지글_ID) .when().log().all() diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/DeletingNoticeArticleControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/DeletingNoticeArticleControllerTest.java index 1f0b39a88..6cd250e02 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/DeletingNoticeArticleControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/DeletingNoticeArticleControllerTest.java @@ -11,7 +11,7 @@ import com.woowacourse.moamoa.study.domain.repository.StudyRepository; import com.woowacourse.moamoa.study.service.StudyService; import com.woowacourse.moamoa.study.service.request.StudyRequestBuilder; -import com.woowacourse.moamoa.studyroom.domain.article.Article; +import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; import com.woowacourse.moamoa.studyroom.domain.repository.article.NoticeArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.NoticeArticleDao; @@ -68,7 +68,7 @@ void deleteCommunityArticle() { .createStudy(member.getGithubId(), javaStudyRequest.startDate(LocalDate.now()).build()); ArticleRequest request = new ArticleRequest("게시글 제목", "게시글 내용"); - Article article = noticeArticleService.createArticle(member.getId(), study.getId(), request); + NoticeArticle article = noticeArticleService.createArticle(member.getId(), study.getId(), request); //act sut.deleteArticle(member.getId(), study.getId(), article.getId()); @@ -104,7 +104,7 @@ void throwExceptionWhenDeletingByNotParticipant() { .createStudy(member.getGithubId(), javaStudyRequest.startDate(LocalDate.now()).build()); ArticleRequest request = new ArticleRequest("게시글 제목", "게시글 내용"); - Article article = noticeArticleService.createArticle(member.getId(), study.getId(), request); + NoticeArticle article = noticeArticleService.createArticle(member.getId(), study.getId(), request); final Long otherId = other.getId(); final Long studyId = study.getId(); diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingCommunityArticleSummariesControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingCommunityArticleSummariesControllerTest.java index cf4888b69..8d761d373 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingCommunityArticleSummariesControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingCommunityArticleSummariesControllerTest.java @@ -10,14 +10,12 @@ import com.woowacourse.moamoa.study.domain.Study; import com.woowacourse.moamoa.study.domain.repository.StudyRepository; import com.woowacourse.moamoa.study.service.StudyService; -import com.woowacourse.moamoa.study.service.exception.StudyNotFoundException; import com.woowacourse.moamoa.study.service.request.StudyRequestBuilder; -import com.woowacourse.moamoa.studyroom.domain.article.Article; +import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; import com.woowacourse.moamoa.studyroom.domain.repository.article.NoticeArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.NoticeArticleDao; import com.woowacourse.moamoa.studyroom.service.NoticeArticleService; -import com.woowacourse.moamoa.studyroom.service.exception.UnviewableArticleException; import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; import com.woowacourse.moamoa.studyroom.service.response.ArticleSummariesResponse; import com.woowacourse.moamoa.studyroom.service.response.ArticleSummaryResponse; @@ -79,15 +77,15 @@ void getCommunityArticles() { .createArticle(그린론.getId(), study.getId(), new ArticleRequest("제목1", "내용1")); noticeArticleService .createArticle(그린론.getId(), study.getId(), new ArticleRequest("제목2", "내용2")); - Article article3 = noticeArticleService + NoticeArticle article3 = noticeArticleService .createArticle(그린론.getId(), study.getId(), new ArticleRequest("제목3", "내용3")); - Article article4 = noticeArticleService + NoticeArticle article4 = noticeArticleService .createArticle(그린론.getId(), study.getId(), new ArticleRequest("제목4", "내용4")); - Article article5 = noticeArticleService + NoticeArticle article5 = noticeArticleService .createArticle(그린론.getId(), study.getId(), new ArticleRequest("제목5", "내용5")); // act - ResponseEntity response = sut.getArticles(그린론.getId(), study.getId(), PageRequest.of(0, 3)); + ResponseEntity response = sut.getArticles(study.getId(), PageRequest.of(0, 3)); // assert AuthorResponse author = new AuthorResponse(1L, "그린론", "http://image", "http://profile"); @@ -104,36 +102,18 @@ void getCommunityArticles() { ); } - @DisplayName("스터디가 없는 경우 게시글 목록 조회 시 예외가 발생한다.") + @DisplayName("스터디가 없는 경우 빈 리스트를 반환한다.") @Test - void throwExceptionWhenWriteToNotFoundStudy() { + void returnEmptyDataWhenWriteToNotFoundStudy() { // arrange Member member = memberRepository.save(new Member(1L, "username", "imageUrl", "profileUrl")); - final Long memberId = member.getId(); final PageRequest pageRequest = PageRequest.of(0, 3); - // act & assert - assertThatThrownBy(() -> sut.getArticles(memberId, 1L, pageRequest)) - .isInstanceOf(StudyNotFoundException.class); - } - - @DisplayName("스터디에 참여하지 않은 사용자가 스터디 커뮤니티 게시글 목록을 조회한 경우 예외가 발생한다.") - @Test - void throwExceptionWhenGettingByNotParticipant() { - // arrange - Member member = memberRepository.save(new Member(1L, "username", "imageUrl", "profileUrl")); - Member other = memberRepository.save(new Member(2L, "username2", "imageUrl", "profileUrl")); - - Study study = studyService - .createStudy(member.getGithubId(), javaStudyRequest.startDate(LocalDate.now()).build()); - - final Long otherId = other.getId(); - final Long studyId = study.getId(); - final PageRequest pageRequest = PageRequest.of(0, 3); + // act + final ResponseEntity response = sut.getArticles(1L, pageRequest); - // act & assert - assertThatThrownBy(() -> sut.getArticles(otherId, studyId, pageRequest)) - .isInstanceOf(UnviewableArticleException.class); + // assert + assertThat(response.getBody().getArticles()).isEmpty(); } } diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingNoticeArticleControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingNoticeArticleControllerTest.java index d8e528924..9a88c4aed 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingNoticeArticleControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingNoticeArticleControllerTest.java @@ -11,13 +11,12 @@ import com.woowacourse.moamoa.study.domain.repository.StudyRepository; import com.woowacourse.moamoa.study.service.StudyService; import com.woowacourse.moamoa.study.service.request.StudyRequestBuilder; -import com.woowacourse.moamoa.studyroom.domain.article.Article; +import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; import com.woowacourse.moamoa.studyroom.domain.repository.article.NoticeArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.NoticeArticleDao; import com.woowacourse.moamoa.studyroom.service.NoticeArticleService; import com.woowacourse.moamoa.studyroom.service.exception.ArticleNotFoundException; -import com.woowacourse.moamoa.studyroom.service.exception.UnviewableArticleException; import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; import com.woowacourse.moamoa.studyroom.service.response.ArticleResponse; import com.woowacourse.moamoa.studyroom.service.response.AuthorResponse; @@ -70,10 +69,10 @@ void getStudyCommunityArticle() { .createStudy(member.getGithubId(), javaStudyRequest.startDate(LocalDate.now()).build()); ArticleRequest request = new ArticleRequest("게시글 제목", "게시글 내용"); - Article article = noticeArticleService.createArticle(member.getId(), study.getId(), request); + NoticeArticle article = noticeArticleService.createArticle(member.getId(), study.getId(), request); //act - final ResponseEntity response = sut.getArticle(member.getId(), study.getId(), + final ResponseEntity response = sut.getArticle(study.getId(), article.getId()); //assert @@ -98,29 +97,7 @@ void throwExceptionWhenGettingToNotFoundArticle() { final Long studyId = study.getId(); // act & assert - assertThatThrownBy(() -> sut.getArticle(memberId, studyId, 1L)) + assertThatThrownBy(() -> sut.getArticle(studyId, 1L)) .isInstanceOf(ArticleNotFoundException.class); } - - @DisplayName("스터디를 조회할 수 없는 경우 예외가 발생한다.") - @Test - void throwExceptionWhenGettingByNotParticipant() { - // arrange - Member member = memberRepository.save(new Member(1L, "username", "imageUrl", "profileUrl")); - Member other = memberRepository.save(new Member(2L, "username2", "imageUrl", "profileUrl")); - - Study study = studyService - .createStudy(member.getGithubId(), javaStudyRequest.startDate(LocalDate.now()).build()); - - ArticleRequest request = new ArticleRequest("게시글 제목", "게시글 내용"); - Article article = noticeArticleService.createArticle(member.getId(), study.getId(), request); - - final Long otherId = other.getId(); - final Long studyId = study.getId(); - final Long articleId = article.getId(); - - // act & assert - assertThatThrownBy(() -> sut.getArticle(otherId, studyId, articleId)) - .isInstanceOf(UnviewableArticleException.class); - } } diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/UpdatingNoticeArticleControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/UpdatingNoticeArticleControllerTest.java index 990d8793b..572aabcab 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/UpdatingNoticeArticleControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/UpdatingNoticeArticleControllerTest.java @@ -12,7 +12,6 @@ import com.woowacourse.moamoa.study.service.StudyService; import com.woowacourse.moamoa.study.service.request.StudyRequestBuilder; import com.woowacourse.moamoa.studyroom.domain.StudyRoom; -import com.woowacourse.moamoa.studyroom.domain.article.Article; import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; import com.woowacourse.moamoa.studyroom.domain.repository.article.NoticeArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; @@ -70,7 +69,7 @@ void updateArticle() { Member owner = memberRepository.save(new Member(1L, "username", "image", "profile")); Study study = studyService .createStudy(owner.getGithubId(), javaStudyBuilder.startDate(LocalDate.now()).build()); - Article article = noticeArticleService + NoticeArticle article = noticeArticleService .createArticle(owner.getId(), study.getId(), new ArticleRequest("제목", "내용")); // act @@ -118,7 +117,7 @@ void throwExceptionWhenUpdateByNotParticipant() { .createStudy(member.getGithubId(), javaStudyBuilder.startDate(LocalDate.now()).build()); ArticleRequest request = new ArticleRequest("게시글 제목", "게시글 내용"); - final Article article = noticeArticleService + final NoticeArticle article = noticeArticleService .createArticle(member.getId(), study.getId(), request); final Long otherId = other.getId(); diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticleTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticleTest.java index d1a6b8c36..975f585d8 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticleTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticleTest.java @@ -7,7 +7,6 @@ import com.woowacourse.moamoa.member.domain.Member; import com.woowacourse.moamoa.studyroom.domain.Accessor; import com.woowacourse.moamoa.studyroom.domain.StudyRoom; -import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; import com.woowacourse.moamoa.studyroom.service.exception.UneditableArticleException; import java.util.Set; import java.util.stream.Collectors; diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticleTest.java similarity index 87% rename from backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleTest.java rename to backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticleTest.java index d5cce22e9..b75f18d4b 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticleTest.java @@ -1,7 +1,6 @@ package com.woowacourse.moamoa.studyroom.domain.article; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; import com.woowacourse.moamoa.member.domain.Member; import com.woowacourse.moamoa.studyroom.domain.Accessor; @@ -14,7 +13,7 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; -class ArticleTest { +class NoticeArticleTest { @DisplayName("스터디 참여자는 게시글을 조회할 수 있다.") @ParameterizedTest @@ -25,7 +24,7 @@ void getArticle(Long viewerId, boolean expected) { Member participant = createMember(2L); StudyRoom studyRoom = createPermittedAccessors(studyId, owner, participant); Accessor accessor = new Accessor(owner.getId(), studyId); - Article article = studyRoom.writeNoticeArticle(accessor, "제목", "내용"); + NoticeArticle article = studyRoom.writeNoticeArticle(accessor, "제목", "내용"); assertThat(article.isViewableBy(new Accessor(viewerId, studyId))).isEqualTo(expected); } @@ -37,7 +36,7 @@ void deleteArticle(Long studyId, Long wantToViewStudyId, boolean expected) { Member member = createMember(1L); StudyRoom studyRoom = createPermittedAccessors(studyId, member); Accessor accessor = new Accessor(member.getId(), studyId); - Article article = studyRoom.writeNoticeArticle(accessor, "제목", "내용"); + NoticeArticle article = studyRoom.writeNoticeArticle(accessor, "제목", "내용"); assertThat(article.isViewableBy(new Accessor(member.getId(), wantToViewStudyId))).isEqualTo(expected); } @@ -50,7 +49,7 @@ void updateArticle(Long editorId, boolean expected) { Member participant = createMember(2L); StudyRoom studyRoom = createPermittedAccessors(1L, owner, participant); Accessor accessor = new Accessor(owner.getId(), 1L); - Article article = studyRoom.writeNoticeArticle(accessor, "제목", "내용"); + NoticeArticle article = studyRoom.writeNoticeArticle(accessor, "제목", "내용"); assertThat(article.isEditableBy(new Accessor(editorId, 1L))).isEqualTo(expected); } @@ -61,7 +60,7 @@ void editArticleByInvalidStudyId() { Member member = createMember(1L); StudyRoom studyRoom = createPermittedAccessors(1L, member); Accessor accessor = new Accessor(member.getId(), 1L); - Article article = studyRoom.writeNoticeArticle(accessor, "제목", "내용"); + NoticeArticle article = studyRoom.writeNoticeArticle(accessor, "제목", "내용"); assertThat(article.isViewableBy(new Accessor(member.getId(), 2L))).isFalse(); } diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/GettingNoticeArticleControllerWebMvcTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/GettingNoticeArticleControllerWebMvcTest.java index 104133b51..a00aed212 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/GettingNoticeArticleControllerWebMvcTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/GettingNoticeArticleControllerWebMvcTest.java @@ -14,18 +14,6 @@ class GettingNoticeArticleControllerWebMvcTest extends WebMVCTest { - @DisplayName("잘못된 토큰으로 커뮤니티 글을 조회할 경우 401을 반환한다.") - @ParameterizedTest - @ValueSource(strings = {"", "Bearer InvalidToken", "Invalid"}) - void unauthorizedGetArticleByInvalidToken(String token) throws Exception { - mockMvc.perform( - get("/api/studies/{study-id}/community/articles/{article-id}", 1L, 1L) - .header(HttpHeaders.AUTHORIZATION, token) - ) - .andExpect(status().isUnauthorized()) - .andDo(print()); - } - @DisplayName("스터디 ID 또는 게시글 ID가 잘못된 형식인 경우 400에러를 반환한다.") @Test void badRequestByInvalidIdFormat() throws Exception { @@ -39,18 +27,6 @@ void badRequestByInvalidIdFormat() throws Exception { .andDo(print()); } - @DisplayName("잘못된 토큰으로 커뮤니티 글 목록을 조회할 경우 401을 반환한다.") - @ParameterizedTest - @ValueSource(strings = {"", "Bearer InvalidToken", "Invalid"}) - void unauthorizedGetArticleListByInvalidToken(String token) throws Exception { - mockMvc.perform( - get("/api/studies/{study-id}/community/articles?page=0&size=3", 1L) - .header(HttpHeaders.AUTHORIZATION, token) - ) - .andExpect(status().isUnauthorized()) - .andDo(print()); - } - @DisplayName("잘못된 형식의 파라미터를 전달한 경우 400 에러를 반환한다.") @ParameterizedTest @CsvSource({"one,1", "1,one", "-1,3", "1,-1", "1,0"}) From 6347b1e46b906b31b5d1c194661669e882e96af6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=A7=84=ED=98=81?= Date: Wed, 14 Sep 2022 22:05:55 +0900 Subject: [PATCH 13/40] =?UTF-8?q?refactor:=20NoticeArticle=20=EC=86=8C?= =?UTF-8?q?=ED=94=84=ED=8A=B8=20delete=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/article/NoticeArticle.java | 36 ++++--- .../studyroom/query/NoticeArticleDao.java | 6 +- .../service/NoticeArticleService.java | 10 +- .../domain/article/NoticeArticleTest.java | 101 ++++++++++-------- backend/src/test/resources/schema.sql | 1 + 5 files changed, 83 insertions(+), 71 deletions(-) diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticle.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticle.java index bbc9b7062..66bc5d86c 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticle.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticle.java @@ -5,6 +5,7 @@ import com.woowacourse.moamoa.common.entity.BaseEntity; import com.woowacourse.moamoa.studyroom.domain.Accessor; import com.woowacourse.moamoa.studyroom.domain.StudyRoom; +import com.woowacourse.moamoa.studyroom.service.exception.UneditableArticleException; import java.util.Objects; import javax.persistence.Column; import javax.persistence.Entity; @@ -17,11 +18,13 @@ import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; +import org.hibernate.annotations.Where; @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter @Table(name = "notice") +@Where(clause = "deleted = false") public class NoticeArticle extends BaseEntity { @Id @@ -39,6 +42,8 @@ public class NoticeArticle extends BaseEntity { private String content; + private boolean deleted; + public NoticeArticle(final String title, final String content, final Long authorId, final StudyRoom studyRoom) { this(null, title, content, authorId, studyRoom); @@ -51,31 +56,28 @@ public NoticeArticle(final Long id, final String title, final String content, fi this.id = id; this.authorId = authorId; this.studyRoom = studyRoom; + this.deleted = false; } - protected final boolean isPermittedAccessor(final Accessor accessor) { - return studyRoom.isPermittedAccessor(accessor); - } + public final void update(final Accessor accessor, final String title, final String content) { + if (!studyRoom.isOwner(accessor)) { + throw new UneditableArticleException(studyRoom.getId(), accessor, ArticleType.NOTICE); + } - protected final boolean isOwner(final Accessor accessor) { - return studyRoom.isOwner(accessor); + this.title = title; + this.content = content; } - public final boolean isViewableBy(final Accessor accessor) { - return isPermittedAccessor(accessor); - } + public void delete(final Accessor accessor) { + if (!studyRoom.isOwner(accessor)) { + throw new UneditableArticleException(studyRoom.getId(), accessor, ArticleType.NOTICE); + } - public final boolean isEditableBy(final Accessor accessor) { - return isOwner(accessor); + deleted = true; } - public final void update(final Accessor accessor, final String title, final String content) { - if (!isEditableBy(accessor)) { - throw new IllegalArgumentException(); - } - - this.title = title; - this.content = content; + public boolean isDeleted() { + return deleted; } @Override diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/query/NoticeArticleDao.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/query/NoticeArticleDao.java index 7824b2126..efd7bfe05 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/query/NoticeArticleDao.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/query/NoticeArticleDao.java @@ -43,7 +43,7 @@ public Optional getById(final Long articleId) { + "notice.created_date as article_created_date, notice.last_modified_date as article_last_modified_date, " + "member.github_id, member.username, member.image_url, member.profile_url " + "FROM notice JOIN member ON notice.author_id = member.id " - + "WHERE notice.id = :noticeId"; + + "WHERE notice.id = :noticeId and notice.deleted = false"; final Map params = Map.of("noticeId", articleId); return namedParameterJdbcTemplate.query(sql, params, ROW_MAPPER).stream().findAny(); @@ -60,7 +60,7 @@ private List getContent(final Long studyId, final Pageable pageable + "notice.created_date as article_created_date, notice.last_modified_date as article_last_modified_date, " + "member.github_id, member.username, member.image_url, member.profile_url " + "FROM notice JOIN member ON notice.author_id = member.id " - + "WHERE notice.study_id = :studyId " + + "WHERE notice.study_id = :studyId and notice.deleted = false " + "ORDER BY created_date DESC, notice.id DESC " + "LIMIT :size OFFSET :offset"; @@ -74,7 +74,7 @@ private List getContent(final Long studyId, final Pageable pageable } private Integer getTotalCount(final Long studyId) { - final String sql = "SELECT count(notice.id) FROM notice WHERE notice.study_id = :studyId"; + final String sql = "SELECT count(notice.id) FROM notice WHERE notice.study_id = :studyId and notice.deleted = false"; final Map param = Map.of("studyId", studyId); return namedParameterJdbcTemplate.queryForObject(sql, param, (rs, rn) -> rs.getInt(1)); } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleService.java index 237509476..6020bbcd0 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleService.java @@ -62,11 +62,7 @@ public void deleteArticle(final Long memberId, final Long studyId, final Long ar .findById(articleId) .orElseThrow(() -> new ArticleNotFoundException(articleId, ArticleType.NOTICE)); - if (!article.isEditableBy(new Accessor(memberId, studyId))) { - throw new UneditableArticleException(studyId, new Accessor(memberId, studyId), ArticleType.NOTICE); - } - - noticeArticleRepository.deleteById(articleId); + article.delete(new Accessor(memberId, studyId)); } public ArticleSummariesResponse getArticles(final Long studyId, final Pageable pageable) { @@ -88,10 +84,6 @@ public void updateArticle(final Long memberId, final Long studyId, final Long ar final Accessor accessor = new Accessor(memberId, studyId); - if (!article.isEditableBy(accessor)) { - throw new UneditableArticleException(studyId, accessor, ArticleType.NOTICE); - } - article.update(accessor, request.getTitle(), request.getContent()); } } diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticleTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticleTest.java index b75f18d4b..f250ab357 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticleTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticleTest.java @@ -1,10 +1,13 @@ package com.woowacourse.moamoa.studyroom.domain.article; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertAll; import com.woowacourse.moamoa.member.domain.Member; import com.woowacourse.moamoa.studyroom.domain.Accessor; import com.woowacourse.moamoa.studyroom.domain.StudyRoom; +import com.woowacourse.moamoa.studyroom.service.exception.UneditableArticleException; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -15,58 +18,72 @@ class NoticeArticleTest { - @DisplayName("스터디 참여자는 게시글을 조회할 수 있다.") - @ParameterizedTest - @CsvSource({"1,true", "2,true", "3,false"}) - void getArticle(Long viewerId, boolean expected) { - long studyId = 1L; - Member owner = createMember(1L); - Member participant = createMember(2L); - StudyRoom studyRoom = createPermittedAccessors(studyId, owner, participant); - Accessor accessor = new Accessor(owner.getId(), studyId); - NoticeArticle article = studyRoom.writeNoticeArticle(accessor, "제목", "내용"); - - assertThat(article.isViewableBy(new Accessor(viewerId, studyId))).isEqualTo(expected); - } + @DisplayName("공지 게시글은 방장만 수정할 수 있다.") + @Test + void update() { + // arrange + final Member owner = createMember(1L); + final StudyRoom studyRoom = createStudyRoom(1L, owner); + final Accessor accessor = new Accessor(owner.getId(), studyRoom.getId()); + final NoticeArticle sut = studyRoom.writeNoticeArticle(accessor, "제목", "내용"); - @DisplayName("스터디에 속해 있는 게시글이 맞을 경우 조회할 수 있다.") - @ParameterizedTest - @CsvSource({"1,1,true", "1,2,false"}) - void deleteArticle(Long studyId, Long wantToViewStudyId, boolean expected) { - Member member = createMember(1L); - StudyRoom studyRoom = createPermittedAccessors(studyId, member); - Accessor accessor = new Accessor(member.getId(), studyId); - NoticeArticle article = studyRoom.writeNoticeArticle(accessor, "제목", "내용"); - - assertThat(article.isViewableBy(new Accessor(member.getId(), wantToViewStudyId))).isEqualTo(expected); + // act + sut.update(accessor, "수정된 제목", "수정된 내용"); + + // assert + assertAll( + () -> assertThat(sut.getTitle()).isEqualTo("수정된 제목"), + () -> assertThat(sut.getContent()).isEqualTo("수정된 내용") + ); } - @DisplayName("스터디에 참여했고, 작성자인 경우 스터디 게시글을 수정,삭제할 수 있다.") @ParameterizedTest - @CsvSource({"1,true", "2,false", "3,false"}) - void updateArticle(Long editorId, boolean expected) { - Member owner = createMember(1L); - Member participant = createMember(2L); - StudyRoom studyRoom = createPermittedAccessors(1L, owner, participant); - Accessor accessor = new Accessor(owner.getId(), 1L); - NoticeArticle article = studyRoom.writeNoticeArticle(accessor, "제목", "내용"); - - assertThat(article.isEditableBy(new Accessor(editorId, 1L))).isEqualTo(expected); + @DisplayName("스터디에 참여중인 방장 외에는 공지 게시글을 수정할 수 없다.") + @CsvSource({"2,1", "1,2"}) + void updateByNotAuthor(final long memberId, final long studyId) { + final Member owner = createMember(1L); + final Member participant = createMember(2L); + final StudyRoom studyRoom = createStudyRoom(1L, owner, participant); + final NoticeArticle sut = studyRoom.writeNoticeArticle(new Accessor(owner.getId(), studyRoom.getId()), + "제목", "내용"); + + assertThatThrownBy(() -> sut.update(new Accessor(memberId, studyId), "수정된 제목", "수정된 설명")) + .isInstanceOf(UneditableArticleException.class); } - @DisplayName("스터디에 속해 있지 않은 게시글인 경우 수정,삭제할 수 없다.") + @DisplayName("스터디에 참여한 방장만 공지 게시글을 삭제할 수 있다.") @Test - void editArticleByInvalidStudyId() { - Member member = createMember(1L); - StudyRoom studyRoom = createPermittedAccessors(1L, member); - Accessor accessor = new Accessor(member.getId(), 1L); - NoticeArticle article = studyRoom.writeNoticeArticle(accessor, "제목", "내용"); + void delete() { + final Member owner = createMember(1L); + final StudyRoom studyRoom = createStudyRoom(1L, owner); + + final NoticeArticle sut = studyRoom.writeNoticeArticle(new Accessor(owner.getId(), studyRoom.getId()), + "제목", "내용"); + + sut.delete(new Accessor(1L, 1L)); + + assertThat(sut.isDeleted()).isTrue(); + } + + @ParameterizedTest + @DisplayName("스터디에 참여한 방장 외에는 공지 게시글을 삭제할 수 없다.") + @CsvSource({"2,1", "1,2"}) + void deleteByNotAuthor(final long memberId, final long studyId) { + final Member owner = createMember(1L); + final Member participant = createMember(2L); + final StudyRoom studyRoom = createStudyRoom(1L, owner, participant); + + final NoticeArticle sut = studyRoom.writeNoticeArticle(new Accessor(owner.getId(), studyRoom.getId()), + "제목", "내용"); - assertThat(article.isViewableBy(new Accessor(member.getId(), 2L))).isFalse(); + assertThatThrownBy(() -> sut.delete(new Accessor(memberId, studyId))) + .isInstanceOf(UneditableArticleException.class); } - private StudyRoom createPermittedAccessors(long studyId, Member owner, Member... participant) { - final Set participants = Stream.of(participant).map(Member::getId).collect(Collectors.toSet()); + private StudyRoom createStudyRoom(long studyId, Member owner, Member... participant) { + final Set participants = Stream.of(participant) + .map(Member::getId) + .collect(Collectors.toSet()); return new StudyRoom(studyId, owner.getId(), participants); } diff --git a/backend/src/test/resources/schema.sql b/backend/src/test/resources/schema.sql index 5d1780f24..cc9474884 100644 --- a/backend/src/test/resources/schema.sql +++ b/backend/src/test/resources/schema.sql @@ -120,6 +120,7 @@ CREATE TABLE notice study_id BIGINT, created_date DATETIME not null, last_modified_date DATETIME not null, + deleted boolean NOT NULL, FOREIGN KEY (author_id) REFERENCES member (id), FOREIGN KEY (study_id) REFERENCES study (id) ); From 9fa1459394327f27c83cc08fc43787d0bc159306 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=A7=84=ED=98=81?= Date: Wed, 14 Sep 2022 22:18:17 +0900 Subject: [PATCH 14/40] =?UTF-8?q?refactor:=20CommunityArticle=20=EC=86=8C?= =?UTF-8?q?=ED=94=84=ED=8A=B8=20delete=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/article/CommunityArticle.java | 34 ++++--- .../studyroom/query/CommunityArticleDao.java | 7 +- .../service/CommunityArticleService.java | 14 +-- .../domain/article/CommunityArticleTest.java | 89 +++++++++++++++++++ backend/src/test/resources/schema.sql | 1 + 5 files changed, 119 insertions(+), 26 deletions(-) create mode 100644 backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticleTest.java diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticle.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticle.java index 7c7b6d917..cf1585d34 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticle.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticle.java @@ -5,6 +5,7 @@ import com.woowacourse.moamoa.common.entity.BaseEntity; import com.woowacourse.moamoa.studyroom.domain.Accessor; import com.woowacourse.moamoa.studyroom.domain.StudyRoom; +import com.woowacourse.moamoa.studyroom.service.exception.UneditableArticleException; import java.util.Objects; import javax.persistence.Column; import javax.persistence.Entity; @@ -17,11 +18,13 @@ import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; +import org.hibernate.annotations.Where; @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter @Table(name = "community") +@Where(clause = "deleted = false") public class CommunityArticle extends BaseEntity { @Id @@ -39,6 +42,8 @@ public class CommunityArticle extends BaseEntity { private String content; + private boolean deleted; + public CommunityArticle(final String title, final String content, final Long authorId, final StudyRoom studyRoom) { this(null, title, content, authorId, studyRoom); @@ -51,27 +56,32 @@ public CommunityArticle(final Long id, final String title, final String content, this.studyRoom = studyRoom; this.title = title; this.content = content; + this.deleted = false; } - protected final boolean isPermittedAccessor(final Accessor accessor) { - return studyRoom.isPermittedAccessor(accessor); - } + public void update(final Accessor accessor, final String title, final String content) { + if (!isEditableAccessor(accessor)) { + throw new UneditableArticleException(studyRoom.getId(), accessor, ArticleType.COMMUNITY); + } - protected final boolean isAuthor(final Accessor accessor) { - return this.authorId.equals(accessor.getMemberId()); + this.title = title; + this.content = content; } - public boolean isEditableBy(final Accessor accessor) { - return isPermittedAccessor(accessor) && isAuthor(accessor); + private boolean isEditableAccessor(final Accessor accessor) { + return studyRoom.isPermittedAccessor(accessor) && authorId.equals(accessor.getMemberId()); } - public void update(final Accessor accessor, final String title, final String content) { - if (!isEditableBy(accessor)) { - throw new IllegalArgumentException(); + public void delete(final Accessor accessor) { + if (!isEditableAccessor(accessor)) { + throw new UneditableArticleException(studyRoom.getId(), accessor, ArticleType.COMMUNITY); } - this.title = title; - this.content = content; + deleted = true; + } + + public boolean isDeleted() { + return deleted; } @Override diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/query/CommunityArticleDao.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/query/CommunityArticleDao.java index c26f89540..ce1519e95 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/query/CommunityArticleDao.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/query/CommunityArticleDao.java @@ -43,7 +43,7 @@ public Optional getById(final Long articleId) { + "community.created_date as article_created_date, community.last_modified_date as article_last_modified_date, " + "member.github_id, member.username, member.image_url, member.profile_url " + "FROM community JOIN member ON community.author_id = member.id " - + "WHERE community.id = :communityId"; + + "WHERE community.id = :communityId and community.deleted = false "; final Map params = Map.of("communityId", articleId); return namedParameterJdbcTemplate.query(sql, params, ROW_MAPPER).stream().findAny(); @@ -60,7 +60,7 @@ private List getContent(final Long studyId, final Pageable pageable + "community.created_date as article_created_date, community.last_modified_date as article_last_modified_date, " + "member.github_id, member.username, member.image_url, member.profile_url " + "FROM community JOIN member ON community.author_id = member.id " - + "WHERE community.study_id = :studyId " + + "WHERE community.study_id = :studyId and community.deleted = false " + "ORDER BY created_date DESC, community.id DESC " + "LIMIT :size OFFSET :offset"; @@ -74,7 +74,8 @@ private List getContent(final Long studyId, final Pageable pageable } private Integer getTotalCount(final Long studyId) { - final String sql = "SELECT count(community.id) FROM community WHERE community.study_id = :studyId"; + final String sql = "SELECT count(community.id) FROM community " + + "WHERE community.study_id = :studyId and community.deleted = false"; final Map param = Map.of("studyId", studyId); return namedParameterJdbcTemplate.queryForObject(sql, param, (rs, rn) -> rs.getInt(1)); } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleService.java index 9d4ff84e3..e3a7736b7 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleService.java @@ -10,7 +10,6 @@ import com.woowacourse.moamoa.studyroom.query.CommunityArticleDao; import com.woowacourse.moamoa.studyroom.query.data.ArticleData; import com.woowacourse.moamoa.studyroom.service.exception.ArticleNotFoundException; -import com.woowacourse.moamoa.studyroom.service.exception.UneditableArticleException; import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; import com.woowacourse.moamoa.studyroom.service.response.ArticleResponse; import com.woowacourse.moamoa.studyroom.service.response.ArticleSummariesResponse; @@ -33,7 +32,8 @@ public class CommunityArticleService { public CommunityArticleService( final StudyRoomRepository studyRoomRepository, final CommunityArticleRepository communityArticleRepository, - final CommunityArticleDao communityArticleDao) { + final CommunityArticleDao communityArticleDao + ) { this.studyRoomRepository = studyRoomRepository; this.communityArticleRepository = communityArticleRepository; this.communityArticleDao = communityArticleDao; @@ -60,11 +60,7 @@ public void deleteArticle(final Long memberId, final Long studyId, final Long ar .findById(articleId) .orElseThrow(() -> new ArticleNotFoundException(articleId, ArticleType.COMMUNITY)); - if (!article.isEditableBy(new Accessor(memberId, studyId))) { - throw new UneditableArticleException(studyId, new Accessor(memberId, studyId), ArticleType.COMMUNITY); - } - - communityArticleRepository.deleteById(articleId); + article.delete(new Accessor(memberId, studyId)); } public ArticleSummariesResponse getArticles(final Long studyId, final Pageable pageable) { @@ -87,10 +83,6 @@ public void updateArticle(final Long memberId, final Long studyId, final Long ar final Accessor accessor = new Accessor(memberId, studyId); - if (!article.isEditableBy(accessor)) { - throw new UneditableArticleException(studyId, accessor, ArticleType.COMMUNITY); - } - article.update(accessor, request.getTitle(), request.getContent()); } } diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticleTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticleTest.java new file mode 100644 index 000000000..41bddf059 --- /dev/null +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticleTest.java @@ -0,0 +1,89 @@ +package com.woowacourse.moamoa.studyroom.domain.article; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.*; + +import com.woowacourse.moamoa.member.domain.Member; +import com.woowacourse.moamoa.studyroom.domain.Accessor; +import com.woowacourse.moamoa.studyroom.domain.StudyRoom; +import com.woowacourse.moamoa.studyroom.service.exception.UneditableArticleException; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +class CommunityArticleTest { + + @DisplayName("스터디에 참여한 작성자만 커뮤니티 게시글을 수정할 수 있다.") + @Test + void update() { + // arrange + final Member owner = createMember(1L); + final StudyRoom studyRoom = createStudyRoom(1L, owner); + final Accessor accessor = new Accessor(owner.getId(), studyRoom.getId()); + final CommunityArticle sut = studyRoom.writeCommunityArticle(accessor, "제목", "내용"); + + // act + sut.update(accessor, "수정된 제목", "수정된 내용"); + + // assert + assertAll( + () -> assertThat(sut.getTitle()).isEqualTo("수정된 제목"), + () -> assertThat(sut.getContent()).isEqualTo("수정된 내용") + ); + } + + @ParameterizedTest + @DisplayName("스터디에 참여한 작성자 외에는 커뮤니티 게시글을 수정할 수 없다.") + @CsvSource({"2,1", "1,2"}) + void updateByNotAuthor(final long memberId, final long studyId) { + final Member owner = createMember(1L); + final StudyRoom studyRoom = createStudyRoom(1L, owner); + final CommunityArticle sut = studyRoom.writeCommunityArticle(new Accessor(owner.getId(), studyRoom.getId()), + "제목", "내용"); + + assertThatThrownBy(() -> sut.update(new Accessor(memberId, studyId), "수정된 제목", "수정된 내용")) + .isInstanceOf(UneditableArticleException.class); + } + + @DisplayName("스터디에 참여한 작성자만 커뮤니티 게시글을 삭제할 수 있다.") + @Test + void delete() { + final Member owner = createMember(1L); + final StudyRoom studyRoom = createStudyRoom(1L, owner); + final CommunityArticle sut = studyRoom.writeCommunityArticle(new Accessor(owner.getId(), studyRoom.getId()), + "제목", "내용"); + + sut.delete(new Accessor(1L, 1L)); + + assertThat(sut.isDeleted()).isTrue(); + } + + @ParameterizedTest + @DisplayName("스터디에 참여한 작성자 외에는 커뮤니티 게시글을 삭제할 수 없다.") + @CsvSource({"2,1", "1,2"}) + void deleteByNotAuthor(final long memberId, final long studyId) { + final Member owner = createMember(1L); + final StudyRoom studyRoom = createStudyRoom(1L, owner); + final CommunityArticle sut = studyRoom.writeCommunityArticle(new Accessor(owner.getId(), studyRoom.getId()), + "제목", "내용"); + + assertThatThrownBy(() -> sut.delete(new Accessor(memberId, studyId))) + .isInstanceOf(UneditableArticleException.class); + } + + private StudyRoom createStudyRoom(long studyId, Member owner, Member... participant) { + final Set participants = Stream.of(participant) + .map(Member::getId) + .collect(Collectors.toSet()); + return new StudyRoom(studyId, owner.getId(), participants); + } + + private Member createMember(final long id) { + return new Member(id, id, "username" + id, "image", "profile"); + } +} diff --git a/backend/src/test/resources/schema.sql b/backend/src/test/resources/schema.sql index cc9474884..f6eea8151 100644 --- a/backend/src/test/resources/schema.sql +++ b/backend/src/test/resources/schema.sql @@ -107,6 +107,7 @@ CREATE TABLE community study_id BIGINT, created_date DATETIME not null, last_modified_date DATETIME not null, + deleted boolean NOT NULL, FOREIGN KEY (author_id) REFERENCES member (id), FOREIGN KEY (study_id) REFERENCES study (id) ); From b24da7106ce2d9604b71a06c8f20a71661a01ec3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=A7=84=ED=98=81?= Date: Thu, 15 Sep 2022 17:19:33 +0900 Subject: [PATCH 15/40] =?UTF-8?q?refactor:=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=EC=A0=95=EB=A6=AC=20=EB=B0=8F=20=EC=98=88=EC=99=B8=20=ED=8C=A8?= =?UTF-8?q?=ED=82=A4=EC=A7=80=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/woowacourse/moamoa/study/domain/Study.java | 2 +- .../exception/NotParticipatedMemberException.java | 2 +- .../controller/converter/ArticleTypeConverter.java | 14 -------------- .../moamoa/studyroom/domain/StudyRoom.java | 2 +- .../studyroom/domain/article/ArticleType.java | 4 ---- .../studyroom/domain/article/CommunityArticle.java | 2 +- .../studyroom/domain/article/LinkArticle.java | 2 +- .../studyroom/domain/article/NoticeArticle.java | 2 +- .../exception/ArticleNotFoundException.java | 2 +- .../exception/UneditableArticleException.java | 2 +- .../exception/UnviewableArticleException.java | 2 +- .../studyroom/service/CommunityArticleService.java | 2 +- .../studyroom/service/LinkArticleService.java | 2 +- .../studyroom/service/NoticeArticleService.java | 3 +-- .../woowacourse/moamoa/study/domain/StudyTest.java | 2 +- .../DeletingNoticeArticleControllerTest.java | 4 ++-- .../GettingNoticeArticleControllerTest.java | 2 +- .../controller/LinkArticleControllerTest.java | 4 ++-- .../UpdatingNoticeArticleControllerTest.java | 4 ++-- .../moamoa/studyroom/domain/StudyRoomTest.java | 2 +- .../domain/article/CommunityArticleTest.java | 2 +- .../studyroom/domain/article/LinkArticleTest.java | 2 +- .../domain/article/NoticeArticleTest.java | 2 +- 23 files changed, 24 insertions(+), 43 deletions(-) rename backend/src/main/java/com/woowacourse/moamoa/{studyroom/service => study/domain}/exception/NotParticipatedMemberException.java (81%) delete mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/converter/ArticleTypeConverter.java rename backend/src/main/java/com/woowacourse/moamoa/studyroom/{service => domain}/exception/ArticleNotFoundException.java (87%) rename backend/src/main/java/com/woowacourse/moamoa/studyroom/{service => domain}/exception/UneditableArticleException.java (89%) rename backend/src/main/java/com/woowacourse/moamoa/studyroom/{service => domain}/exception/UnviewableArticleException.java (85%) diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Study.java b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Study.java index 64fb00e9a..5f94eec10 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/domain/Study.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/domain/Study.java @@ -4,7 +4,7 @@ import static lombok.AccessLevel.PROTECTED; import com.woowacourse.moamoa.common.exception.UnauthorizedException; -import com.woowacourse.moamoa.studyroom.service.exception.NotParticipatedMemberException; +import com.woowacourse.moamoa.study.domain.exception.NotParticipatedMemberException; import com.woowacourse.moamoa.study.domain.exception.InvalidPeriodException; import com.woowacourse.moamoa.study.service.exception.FailureParticipationException; import com.woowacourse.moamoa.study.service.exception.InvalidUpdatingException; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/NotParticipatedMemberException.java b/backend/src/main/java/com/woowacourse/moamoa/study/domain/exception/NotParticipatedMemberException.java similarity index 81% rename from backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/NotParticipatedMemberException.java rename to backend/src/main/java/com/woowacourse/moamoa/study/domain/exception/NotParticipatedMemberException.java index 2565a2229..dbb968a10 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/NotParticipatedMemberException.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/domain/exception/NotParticipatedMemberException.java @@ -1,4 +1,4 @@ -package com.woowacourse.moamoa.studyroom.service.exception; +package com.woowacourse.moamoa.study.domain.exception; import com.woowacourse.moamoa.common.exception.BadRequestException; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/converter/ArticleTypeConverter.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/converter/ArticleTypeConverter.java deleted file mode 100644 index 4192d355a..000000000 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/converter/ArticleTypeConverter.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.woowacourse.moamoa.studyroom.controller.converter; - -import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; -import org.springframework.core.convert.converter.Converter; -import org.springframework.stereotype.Component; - -@Component -public class ArticleTypeConverter implements Converter { - - @Override - public ArticleType convert(final String source) { - return ArticleType.valueOf(source.toUpperCase()); - } -} diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/StudyRoom.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/StudyRoom.java index fc5fd219e..7578d62e1 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/StudyRoom.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/StudyRoom.java @@ -4,7 +4,7 @@ import com.woowacourse.moamoa.studyroom.domain.article.CommunityArticle; import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; -import com.woowacourse.moamoa.studyroom.service.exception.UneditableArticleException; +import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; import java.util.Objects; import java.util.Set; import javax.persistence.Column; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleType.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleType.java index 7136eba33..e24e61100 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleType.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleType.java @@ -3,8 +3,4 @@ public enum ArticleType { COMMUNITY, NOTICE, LINK; - - public String lowerName() { - return name().toLowerCase(); - } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticle.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticle.java index cf1585d34..0c47427dc 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticle.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticle.java @@ -5,7 +5,7 @@ import com.woowacourse.moamoa.common.entity.BaseEntity; import com.woowacourse.moamoa.studyroom.domain.Accessor; import com.woowacourse.moamoa.studyroom.domain.StudyRoom; -import com.woowacourse.moamoa.studyroom.service.exception.UneditableArticleException; +import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; import java.util.Objects; import javax.persistence.Column; import javax.persistence.Entity; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticle.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticle.java index 8753ba824..0c5bf9808 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticle.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticle.java @@ -3,7 +3,7 @@ import com.woowacourse.moamoa.common.entity.BaseEntity; import com.woowacourse.moamoa.studyroom.domain.Accessor; import com.woowacourse.moamoa.studyroom.domain.StudyRoom; -import com.woowacourse.moamoa.studyroom.service.exception.UneditableArticleException; +import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticle.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticle.java index 66bc5d86c..3d2142596 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticle.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticle.java @@ -5,7 +5,7 @@ import com.woowacourse.moamoa.common.entity.BaseEntity; import com.woowacourse.moamoa.studyroom.domain.Accessor; import com.woowacourse.moamoa.studyroom.domain.StudyRoom; -import com.woowacourse.moamoa.studyroom.service.exception.UneditableArticleException; +import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; import java.util.Objects; import javax.persistence.Column; import javax.persistence.Entity; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/ArticleNotFoundException.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/ArticleNotFoundException.java similarity index 87% rename from backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/ArticleNotFoundException.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/ArticleNotFoundException.java index b077c1562..2eab43c52 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/ArticleNotFoundException.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/ArticleNotFoundException.java @@ -1,4 +1,4 @@ -package com.woowacourse.moamoa.studyroom.service.exception; +package com.woowacourse.moamoa.studyroom.domain.exception; import com.woowacourse.moamoa.common.exception.NotFoundException; import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/UneditableArticleException.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/UneditableArticleException.java similarity index 89% rename from backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/UneditableArticleException.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/UneditableArticleException.java index 39285844a..c63698ebf 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/UneditableArticleException.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/UneditableArticleException.java @@ -1,4 +1,4 @@ -package com.woowacourse.moamoa.studyroom.service.exception; +package com.woowacourse.moamoa.studyroom.domain.exception; import com.woowacourse.moamoa.common.exception.BadRequestException; import com.woowacourse.moamoa.studyroom.domain.Accessor; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/UnviewableArticleException.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/UnviewableArticleException.java similarity index 85% rename from backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/UnviewableArticleException.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/UnviewableArticleException.java index 8c39a9ff6..226af0154 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/UnviewableArticleException.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/UnviewableArticleException.java @@ -1,4 +1,4 @@ -package com.woowacourse.moamoa.studyroom.service.exception; +package com.woowacourse.moamoa.studyroom.domain.exception; import com.woowacourse.moamoa.common.exception.BadRequestException; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleService.java index e3a7736b7..58de65e16 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleService.java @@ -9,7 +9,7 @@ import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.CommunityArticleDao; import com.woowacourse.moamoa.studyroom.query.data.ArticleData; -import com.woowacourse.moamoa.studyroom.service.exception.ArticleNotFoundException; +import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; import com.woowacourse.moamoa.studyroom.service.response.ArticleResponse; import com.woowacourse.moamoa.studyroom.service.response.ArticleSummariesResponse; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java index c0d08dd81..b13018d48 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java @@ -9,7 +9,7 @@ import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.LinkArticleDao; import com.woowacourse.moamoa.studyroom.query.data.LinkArticleData; -import com.woowacourse.moamoa.studyroom.service.exception.ArticleNotFoundException; +import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; import com.woowacourse.moamoa.studyroom.service.request.LinkArticleRequest; import com.woowacourse.moamoa.studyroom.service.response.LinksResponse; import org.springframework.data.domain.Pageable; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleService.java index 6020bbcd0..49c281191 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleService.java @@ -9,8 +9,7 @@ import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.NoticeArticleDao; import com.woowacourse.moamoa.studyroom.query.data.ArticleData; -import com.woowacourse.moamoa.studyroom.service.exception.ArticleNotFoundException; -import com.woowacourse.moamoa.studyroom.service.exception.UneditableArticleException; +import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; import com.woowacourse.moamoa.studyroom.service.response.ArticleResponse; import com.woowacourse.moamoa.studyroom.service.response.ArticleSummariesResponse; diff --git a/backend/src/test/java/com/woowacourse/moamoa/study/domain/StudyTest.java b/backend/src/test/java/com/woowacourse/moamoa/study/domain/StudyTest.java index f38befca5..3e30b91bb 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/study/domain/StudyTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/study/domain/StudyTest.java @@ -12,7 +12,7 @@ import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; -import com.woowacourse.moamoa.studyroom.service.exception.NotParticipatedMemberException; +import com.woowacourse.moamoa.study.domain.exception.NotParticipatedMemberException; import com.woowacourse.moamoa.study.domain.exception.InvalidPeriodException; import com.woowacourse.moamoa.study.service.exception.FailureParticipationException; import com.woowacourse.moamoa.study.service.exception.OwnerCanNotLeaveException; diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/DeletingNoticeArticleControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/DeletingNoticeArticleControllerTest.java index 13f8e62d9..932908bd5 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/DeletingNoticeArticleControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/DeletingNoticeArticleControllerTest.java @@ -16,8 +16,8 @@ import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.NoticeArticleDao; import com.woowacourse.moamoa.studyroom.service.NoticeArticleService; -import com.woowacourse.moamoa.studyroom.service.exception.ArticleNotFoundException; -import com.woowacourse.moamoa.studyroom.service.exception.UneditableArticleException; +import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; +import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; import java.time.LocalDate; import org.junit.jupiter.api.BeforeEach; diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingNoticeArticleControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingNoticeArticleControllerTest.java index 2f3a91adf..cef944075 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingNoticeArticleControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingNoticeArticleControllerTest.java @@ -16,7 +16,7 @@ import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.NoticeArticleDao; import com.woowacourse.moamoa.studyroom.service.NoticeArticleService; -import com.woowacourse.moamoa.studyroom.service.exception.ArticleNotFoundException; +import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; import com.woowacourse.moamoa.studyroom.service.response.ArticleResponse; import com.woowacourse.moamoa.studyroom.service.response.AuthorResponse; diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java index 71ecdafc0..2cc864e3b 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java @@ -17,8 +17,8 @@ import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.LinkArticleDao; import com.woowacourse.moamoa.studyroom.service.LinkArticleService; -import com.woowacourse.moamoa.studyroom.service.exception.ArticleNotFoundException; -import com.woowacourse.moamoa.studyroom.service.exception.UneditableArticleException; +import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; +import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; import com.woowacourse.moamoa.studyroom.service.request.LinkArticleRequest; import java.time.LocalDate; import javax.persistence.EntityManager; diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/UpdatingNoticeArticleControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/UpdatingNoticeArticleControllerTest.java index 09f813d69..affa0fcda 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/UpdatingNoticeArticleControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/UpdatingNoticeArticleControllerTest.java @@ -17,8 +17,8 @@ import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.NoticeArticleDao; import com.woowacourse.moamoa.studyroom.service.NoticeArticleService; -import com.woowacourse.moamoa.studyroom.service.exception.ArticleNotFoundException; -import com.woowacourse.moamoa.studyroom.service.exception.UneditableArticleException; +import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; +import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; import java.time.LocalDate; import java.util.Set; diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/StudyRoomTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/StudyRoomTest.java index cf61d9ef4..c55957a33 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/StudyRoomTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/StudyRoomTest.java @@ -4,7 +4,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import com.woowacourse.moamoa.member.domain.Member; -import com.woowacourse.moamoa.studyroom.service.exception.UneditableArticleException; +import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticleTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticleTest.java index 41bddf059..4d6aceca1 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticleTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticleTest.java @@ -7,7 +7,7 @@ import com.woowacourse.moamoa.member.domain.Member; import com.woowacourse.moamoa.studyroom.domain.Accessor; import com.woowacourse.moamoa.studyroom.domain.StudyRoom; -import com.woowacourse.moamoa.studyroom.service.exception.UneditableArticleException; +import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticleTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticleTest.java index 975f585d8..69c5ff2c8 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticleTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticleTest.java @@ -7,7 +7,7 @@ import com.woowacourse.moamoa.member.domain.Member; import com.woowacourse.moamoa.studyroom.domain.Accessor; import com.woowacourse.moamoa.studyroom.domain.StudyRoom; -import com.woowacourse.moamoa.studyroom.service.exception.UneditableArticleException; +import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticleTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticleTest.java index f250ab357..f8068df33 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticleTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticleTest.java @@ -7,7 +7,7 @@ import com.woowacourse.moamoa.member.domain.Member; import com.woowacourse.moamoa.studyroom.domain.Accessor; import com.woowacourse.moamoa.studyroom.domain.StudyRoom; -import com.woowacourse.moamoa.studyroom.service.exception.UneditableArticleException; +import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; From 7b408345cebb81e10f445584c54f92f082d71f44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=A7=84=ED=98=81?= Date: Thu, 15 Sep 2022 17:32:46 +0900 Subject: [PATCH 16/40] =?UTF-8?q?refactor:=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EC=BD=94=EB=93=9C=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../moamoa/common/advice/CommonControllerAdvice.java | 1 - .../domain/exception/UnviewableArticleException.java | 10 ---------- 2 files changed, 11 deletions(-) delete mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/UnviewableArticleException.java diff --git a/backend/src/main/java/com/woowacourse/moamoa/common/advice/CommonControllerAdvice.java b/backend/src/main/java/com/woowacourse/moamoa/common/advice/CommonControllerAdvice.java index 4247b1548..cb1d7fedc 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/common/advice/CommonControllerAdvice.java +++ b/backend/src/main/java/com/woowacourse/moamoa/common/advice/CommonControllerAdvice.java @@ -67,7 +67,6 @@ public ResponseEntity handleNotFound(final Exception e) { @ExceptionHandler(RuntimeException.class) public ResponseEntity handleInternalServerError(RuntimeException e) { log.debug("RuntimeException : {}", e.getMessage()); - e.printStackTrace(); return ResponseEntity.status(INTERNAL_SERVER_ERROR).body(new ErrorResponse("요청을 처리할 수 없습니다.")); } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/UnviewableArticleException.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/UnviewableArticleException.java deleted file mode 100644 index 226af0154..000000000 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/UnviewableArticleException.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.woowacourse.moamoa.studyroom.domain.exception; - -import com.woowacourse.moamoa.common.exception.BadRequestException; - -public class UnviewableArticleException extends BadRequestException { - - public UnviewableArticleException(final Long studyId, final Long articleId) { - super("스터디[" + studyId + "] 에 작성된 게시글[" + articleId + "]을 볼 수 없습니다."); - } -} From 8231c45986584e1f5b834573d7073d1a75f2908c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=A7=84=ED=98=81?= Date: Thu, 15 Sep 2022 17:41:02 +0900 Subject: [PATCH 17/40] =?UTF-8?q?refactor:=20import=20=EB=AC=B8=20?= =?UTF-8?q?=EC=A0=95=EB=A6=AC=20=EB=B0=8F=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20default=20=EC=A0=91=EA=B7=BC?= =?UTF-8?q?=EC=9E=90=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/repository/article/LinkArticleRepository.java | 1 - .../com/woowacourse/moamoa/studyroom/domain/StudyRoomTest.java | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/LinkArticleRepository.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/LinkArticleRepository.java index 5dfbb40d9..135848849 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/LinkArticleRepository.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/LinkArticleRepository.java @@ -1,7 +1,6 @@ package com.woowacourse.moamoa.studyroom.domain.repository.article; import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; -import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; public interface LinkArticleRepository extends JpaRepository { diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/StudyRoomTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/StudyRoomTest.java index c55957a33..0829505f5 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/StudyRoomTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/StudyRoomTest.java @@ -14,7 +14,7 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -public class StudyRoomTest { +class StudyRoomTest { @ParameterizedTest @DisplayName("스터디에 참여한 참가자는 커뮤니티 게시글을 작성할 수 있다.") From 689fbf6bced4e6aa025fc424e3638054483c2f8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=A7=84=ED=98=81?= Date: Thu, 15 Sep 2022 17:43:22 +0900 Subject: [PATCH 18/40] =?UTF-8?q?chore:=20index.html=20gitignore=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/.gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/.gitignore b/backend/.gitignore index f2415eb0c..9a3f047ea 100644 --- a/backend/.gitignore +++ b/backend/.gitignore @@ -39,3 +39,4 @@ out/ /src/main/resources/application-security.yml /src/test/resources/application-security.yml /src/main/resources/static/docs/index.html +/src/docs/asciidoc/index.html From d736fa460c85c2fa052af046fb55b429efcabc03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=A7=84=ED=98=81?= Date: Thu, 15 Sep 2022 17:46:50 +0900 Subject: [PATCH 19/40] =?UTF-8?q?chore:=20gitignore=20=EC=9E=AC=EC=84=A4?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/src/docs/asciidoc/index.html | 893 --------------------------- 1 file changed, 893 deletions(-) delete mode 100644 backend/src/docs/asciidoc/index.html diff --git a/backend/src/docs/asciidoc/index.html b/backend/src/docs/asciidoc/index.html deleted file mode 100644 index 49f546864..000000000 --- a/backend/src/docs/asciidoc/index.html +++ /dev/null @@ -1,893 +0,0 @@ - - - - - - - -MOAMOA - - - - - - -
-
-

인증

-
-
-

Github 로그인

-
-

HTTP request

-
-
-
POST /api/auth/login?code=authorization-code HTTP/1.1
-Content-Type: application/json
-Accept: application/json
-Host: localhost:8080
-
-
-
-
-

HTTP response

-
-
-
HTTP/1.1 200 OK
-Vary: Origin
-Vary: Access-Control-Request-Method
-Vary: Access-Control-Request-Headers
-Content-Type: application/json
-Content-Length: 28
-
-{
-  "token" : "JWT 토큰"
-}
-
-
-
-
-
-
-
-

스터디

-
-
-

스터디 생성

-
-

HTTP request

-
-
-
POST /api/studies HTTP/1.1
-Content-Type: application/json
-Authorization: Bearer header.payload.signature
-Accept: application/json
-Content-Length: 338
-Host: localhost:8080
-
-{
-  "title" : "신짱구의 자바의 정석",
-  "excerpt" : "자바 스터디 요약",
-  "thumbnail" : "자바 스터디 썸네일",
-  "description" : "자바 스터디 설명입니다.",
-  "maxMemberCount" : "10",
-  "startDate" : "2022-09-04",
-  "enrollmentEndDate" : "2022-08-04",
-  "endDate" : "2022-10-04",
-  "tagIds" : [ 1, 2, 3 ]
-}
-
-
-
-
-

HTTP response

-
-
-
HTTP/1.1 201 Created
-Vary: Origin
-Vary: Access-Control-Request-Method
-Vary: Access-Control-Request-Headers
-Location: /api/studies/null
-
-
-
-
-
-

스터디 목록 조회

-
-

HTTP request

-
-
-
GET /api/studies?page=0&size=2 HTTP/1.1
-Content-Type: application/json
-Accept: application/json
-Host: localhost:8080
-
-
-
-
-

HTTP response

-
-
-
HTTP/1.1 200 OK
-Vary: Origin
-Vary: Access-Control-Request-Method
-Vary: Access-Control-Request-Headers
-Content-Type: application/json
-Content-Length: 773
-
-{
-  "studies" : [ {
-    "id" : 1,
-    "title" : "신짱구의 자바의 정석",
-    "excerpt" : "자바 스터디 요약",
-    "thumbnail" : "자바 스터디 썸네일",
-    "recruitmentStatus" : "RECRUITMENT_START",
-    "tags" : [ {
-      "id" : 1,
-      "name" : "Java"
-    }, {
-      "id" : 2,
-      "name" : "4기"
-    }, {
-      "id" : 3,
-      "name" : "BE"
-    } ]
-  }, {
-    "id" : 2,
-    "title" : "디우의 이것이 리액트다.",
-    "excerpt" : "리액트 스터디 요약",
-    "thumbnail" : "리액트 스터디 썸네일",
-    "recruitmentStatus" : "RECRUITMENT_START",
-    "tags" : [ {
-      "id" : 2,
-      "name" : "4기"
-    }, {
-      "id" : 4,
-      "name" : "FE"
-    }, {
-      "id" : 5,
-      "name" : "React"
-    } ]
-  } ],
-  "hasNext" : true
-}
-
-
-
-
-
-
-
-

리뷰

-
-
-

리뷰 작성

-
-

HTTP request

-
-
-
POST /api/studies/1/reviews HTTP/1.1
-Content-Type: application/json
-Authorization: Bearer header.payload.signature
-Accept: application/json
-Content-Length: 53
-Host: localhost:8080
-
-{
-  "content" : "작성할 후기 내용입니다."
-}
-
-
-
-
-

HTTP response

-
-
-
HTTP/1.1 201 Created
-Vary: Origin
-Vary: Access-Control-Request-Method
-Vary: Access-Control-Request-Headers
-Location: /api/studies/1/reviews/1
-
-
-
-
-
-

리뷰 전체 조회

-
-

HTTP request

-
-
-
GET /api/studies/1/reviews HTTP/1.1
-Content-Type: application/json
-Accept: application/json
-Host: localhost:8080
-
-
-
-
-

HTTP response

-
-
-
HTTP/1.1 200 OK
-Vary: Origin
-Vary: Access-Control-Request-Method
-Vary: Access-Control-Request-Headers
-Content-Type: application/json
-Content-Length: 1279
-
-{
-  "reviews" : [ {
-    "id" : 1,
-    "member" : {
-      "username" : "jjanggu",
-      "imageUrl" : "https://jjanggu.png",
-      "profileUrl" : "https://jjanggu.com",
-      "id" : 1
-    },
-    "createdDate" : "2022-10-09",
-    "lastModifiedDate" : "2022-10-09",
-    "content" : "자바 스터디 첫 번째 리뷰입니다."
-  }, {
-    "id" : 2,
-    "member" : {
-      "username" : "verus",
-      "imageUrl" : "https://verus.png",
-      "profileUrl" : "https://verus.com",
-      "id" : 4
-    },
-    "createdDate" : "2022-10-09",
-    "lastModifiedDate" : "2022-10-10",
-    "content" : "자바 스터디 두 번째 리뷰입니다."
-  }, {
-    "id" : 3,
-    "member" : {
-      "username" : "greenlawn",
-      "imageUrl" : "https://greenlawn.png",
-      "profileUrl" : "https://greenlawn.com",
-      "id" : 2
-    },
-    "createdDate" : "2022-10-10",
-    "lastModifiedDate" : "2022-10-10",
-    "content" : "자바 스터디 세 번째 리뷰입니다."
-  }, {
-    "id" : 4,
-    "member" : {
-      "username" : "dwoo",
-      "imageUrl" : "https://dwoo.png",
-      "profileUrl" : "https://dwoo.com",
-      "id" : 3
-    },
-    "createdDate" : "2022-10-14",
-    "lastModifiedDate" : "2022-10-15",
-    "content" : "자바 스터디 네 번째 리뷰입니다."
-  } ],
-  "totalCount" : 4
-}
-
-
-
-
-
-

리뷰 특정 개수 조회

-
-

HTTP request

-
-
-
GET /api/studies/1/reviews?size=2 HTTP/1.1
-Content-Type: application/json
-Accept: application/json
-Host: localhost:8080
-
-
-
-
-

HTTP response

-
-
-
HTTP/1.1 200 OK
-Vary: Origin
-Vary: Access-Control-Request-Method
-Vary: Access-Control-Request-Headers
-Content-Type: application/json
-Content-Length: 658
-
-{
-  "reviews" : [ {
-    "id" : 1,
-    "member" : {
-      "username" : "jjanggu",
-      "imageUrl" : "https://jjanggu.png",
-      "profileUrl" : "https://jjanggu.com",
-      "id" : 1
-    },
-    "createdDate" : "2022-10-09",
-    "lastModifiedDate" : "2022-10-09",
-    "content" : "자바 스터디 첫 번째 리뷰입니다."
-  }, {
-    "id" : 2,
-    "member" : {
-      "username" : "verus",
-      "imageUrl" : "https://verus.png",
-      "profileUrl" : "https://verus.com",
-      "id" : 4
-    },
-    "createdDate" : "2022-10-09",
-    "lastModifiedDate" : "2022-10-10",
-    "content" : "자바 스터디 두 번째 리뷰입니다."
-  } ],
-  "totalCount" : 4
-}
-
-
-
-
-
-

스터디에서 사용자 역할 조회

-
-

HTTP request

-
-
-
GET /api/members/me/role?study-id=3 HTTP/1.1
-Content-Type: application/json
-Authorization: Bearer header.payload.signature
-Accept: application/json
-Host: localhost:8080
-
-
-
-
---- - - - - - - - - - - - - -
NameDescription

Authorization

Bearer Token

-
-
-

Request parameters

- ---- - - - - - - - - - - - - -
ParameterDescription

study-id

스터디 ID

-
-
-

HTTP response

-
-
-
HTTP/1.1 200 OK
-Vary: Origin
-Vary: Access-Control-Request-Method
-Vary: Access-Control-Request-Headers
-Content-Type: application/json
-Content-Length: 23
-
-{
-  "role" : "MEMBER"
-}
-
-
-
-
-

Response fields

- ----- - - - - - - - - - - - - - - -
PathTypeDescription

role

String

해당 스터디에서 사용자의 역할

-
-
-
-
-
- - - - - From 99165a2822e796d5006ff7d30978b1b8eb8426ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=A7=84=ED=98=81?= Date: Thu, 15 Sep 2022 17:51:11 +0900 Subject: [PATCH 20/40] =?UTF-8?q?chore:=20=EA=B3=B5=EC=A7=80=20=EA=B2=8C?= =?UTF-8?q?=EC=8B=9C=EA=B8=80=20API=20=EB=AC=B8=EC=84=9C=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/src/docs/asciidoc/index.adoc | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/backend/src/docs/asciidoc/index.adoc b/backend/src/docs/asciidoc/index.adoc index 5c2baaafc..3c2624646 100644 --- a/backend/src/docs/asciidoc/index.adoc +++ b/backend/src/docs/asciidoc/index.adoc @@ -75,6 +75,23 @@ operation::article/update[snippets='http-request,request-headers,http-response'] === 커뮤니티 삭제 operation::article/delete[snippets='http-request,request-headers,http-response'] +[[Notice]] +== 공지 게시글 +=== 공지 생성 +operation::write/notice[snippets='http-request,request-headers,request-fields,http-response'] + +=== 공지 단건 조회 +operation::get/notice[snippets='http-request,request-headers,http-response,response-fields'] + +=== 공지 전체 조회 +operation::get/notices[snippets='http-request,request-headers,http-response,response-fields'] + +=== 공지 수정 +operation::update/notice[snippets='http-request,request-headers,http-response'] + +=== 공지 삭제 +operation::delete/notice[snippets='http-request,request-headers,http-response'] + [[Reference-Room]] == 링크 공유 From 452e356ce91c584bc8dd74a82563b32ffbc1c617 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=A7=84=ED=98=81?= Date: Thu, 15 Sep 2022 16:41:14 +0900 Subject: [PATCH 21/40] =?UTF-8?q?refactor:=20=EC=A0=9C=EB=84=A4=EB=A6=AD?= =?UTF-8?q?=EC=9D=84=20=EC=82=AC=EC=9A=A9=ED=95=9C=20ArticleService=20?= =?UTF-8?q?=EC=B6=94=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../moamoa/study/query/StudySummaryDao.java | 1 - .../config/ArticleServiceConfig.java | 20 +++++++ .../controller/LinkArticleController.java | 18 ++++-- .../moamoa/studyroom/domain/StudyRoom.java | 7 ++- .../studyroom/domain/article/Article.java | 10 ++++ .../studyroom/domain/article/Content.java | 9 +++ .../studyroom/domain/article/LinkArticle.java | 31 +++++----- .../studyroom/domain/article/LinkContent.java | 41 +++++++++++++ .../studyroom/service/ArticleService.java | 57 +++++++++++++++++++ .../studyroom/service/LinkArticleService.java | 6 +- .../request/AbstractArticleRequest.java | 9 +++ .../service/request/LinkArticleRequest.java | 8 ++- .../com/woowacourse/moamoa/WebMVCTest.java | 6 ++ .../controller/LinkArticleControllerTest.java | 8 ++- .../studyroom/domain/StudyRoomTest.java | 5 +- .../domain/article/LinkArticleTest.java | 12 ++-- 16 files changed, 211 insertions(+), 37 deletions(-) create mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/config/ArticleServiceConfig.java create mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java create mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Content.java create mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkContent.java create mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ArticleService.java create mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/AbstractArticleRequest.java diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/query/StudySummaryDao.java b/backend/src/main/java/com/woowacourse/moamoa/study/query/StudySummaryDao.java index 1a81dbed8..86afe2681 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/query/StudySummaryDao.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/query/StudySummaryDao.java @@ -35,7 +35,6 @@ public Slice searchBy(final String title, final SearchingTags final List data = jdbcTemplate .query(sql(searchingTags), params(title, searchingTags, pageable), STUDY_ROW_MAPPER); return new SliceImpl<>(getCurrentPageStudies(data, pageable), pageable, hasNext(data, pageable)); - } private String sql(final SearchingTags searchingTags) { diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/config/ArticleServiceConfig.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/config/ArticleServiceConfig.java new file mode 100644 index 000000000..a5ebc4ce5 --- /dev/null +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/config/ArticleServiceConfig.java @@ -0,0 +1,20 @@ +package com.woowacourse.moamoa.studyroom.config; + +import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; +import com.woowacourse.moamoa.studyroom.domain.article.LinkContent; +import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; +import com.woowacourse.moamoa.studyroom.service.ArticleService; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.jpa.repository.JpaRepository; + +@Configuration +public class ArticleServiceConfig { + + @Bean + public ArticleService linkGenericArticleService( + StudyRoomRepository studyRoomRepository, JpaRepository articleRepository + ) { + return new ArticleService<>(studyRoomRepository, articleRepository); + } +} diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleController.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleController.java index 65d80aaf2..c1b33267e 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleController.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleController.java @@ -1,12 +1,14 @@ package com.woowacourse.moamoa.studyroom.controller; import com.woowacourse.moamoa.auth.config.AuthenticatedMemberId; +import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; +import com.woowacourse.moamoa.studyroom.domain.article.LinkContent; +import com.woowacourse.moamoa.studyroom.service.ArticleService; import com.woowacourse.moamoa.studyroom.service.LinkArticleService; import com.woowacourse.moamoa.studyroom.service.request.LinkArticleRequest; import com.woowacourse.moamoa.studyroom.service.response.LinksResponse; import java.net.URI; import javax.validation.Valid; -import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Pageable; import org.springframework.data.web.PageableDefault; import org.springframework.http.ResponseEntity; @@ -21,10 +23,16 @@ @RestController @RequestMapping("/api/studies/{study-id}/reference-room/links") -@RequiredArgsConstructor public class LinkArticleController { private final LinkArticleService linkArticleService; + private final ArticleService articleService; + + public LinkArticleController(final LinkArticleService linkArticleService, + final ArticleService articleService) { + this.linkArticleService = linkArticleService; + this.articleService = articleService; + } @GetMapping public ResponseEntity getLinks( @@ -41,7 +49,7 @@ public ResponseEntity createLink( @PathVariable("study-id") final Long studyId, @Valid @RequestBody final LinkArticleRequest linkArticleRequest ) { - final Long id = linkArticleService.createLink(memberId, studyId, linkArticleRequest).getId(); + final Long id = articleService.createArticle(memberId, studyId, linkArticleRequest).getId(); return ResponseEntity.created(URI.create("/api/studies/" + studyId + "/reference-room/links/" + id)).build(); } @@ -52,7 +60,7 @@ public ResponseEntity updateLink( @PathVariable("link-id") final Long linkId, @Valid @RequestBody final LinkArticleRequest linkArticleRequest ) { - linkArticleService.updateLink(memberId, studyId, linkId, linkArticleRequest); + articleService.updateArticle(memberId, studyId, linkId, linkArticleRequest); return ResponseEntity.noContent().build(); } @@ -62,7 +70,7 @@ public ResponseEntity deleteLink( @PathVariable("study-id") final Long studyId, @PathVariable("link-id") final Long linkId ) { - linkArticleService.deleteLink(memberId, studyId, linkId); + articleService.deleteArticle(memberId, studyId, linkId); return ResponseEntity.noContent().build(); } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/StudyRoom.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/StudyRoom.java index 7578d62e1..d373712a4 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/StudyRoom.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/StudyRoom.java @@ -1,8 +1,11 @@ package com.woowacourse.moamoa.studyroom.domain; +import com.woowacourse.moamoa.studyroom.domain.article.Article; import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; import com.woowacourse.moamoa.studyroom.domain.article.CommunityArticle; +import com.woowacourse.moamoa.studyroom.domain.article.Content; import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; +import com.woowacourse.moamoa.studyroom.domain.article.LinkContent; import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; import java.util.Objects; @@ -56,9 +59,9 @@ public NoticeArticle writeNoticeArticle(final Accessor accessor, final String ti throw new UneditableArticleException(studyId, accessor, ArticleType.NOTICE); } - public LinkArticle writeLinkArticle(final Accessor accessor, final String linkUrl, final String description) { + public LinkArticle writeLinkArticle(final Accessor accessor, final LinkContent content) { if (isPermittedAccessor(accessor)) { - return new LinkArticle(this, accessor.getMemberId(), linkUrl, description); + return new LinkArticle(this, accessor.getMemberId(), content); } throw new UneditableArticleException(studyId, accessor, ArticleType.LINK); diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java new file mode 100644 index 000000000..357b8cae8 --- /dev/null +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java @@ -0,0 +1,10 @@ +package com.woowacourse.moamoa.studyroom.domain.article; + +import com.woowacourse.moamoa.studyroom.domain.Accessor; + +public interface Article>> { + + void update(final Accessor accessor, final T content); + + void delete(final Accessor accessor); +} diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Content.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Content.java new file mode 100644 index 000000000..306bd8cf4 --- /dev/null +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Content.java @@ -0,0 +1,9 @@ +package com.woowacourse.moamoa.studyroom.domain.article; + +import com.woowacourse.moamoa.studyroom.domain.Accessor; +import com.woowacourse.moamoa.studyroom.domain.StudyRoom; + +public interface Content>> { + + A createArticle(StudyRoom studyRoom, Accessor accessor); +} diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticle.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticle.java index 0c5bf9808..3a5cc00e9 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticle.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticle.java @@ -5,6 +5,7 @@ import com.woowacourse.moamoa.studyroom.domain.StudyRoom; import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; import javax.persistence.Column; +import javax.persistence.Embedded; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; @@ -21,7 +22,7 @@ @Table(name = "link") @NoArgsConstructor(access = AccessLevel.PROTECTED) @Where(clause = "deleted = false") -public class LinkArticle extends BaseEntity { +public class LinkArticle extends BaseEntity implements Article{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -34,37 +35,33 @@ public class LinkArticle extends BaseEntity { @Column(name = "member_id", nullable = false) private Long authorId; - @Column(nullable = false) - private String linkUrl; - - private String description; + @Embedded + private LinkContent content; @Column(nullable = false) private boolean deleted; - public LinkArticle(final StudyRoom studyRoom, final Long authorId, final String linkUrl, final String description) { - this(null, studyRoom, authorId, linkUrl, description, false); + public LinkArticle(final StudyRoom studyRoom, final Long authorId, final LinkContent content) { + this(null, studyRoom, authorId, content); } - private LinkArticle(final Long id, final StudyRoom studyRoom, final Long authorId, final String linkUrl, - final String description, final boolean deleted) { + private LinkArticle(final Long id, final StudyRoom studyRoom, final Long authorId, final LinkContent content) { this.id = id; this.studyRoom = studyRoom; this.authorId = authorId; - this.linkUrl = linkUrl; - this.description = description; - this.deleted = deleted; + this.content = content; + this.deleted = false; } - public void update(final Accessor accessor, final String linkUrl, final String description) { + public void update(final Accessor accessor, final LinkContent content) { if (!studyRoom.isPermittedAccessor(accessor) || !authorId.equals(accessor.getMemberId())) { throw new UneditableArticleException(studyRoom.getId(), accessor, ArticleType.LINK); } - this.linkUrl = linkUrl; - this.description = description; + this.content = content; } + @Override public void delete(final Accessor accessor) { if (!studyRoom.isPermittedAccessor(accessor) || !authorId.equals(accessor.getMemberId())) { throw new UneditableArticleException(studyRoom.getId(), accessor, ArticleType.LINK); @@ -78,11 +75,11 @@ public Long getId() { } public String getLinkUrl() { - return linkUrl; + return content.getLinkUrl(); } public String getDescription() { - return description; + return content.getDescription(); } public boolean isDeleted() { diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkContent.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkContent.java new file mode 100644 index 000000000..83fd099d5 --- /dev/null +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkContent.java @@ -0,0 +1,41 @@ +package com.woowacourse.moamoa.studyroom.domain.article; + +import com.woowacourse.moamoa.studyroom.domain.Accessor; +import com.woowacourse.moamoa.studyroom.domain.StudyRoom; +import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; +import javax.persistence.Column; +import javax.persistence.Embeddable; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +@Embeddable +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class LinkContent implements Content { + + @Column(nullable = false) + private String linkUrl; + + private String description; + + public LinkContent(final String linkUrl, final String description) { + this.linkUrl = linkUrl; + this.description = description; + } + + public String getLinkUrl() { + return linkUrl; + } + + public String getDescription() { + return description; + } + + @Override + public LinkArticle createArticle(final StudyRoom studyRoom, final Accessor accessor) { + if (studyRoom.isPermittedAccessor(accessor)) { + return new LinkArticle(studyRoom, accessor.getMemberId(), this); + } + + throw new UneditableArticleException(studyRoom.getId(), accessor, ArticleType.LINK); + } +} diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ArticleService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ArticleService.java new file mode 100644 index 000000000..634bb001f --- /dev/null +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ArticleService.java @@ -0,0 +1,57 @@ +package com.woowacourse.moamoa.studyroom.service; + +import com.woowacourse.moamoa.study.service.exception.StudyNotFoundException; +import com.woowacourse.moamoa.studyroom.domain.Accessor; +import com.woowacourse.moamoa.studyroom.domain.StudyRoom; +import com.woowacourse.moamoa.studyroom.domain.article.Article; +import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; +import com.woowacourse.moamoa.studyroom.domain.article.Content; +import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; +import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; +import com.woowacourse.moamoa.studyroom.service.request.AbstractArticleRequest; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.transaction.annotation.Transactional; + +@Transactional +public class ArticleService, C extends Content> { + + private final StudyRoomRepository studyRoomRepository; + private final JpaRepository articleRepository; + + public ArticleService( + final StudyRoomRepository studyRoomRepository, final JpaRepository articleRepository + ) { + this.studyRoomRepository = studyRoomRepository; + this.articleRepository = articleRepository; + } + + public A createArticle( + final Long memberId, final Long studyId, final AbstractArticleRequest articleRequest + ) { + final StudyRoom studyRoom = studyRoomRepository.findByStudyId(studyId) + .orElseThrow(StudyNotFoundException::new); + + final C content = articleRequest.mapToContent(); + final A article = content.createArticle(studyRoom, new Accessor(memberId, studyId)); + + return articleRepository.save(article); + } + + public void updateArticle( + final Long memberId, final Long studyId, final Long articleId, final AbstractArticleRequest articleRequest + ) { + final A article = articleRepository.findById(articleId) + .orElseThrow(() -> new ArticleNotFoundException(articleId, ArticleType.LINK)); + + article.update(new Accessor(memberId, studyId), articleRequest.mapToContent()); + } + + public void deleteArticle(final Long memberId, final Long studyId, final Long articleId) { + final A article = articleRepository.findById(articleId) + .orElseThrow(() -> new ArticleNotFoundException(articleId, ArticleType.LINK)); + + final Accessor accessor = new Accessor(memberId, studyId); + + article.delete(accessor); + } +} diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java index b13018d48..ac6d1f742 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java @@ -5,6 +5,7 @@ import com.woowacourse.moamoa.studyroom.domain.StudyRoom; import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; +import com.woowacourse.moamoa.studyroom.domain.article.LinkContent; import com.woowacourse.moamoa.studyroom.domain.repository.article.LinkArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.LinkArticleDao; @@ -40,7 +41,8 @@ public LinkArticle createLink( final StudyRoom studyRoom = studyRoomRepository.findByStudyId(studyId) .orElseThrow(StudyNotFoundException::new); final LinkArticle linkArticle = studyRoom.writeLinkArticle( - new Accessor(memberId, studyId), linkArticleRequest.getLinkUrl(), linkArticleRequest.getDescription()); + new Accessor(memberId, studyId), + new LinkContent(linkArticleRequest.getLinkUrl(), linkArticleRequest.getDescription())); return linkArticleRepository.save(linkArticle); } @@ -55,7 +57,7 @@ public void updateLink( final String linkUrl = linkArticleRequest.getLinkUrl(); final String description = linkArticleRequest.getDescription(); - linkArticle.update(accessor, linkUrl, description); + linkArticle.update(accessor, new LinkContent(linkUrl, description)); } public void deleteLink(final Long memberId, final Long studyId, final Long articleId) { diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/AbstractArticleRequest.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/AbstractArticleRequest.java new file mode 100644 index 000000000..97ebfc418 --- /dev/null +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/AbstractArticleRequest.java @@ -0,0 +1,9 @@ +package com.woowacourse.moamoa.studyroom.service.request; + +import com.woowacourse.moamoa.studyroom.domain.article.Article; +import com.woowacourse.moamoa.studyroom.domain.article.Content; + +public interface AbstractArticleRequest>> { + + T mapToContent(); +} diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/LinkArticleRequest.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/LinkArticleRequest.java index 65db9795a..32735f056 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/LinkArticleRequest.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/LinkArticleRequest.java @@ -1,5 +1,6 @@ package com.woowacourse.moamoa.studyroom.service.request; +import com.woowacourse.moamoa.studyroom.domain.article.LinkContent; import javax.validation.constraints.NotBlank; import javax.validation.constraints.Size; import lombok.AllArgsConstructor; @@ -9,7 +10,7 @@ @NoArgsConstructor @AllArgsConstructor @Getter -public class LinkArticleRequest { +public class LinkArticleRequest implements AbstractArticleRequest{ @NotBlank(message = "공유할 링크 URL을 입력해 주세요.") @Size(max = 500, message = "링크 URL은 500자를 초과할 수 없습니다.") @@ -17,4 +18,9 @@ public class LinkArticleRequest { @Size(max = 40, message = "설명은 40자를 초과할 수 없습니다.") private String description; + + @Override + public LinkContent mapToContent() { + return new LinkContent(linkUrl, description); + } } diff --git a/backend/src/test/java/com/woowacourse/moamoa/WebMVCTest.java b/backend/src/test/java/com/woowacourse/moamoa/WebMVCTest.java index 7db3df9f8..36c9aec70 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/WebMVCTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/WebMVCTest.java @@ -11,6 +11,9 @@ import com.woowacourse.moamoa.common.MockedServiceObjectsBeanRegister; import com.woowacourse.moamoa.member.domain.Member; import com.woowacourse.moamoa.member.domain.repository.MemberRepository; +import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; +import com.woowacourse.moamoa.studyroom.domain.article.LinkContent; +import com.woowacourse.moamoa.studyroom.service.ArticleService; import java.util.Optional; import javax.servlet.http.HttpServletRequest; import org.junit.jupiter.api.BeforeEach; @@ -49,6 +52,9 @@ public abstract class WebMVCTest { @MockBean protected NativeWebRequest nativeWebRequest; + @MockBean + protected ArticleService articleService; + @BeforeEach void setUp() { when(memberRepository.findByGithubId(any())) diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java index 2cc864e3b..96b071d29 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java @@ -16,6 +16,7 @@ import com.woowacourse.moamoa.studyroom.domain.repository.article.LinkArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.LinkArticleDao; +import com.woowacourse.moamoa.studyroom.service.ArticleService; import com.woowacourse.moamoa.studyroom.service.LinkArticleService; import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; @@ -26,6 +27,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.jpa.repository.JpaRepository; @RepositoryTest class LinkArticleControllerTest { @@ -42,6 +44,9 @@ class LinkArticleControllerTest { @Autowired private LinkArticleRepository linkArticleRepository; + @Autowired + private JpaRepository articleRepository; + @Autowired private LinkArticleDao linkArticleDao; @@ -58,7 +63,8 @@ void setUp() { linkArticleService = new LinkArticleService(studyRoomRepository, linkArticleRepository, linkArticleDao); studyService = new StudyService(studyRepository, memberRepository, new DateTimeSystem()); - sut = new LinkArticleController(linkArticleService); + sut = new LinkArticleController(linkArticleService, + new ArticleService<>(studyRoomRepository, articleRepository)); } @DisplayName("스터디에 참여하지 않은 회원은 링크 공유를 할 수 없다.") diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/StudyRoomTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/StudyRoomTest.java index 0829505f5..b88b7bc44 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/StudyRoomTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/StudyRoomTest.java @@ -5,6 +5,7 @@ import com.woowacourse.moamoa.member.domain.Member; import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; +import com.woowacourse.moamoa.studyroom.domain.article.LinkContent; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -98,7 +99,7 @@ void writeLinkArticleByAccessibleAccessor(final Accessor accessor) { final StudyRoom studyRoom = createStudyRoom(1L, owner, participant); // act & assert - assertThatCode(() -> studyRoom.writeLinkArticle(accessor, "link url", "설명")) + assertThatCode(() -> studyRoom.writeLinkArticle(accessor, new LinkContent("link url", "설명"))) .doesNotThrowAnyException(); } @@ -118,7 +119,7 @@ void cantWriteLinkArticleByNonAccessibleAccessor(final Accessor accessor) { final StudyRoom studyRoom = createStudyRoom(1L, owner); // act & assert - assertThatThrownBy(() -> studyRoom.writeLinkArticle(accessor, "link url", "설명")) + assertThatThrownBy(() -> studyRoom.writeLinkArticle(accessor, new LinkContent("link url", "설명"))) .isInstanceOf(UneditableArticleException.class); } diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticleTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticleTest.java index 69c5ff2c8..c59a4fbf8 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticleTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticleTest.java @@ -25,10 +25,10 @@ void update() { final Member owner = createMember(1L); final StudyRoom studyRoom = createStudyRoom(1L, owner); final Accessor accessor = new Accessor(owner.getId(), studyRoom.getId()); - final LinkArticle sut = studyRoom.writeLinkArticle(accessor, "link", "설명"); + final LinkArticle sut = studyRoom.writeLinkArticle(accessor, new LinkContent("link", "설명")); // act - sut.update(accessor, "updated link", "수정된 설명"); + sut.update(accessor, new LinkContent("updated link", "수정된 설명")); // assert assertAll( @@ -44,9 +44,9 @@ void updateByNotAuthor(final long memberId, final long studyId) { final Member owner = createMember(1L); final StudyRoom studyRoom = createStudyRoom(1L, owner); final LinkArticle sut = studyRoom.writeLinkArticle(new Accessor(owner.getId(), studyRoom.getId()), - "link", "설명"); + new LinkContent("link", "설명")); - assertThatThrownBy(() -> sut.update(new Accessor(memberId, studyId), "updated link", "수정된 설명")) + assertThatThrownBy(() -> sut.update(new Accessor(memberId, studyId), new LinkContent("updated link", "수정된 설명"))) .isInstanceOf(UneditableArticleException.class); } @@ -57,7 +57,7 @@ void delete() { final StudyRoom studyRoom = createStudyRoom(1L, owner); final LinkArticle linkArticle = studyRoom.writeLinkArticle(new Accessor(owner.getId(), studyRoom.getId()), - "link", "설명"); + new LinkContent("link", "설명")); linkArticle.delete(new Accessor(1L, 1L)); @@ -72,7 +72,7 @@ void deleteByNotAuthor(final long memberId, final long studyId) { final StudyRoom studyRoom = createStudyRoom(1L, owner); final LinkArticle linkArticle = studyRoom.writeLinkArticle(new Accessor(owner.getId(), studyRoom.getId()), - "link", "설명"); + new LinkContent("link", "설명")); assertThatThrownBy(() -> linkArticle.delete(new Accessor(memberId, studyId))) .isInstanceOf(UneditableArticleException.class); From 14b3f7fe59cf40a33a7179540d2bd4bb522b8d3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=A7=84=ED=98=81?= Date: Thu, 15 Sep 2022 23:29:27 +0900 Subject: [PATCH 22/40] =?UTF-8?q?refactor:=20CommunityArticle=EC=97=90=20?= =?UTF-8?q?=EC=A0=9C=EB=84=A4=EB=A6=AD=20ArticleService=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/ArticleServiceConfig.java | 9 ++ .../CommunityArticleController.java | 20 ++- .../controller/LinkArticleController.java | 8 +- .../controller/NoticeArticleController.java | 6 +- .../moamoa/studyroom/domain/StudyRoom.java | 19 +-- .../domain/article/CommunityArticle.java | 44 ++---- .../domain/article/CommunityContent.java | 60 ++++++++ .../studyroom/service/ArticleService.java | 10 +- .../service/CommunityArticleService.java | 47 +----- .../studyroom/service/LinkArticleService.java | 53 +------ .../service/NoticeArticleService.java | 6 +- .../request/AbstractArticleRequest.java | 9 -- .../service/request/ArticleRequest.java | 23 +-- .../request/CommunityArticleRequest.java | 30 ++++ .../service/request/LinkArticleRequest.java | 4 +- .../acceptance/steps/StudyRelatedSteps.java | 8 +- .../CommunityArticleAcceptanceTest.java | 6 +- .../studyroom/LinkArticleAcceptanceTest.java | 8 +- .../test/studyroom/NoticeAcceptanceTest.java | 6 +- .../com/woowacourse/moamoa/WebMVCTest.java | 7 +- .../DeletingNoticeArticleControllerTest.java | 6 +- ...mmunityArticleSummariesControllerTest.java | 13 +- .../GettingNoticeArticleControllerTest.java | 4 +- .../controller/LinkArticleControllerTest.java | 26 ++-- .../NoticeArticleControllerTest.java | 9 +- .../UpdatingNoticeArticleControllerTest.java | 12 +- .../studyroom/domain/StudyRoomTest.java | 81 ---------- .../domain/article/CommunityArticleTest.java | 25 ++- .../domain/article/CommunityContentTest.java | 71 +++++++++ .../domain/article/LinkArticleTest.java | 23 ++- .../domain/article/LinkContentTest.java | 75 +++++++++ .../studyroom/service/ArticleServiceTest.java | 144 ++++++++++++++++++ ...tingNoticeArticleControllerWebMvcTest.java | 14 +- ...tingNoticeArticleControllerWebMvcTest.java | 14 +- 34 files changed, 529 insertions(+), 371 deletions(-) create mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityContent.java delete mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/AbstractArticleRequest.java create mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/CommunityArticleRequest.java create mode 100644 backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityContentTest.java create mode 100644 backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/LinkContentTest.java create mode 100644 backend/src/test/java/com/woowacourse/moamoa/studyroom/service/ArticleServiceTest.java diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/config/ArticleServiceConfig.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/config/ArticleServiceConfig.java index a5ebc4ce5..5b54a4237 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/config/ArticleServiceConfig.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/config/ArticleServiceConfig.java @@ -1,5 +1,7 @@ package com.woowacourse.moamoa.studyroom.config; +import com.woowacourse.moamoa.studyroom.domain.article.CommunityArticle; +import com.woowacourse.moamoa.studyroom.domain.article.CommunityContent; import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; import com.woowacourse.moamoa.studyroom.domain.article.LinkContent; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; @@ -17,4 +19,11 @@ public ArticleService linkGenericArticleService( ) { return new ArticleService<>(studyRoomRepository, articleRepository); } + + @Bean + public ArticleService communityGenericArticleService( + StudyRoomRepository studyRoomRepository, JpaRepository articleRepository + ) { + return new ArticleService<>(studyRoomRepository, articleRepository); + } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/CommunityArticleController.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/CommunityArticleController.java index e852190ab..3124c75b9 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/CommunityArticleController.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/CommunityArticleController.java @@ -2,8 +2,10 @@ import com.woowacourse.moamoa.auth.config.AuthenticatedMemberId; import com.woowacourse.moamoa.studyroom.domain.article.CommunityArticle; +import com.woowacourse.moamoa.studyroom.domain.article.CommunityContent; +import com.woowacourse.moamoa.studyroom.service.ArticleService; import com.woowacourse.moamoa.studyroom.service.CommunityArticleService; -import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; +import com.woowacourse.moamoa.studyroom.service.request.CommunityArticleRequest; import com.woowacourse.moamoa.studyroom.service.response.ArticleResponse; import com.woowacourse.moamoa.studyroom.service.response.ArticleSummariesResponse; import java.net.URI; @@ -27,16 +29,20 @@ public class CommunityArticleController { private final CommunityArticleService communityArticleService; - public CommunityArticleController(final CommunityArticleService communityArticleService) { + private final ArticleService articleService; + + public CommunityArticleController(final CommunityArticleService communityArticleService, + final ArticleService articleService) { this.communityArticleService = communityArticleService; + this.articleService = articleService; } @PostMapping public ResponseEntity createArticle(@AuthenticatedMemberId final Long id, @PathVariable("study-id") final Long studyId, - @Valid @RequestBody final ArticleRequest request + @Valid @RequestBody final CommunityArticleRequest request ) { - final CommunityArticle article = communityArticleService.createArticle(id, studyId, request); + final CommunityArticle article = articleService.createArticle(id, studyId, request); final URI location = URI.create("/api/studies/" + studyId + "/community/articles/" + article.getId()); return ResponseEntity.created(location).header("Access-Control-Allow-Headers", HttpHeaders.LOCATION).build(); } @@ -52,7 +58,7 @@ public ResponseEntity deleteArticle(@AuthenticatedMemberId final Long id, @PathVariable("study-id") final Long studyId, @PathVariable("article-id") final Long articleId ) { - communityArticleService.deleteArticle(id, studyId, articleId); + articleService.deleteArticle(id, studyId, articleId); return ResponseEntity.noContent().build(); } @@ -68,9 +74,9 @@ public ResponseEntity getArticles( public ResponseEntity updateArticle(@AuthenticatedMemberId final Long id, @PathVariable("study-id") final Long studyId, @PathVariable("article-id") final Long articleId, - @Valid @RequestBody final ArticleRequest request + @Valid @RequestBody final CommunityArticleRequest request ) { - communityArticleService.updateArticle(id, studyId, articleId, request); + articleService.updateArticle(id, studyId, articleId, request); return ResponseEntity.noContent().build(); } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleController.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleController.java index c1b33267e..0bb2203b1 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleController.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleController.java @@ -47,9 +47,9 @@ public ResponseEntity getLinks( public ResponseEntity createLink( @AuthenticatedMemberId final Long memberId, @PathVariable("study-id") final Long studyId, - @Valid @RequestBody final LinkArticleRequest linkArticleRequest + @Valid @RequestBody final LinkArticleRequest articleRequest ) { - final Long id = articleService.createArticle(memberId, studyId, linkArticleRequest).getId(); + final Long id = articleService.createArticle(memberId, studyId, articleRequest).getId(); return ResponseEntity.created(URI.create("/api/studies/" + studyId + "/reference-room/links/" + id)).build(); } @@ -58,9 +58,9 @@ public ResponseEntity updateLink( @AuthenticatedMemberId final Long memberId, @PathVariable("study-id") final Long studyId, @PathVariable("link-id") final Long linkId, - @Valid @RequestBody final LinkArticleRequest linkArticleRequest + @Valid @RequestBody final LinkArticleRequest articleRequest ) { - articleService.updateArticle(memberId, studyId, linkId, linkArticleRequest); + articleService.updateArticle(memberId, studyId, linkId, articleRequest); return ResponseEntity.noContent().build(); } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/NoticeArticleController.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/NoticeArticleController.java index 63d3a8433..eee548156 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/NoticeArticleController.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/NoticeArticleController.java @@ -3,7 +3,7 @@ import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; import com.woowacourse.moamoa.studyroom.service.NoticeArticleService; import com.woowacourse.moamoa.auth.config.AuthenticatedMemberId; -import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; +import com.woowacourse.moamoa.studyroom.service.request.CommunityArticleRequest; import com.woowacourse.moamoa.studyroom.service.response.ArticleResponse; import com.woowacourse.moamoa.studyroom.service.response.ArticleSummariesResponse; import java.net.URI; @@ -34,7 +34,7 @@ public NoticeArticleController(final NoticeArticleService noticeArticleService) @PostMapping public ResponseEntity createArticle(@AuthenticatedMemberId final Long id, @PathVariable("study-id") final Long studyId, - @Valid @RequestBody final ArticleRequest request + @Valid @RequestBody final CommunityArticleRequest request ) { final NoticeArticle article = noticeArticleService.createArticle(id, studyId, request); final URI location = URI.create("/api/studies/" + studyId + "/notice/articles/" + article.getId()); @@ -70,7 +70,7 @@ public ResponseEntity getArticles(@PathVariable("study public ResponseEntity updateArticle(@AuthenticatedMemberId final Long id, @PathVariable("study-id") final Long studyId, @PathVariable("article-id") final Long articleId, - @Valid @RequestBody final ArticleRequest request + @Valid @RequestBody final CommunityArticleRequest request ) { noticeArticleService.updateArticle(id, studyId, articleId, request); return ResponseEntity.noContent().build(); diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/StudyRoom.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/StudyRoom.java index d373712a4..ca9a82e79 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/StudyRoom.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/StudyRoom.java @@ -1,9 +1,8 @@ package com.woowacourse.moamoa.studyroom.domain; -import com.woowacourse.moamoa.studyroom.domain.article.Article; import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; import com.woowacourse.moamoa.studyroom.domain.article.CommunityArticle; -import com.woowacourse.moamoa.studyroom.domain.article.Content; +import com.woowacourse.moamoa.studyroom.domain.article.CommunityContent; import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; import com.woowacourse.moamoa.studyroom.domain.article.LinkContent; import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; @@ -43,14 +42,6 @@ public boolean isPermittedAccessor(final Accessor accessor) { return studyId.equals(accessor.getStudyId()) && permittedParticipants.isPermittedAccessor(accessor); } - public CommunityArticle writeCommunityArticle(final Accessor accessor, final String title, final String content) { - if (!isPermittedAccessor(accessor)) { - throw new UneditableArticleException(studyId, accessor, ArticleType.COMMUNITY); - } - - return new CommunityArticle(title, content, accessor.getMemberId(),this); - } - public NoticeArticle writeNoticeArticle(final Accessor accessor, final String title, final String content) { if (isOwner(accessor)) { return new NoticeArticle(title, content, accessor.getMemberId(), this); @@ -59,14 +50,6 @@ public NoticeArticle writeNoticeArticle(final Accessor accessor, final String ti throw new UneditableArticleException(studyId, accessor, ArticleType.NOTICE); } - public LinkArticle writeLinkArticle(final Accessor accessor, final LinkContent content) { - if (isPermittedAccessor(accessor)) { - return new LinkArticle(this, accessor.getMemberId(), content); - } - - throw new UneditableArticleException(studyId, accessor, ArticleType.LINK); - } - public Long getId() { return studyId; } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticle.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticle.java index 0c47427dc..a968d52e3 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticle.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticle.java @@ -6,8 +6,8 @@ import com.woowacourse.moamoa.studyroom.domain.Accessor; import com.woowacourse.moamoa.studyroom.domain.StudyRoom; import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; -import java.util.Objects; import javax.persistence.Column; +import javax.persistence.Embedded; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; @@ -25,7 +25,7 @@ @Getter @Table(name = "community") @Where(clause = "deleted = false") -public class CommunityArticle extends BaseEntity { +public class CommunityArticle extends BaseEntity implements Article { @Id @GeneratedValue(strategy = IDENTITY) @@ -38,33 +38,31 @@ public class CommunityArticle extends BaseEntity { @JoinColumn(name = "study_id") private StudyRoom studyRoom; - private String title; - - private String content; + @Embedded + private CommunityContent content; private boolean deleted; - public CommunityArticle(final String title, final String content, final Long authorId, - final StudyRoom studyRoom) { - this(null, title, content, authorId, studyRoom); + public CommunityArticle(final StudyRoom studyRoom, final Long authorId, final CommunityContent content) { + this(null, authorId, studyRoom, content); } - public CommunityArticle(final Long id, final String title, final String content, final Long authorId, - final StudyRoom studyRoom) { + public CommunityArticle(final Long id, final Long authorId, final StudyRoom studyRoom, + final CommunityContent content + ) { this.id = id; this.authorId = authorId; this.studyRoom = studyRoom; - this.title = title; this.content = content; this.deleted = false; } - public void update(final Accessor accessor, final String title, final String content) { + @Override + public void update(final Accessor accessor, final CommunityContent content) { if (!isEditableAccessor(accessor)) { throw new UneditableArticleException(studyRoom.getId(), accessor, ArticleType.COMMUNITY); } - this.title = title; this.content = content; } @@ -72,6 +70,7 @@ private boolean isEditableAccessor(final Accessor accessor) { return studyRoom.isPermittedAccessor(accessor) && authorId.equals(accessor.getMemberId()); } + @Override public void delete(final Accessor accessor) { if (!isEditableAccessor(accessor)) { throw new UneditableArticleException(studyRoom.getId(), accessor, ArticleType.COMMUNITY); @@ -83,23 +82,4 @@ public void delete(final Accessor accessor) { public boolean isDeleted() { return deleted; } - - @Override - public boolean equals(final Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - final CommunityArticle that = (CommunityArticle) o; - return Objects.equals(getId(), that.getId()) && Objects.equals(getTitle(), that.getTitle()) - && Objects.equals(getContent(), that.getContent()) && Objects.equals(getAuthorId(), - that.getAuthorId()) && Objects.equals(getStudyRoom(), that.getStudyRoom()); - } - - @Override - public int hashCode() { - return Objects.hash(getId(), getTitle(), getContent(), getAuthorId(), getStudyRoom()); - } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityContent.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityContent.java new file mode 100644 index 000000000..cc4564001 --- /dev/null +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityContent.java @@ -0,0 +1,60 @@ +package com.woowacourse.moamoa.studyroom.domain.article; + +import com.woowacourse.moamoa.studyroom.domain.Accessor; +import com.woowacourse.moamoa.studyroom.domain.StudyRoom; +import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; +import java.util.Objects; +import javax.persistence.Column; +import javax.persistence.Embeddable; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +@Embeddable +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class CommunityContent implements Content { + + @Column(nullable = false) + private String title; + + @Column(nullable = false) + private String content; + + public CommunityContent(final String title, final String content) { + this.title = title; + this.content = content; + } + + @Override + public CommunityArticle createArticle(final StudyRoom studyRoom, final Accessor accessor) { + if (!studyRoom.isPermittedAccessor(accessor)) { + throw new UneditableArticleException(studyRoom.getId(), accessor, ArticleType.COMMUNITY); + } + + return new CommunityArticle(studyRoom, accessor.getMemberId(), this); + } + + public String getTitle() { + return title; + } + + public String getContent() { + return content; + } + + @Override + public boolean equals(final Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + final CommunityContent that = (CommunityContent) o; + return Objects.equals(title, that.title) && Objects.equals(content, that.content); + } + + @Override + public int hashCode() { + return Objects.hash(title, content); + } +} diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ArticleService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ArticleService.java index 634bb001f..0d5fd61c4 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ArticleService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ArticleService.java @@ -8,7 +8,7 @@ import com.woowacourse.moamoa.studyroom.domain.article.Content; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; -import com.woowacourse.moamoa.studyroom.service.request.AbstractArticleRequest; +import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.transaction.annotation.Transactional; @@ -26,24 +26,24 @@ public ArticleService( } public A createArticle( - final Long memberId, final Long studyId, final AbstractArticleRequest articleRequest + final Long memberId, final Long studyId, final ArticleRequest articleRequest ) { final StudyRoom studyRoom = studyRoomRepository.findByStudyId(studyId) .orElseThrow(StudyNotFoundException::new); - final C content = articleRequest.mapToContent(); + final C content = articleRequest.createContent(); final A article = content.createArticle(studyRoom, new Accessor(memberId, studyId)); return articleRepository.save(article); } public void updateArticle( - final Long memberId, final Long studyId, final Long articleId, final AbstractArticleRequest articleRequest + final Long memberId, final Long studyId, final Long articleId, final ArticleRequest articleRequest ) { final A article = articleRepository.findById(articleId) .orElseThrow(() -> new ArticleNotFoundException(articleId, ArticleType.LINK)); - article.update(new Accessor(memberId, studyId), articleRequest.mapToContent()); + article.update(new Accessor(memberId, studyId), articleRequest.createContent()); } public void deleteArticle(final Long memberId, final Long studyId, final Long articleId) { diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleService.java index 58de65e16..cfeb19ed6 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleService.java @@ -1,16 +1,9 @@ package com.woowacourse.moamoa.studyroom.service; -import com.woowacourse.moamoa.study.service.exception.StudyNotFoundException; -import com.woowacourse.moamoa.studyroom.domain.Accessor; -import com.woowacourse.moamoa.studyroom.domain.StudyRoom; import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; -import com.woowacourse.moamoa.studyroom.domain.article.CommunityArticle; -import com.woowacourse.moamoa.studyroom.domain.repository.article.CommunityArticleRepository; -import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.CommunityArticleDao; import com.woowacourse.moamoa.studyroom.query.data.ArticleData; import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; -import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; import com.woowacourse.moamoa.studyroom.service.response.ArticleResponse; import com.woowacourse.moamoa.studyroom.service.response.ArticleSummariesResponse; import com.woowacourse.moamoa.studyroom.service.response.ArticleSummaryResponse; @@ -25,44 +18,18 @@ @Transactional(readOnly = true) public class CommunityArticleService { - private final StudyRoomRepository studyRoomRepository; - private final CommunityArticleRepository communityArticleRepository; private final CommunityArticleDao communityArticleDao; - public CommunityArticleService( - final StudyRoomRepository studyRoomRepository, - final CommunityArticleRepository communityArticleRepository, - final CommunityArticleDao communityArticleDao - ) { - this.studyRoomRepository = studyRoomRepository; - this.communityArticleRepository = communityArticleRepository; + public CommunityArticleService(final CommunityArticleDao communityArticleDao) { this.communityArticleDao = communityArticleDao; } - @Transactional - public CommunityArticle createArticle(final Long memberId, final Long studyId, final ArticleRequest request) { - final StudyRoom studyRoom = studyRoomRepository.findByStudyId(studyId) - .orElseThrow(StudyNotFoundException::new); - final Accessor accessor = new Accessor(memberId, studyId); - final CommunityArticle article = studyRoom.writeCommunityArticle(accessor, request.getTitle(), request.getContent()); - return communityArticleRepository.save(article); - } - public ArticleResponse getArticle(final Long articleId) { final ArticleData data = communityArticleDao.getById(articleId) .orElseThrow(() -> new ArticleNotFoundException(articleId, ArticleType.COMMUNITY)); return new ArticleResponse(data); } - @Transactional - public void deleteArticle(final Long memberId, final Long studyId, final Long articleId) { - final CommunityArticle article = communityArticleRepository - .findById(articleId) - .orElseThrow(() -> new ArticleNotFoundException(articleId, ArticleType.COMMUNITY)); - - article.delete(new Accessor(memberId, studyId)); - } - public ArticleSummariesResponse getArticles(final Long studyId, final Pageable pageable) { final Page page = communityArticleDao.getAllByStudyId(studyId, pageable); @@ -73,16 +40,4 @@ public ArticleSummariesResponse getArticles(final Long studyId, final Pageable p return new ArticleSummariesResponse(articles, page.getNumber(), page.getTotalPages() - 1, page.getTotalElements()); } - - @Transactional - public void updateArticle(final Long memberId, final Long studyId, final Long articleId, - final ArticleRequest request) { - final CommunityArticle article = communityArticleRepository - .findById(articleId) - .orElseThrow(() -> new ArticleNotFoundException(articleId, ArticleType.COMMUNITY)); - - final Accessor accessor = new Accessor(memberId, studyId); - - article.update(accessor, request.getTitle(), request.getContent()); - } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java index ac6d1f742..d61e519e5 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java @@ -1,17 +1,7 @@ package com.woowacourse.moamoa.studyroom.service; -import com.woowacourse.moamoa.study.service.exception.StudyNotFoundException; -import com.woowacourse.moamoa.studyroom.domain.Accessor; -import com.woowacourse.moamoa.studyroom.domain.StudyRoom; -import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; -import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; -import com.woowacourse.moamoa.studyroom.domain.article.LinkContent; -import com.woowacourse.moamoa.studyroom.domain.repository.article.LinkArticleRepository; -import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.LinkArticleDao; import com.woowacourse.moamoa.studyroom.query.data.LinkArticleData; -import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; -import com.woowacourse.moamoa.studyroom.service.request.LinkArticleRequest; import com.woowacourse.moamoa.studyroom.service.response.LinksResponse; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Slice; @@ -22,53 +12,12 @@ @Transactional public class LinkArticleService { - private final StudyRoomRepository studyRoomRepository; - private final LinkArticleRepository linkArticleRepository; private final LinkArticleDao linkArticleDao; - public LinkArticleService( - final StudyRoomRepository studyRoomRepository, final LinkArticleRepository linkArticleRepository, - final LinkArticleDao linkArticleDao - ) { - this.studyRoomRepository = studyRoomRepository; - this.linkArticleRepository = linkArticleRepository; + public LinkArticleService(final LinkArticleDao linkArticleDao) { this.linkArticleDao = linkArticleDao; } - public LinkArticle createLink( - final Long memberId, final Long studyId, final LinkArticleRequest linkArticleRequest - ) { - final StudyRoom studyRoom = studyRoomRepository.findByStudyId(studyId) - .orElseThrow(StudyNotFoundException::new); - final LinkArticle linkArticle = studyRoom.writeLinkArticle( - new Accessor(memberId, studyId), - new LinkContent(linkArticleRequest.getLinkUrl(), linkArticleRequest.getDescription())); - - return linkArticleRepository.save(linkArticle); - } - - public void updateLink( - final Long memberId, final Long studyId, final Long articleId, final LinkArticleRequest linkArticleRequest - ) { - final LinkArticle linkArticle = linkArticleRepository.findById(articleId) - .orElseThrow(() -> new ArticleNotFoundException(articleId, ArticleType.LINK)); - - final Accessor accessor = new Accessor(memberId, studyId); - final String linkUrl = linkArticleRequest.getLinkUrl(); - final String description = linkArticleRequest.getDescription(); - - linkArticle.update(accessor, new LinkContent(linkUrl, description)); - } - - public void deleteLink(final Long memberId, final Long studyId, final Long articleId) { - final LinkArticle linkArticle = linkArticleRepository.findById(articleId) - .orElseThrow(() -> new ArticleNotFoundException(articleId, ArticleType.LINK)); - - final Accessor accessor = new Accessor(memberId, studyId); - - linkArticle.delete(accessor); - } - public LinksResponse getLinks(final Long studyId, final Pageable pageable) { final Slice linkData = linkArticleDao.findAllByStudyId(studyId, pageable); return new LinksResponse(linkData.getContent(), linkData.hasNext()); diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleService.java index 49c281191..eb5aad7b1 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleService.java @@ -10,7 +10,7 @@ import com.woowacourse.moamoa.studyroom.query.NoticeArticleDao; import com.woowacourse.moamoa.studyroom.query.data.ArticleData; import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; -import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; +import com.woowacourse.moamoa.studyroom.service.request.CommunityArticleRequest; import com.woowacourse.moamoa.studyroom.service.response.ArticleResponse; import com.woowacourse.moamoa.studyroom.service.response.ArticleSummariesResponse; import com.woowacourse.moamoa.studyroom.service.response.ArticleSummaryResponse; @@ -41,7 +41,7 @@ public NoticeArticleService(final StudyRoomRepository studyRoomRepository, @Transactional public NoticeArticle createArticle(final Long memberId, final Long studyId, - final ArticleRequest request) { + final CommunityArticleRequest request) { final StudyRoom studyRoom = studyRoomRepository.findByStudyId(studyId) .orElseThrow(StudyNotFoundException::new); final Accessor accessor = new Accessor(memberId, studyId); @@ -76,7 +76,7 @@ public ArticleSummariesResponse getArticles(final Long studyId, final Pageable p } @Transactional - public void updateArticle(final Long memberId, final Long studyId, final Long articleId, final ArticleRequest request) { + public void updateArticle(final Long memberId, final Long studyId, final Long articleId, final CommunityArticleRequest request) { final NoticeArticle article = noticeArticleRepository .findById(articleId) .orElseThrow(() -> new ArticleNotFoundException(articleId, ArticleType.NOTICE)); diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/AbstractArticleRequest.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/AbstractArticleRequest.java deleted file mode 100644 index 97ebfc418..000000000 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/AbstractArticleRequest.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.woowacourse.moamoa.studyroom.service.request; - -import com.woowacourse.moamoa.studyroom.domain.article.Article; -import com.woowacourse.moamoa.studyroom.domain.article.Content; - -public interface AbstractArticleRequest>> { - - T mapToContent(); -} diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/ArticleRequest.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/ArticleRequest.java index 4c9e14518..656725a47 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/ArticleRequest.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/ArticleRequest.java @@ -1,24 +1,9 @@ package com.woowacourse.moamoa.studyroom.service.request; -import javax.validation.constraints.NotBlank; -import lombok.Getter; -import lombok.NoArgsConstructor; -import org.hibernate.validator.constraints.Length; +import com.woowacourse.moamoa.studyroom.domain.article.Article; +import com.woowacourse.moamoa.studyroom.domain.article.Content; -@Getter -@NoArgsConstructor -public class ArticleRequest { +public interface ArticleRequest>> { - @NotBlank(message = "내용을 입력해 주세요.") - @Length(max = 30) - private String title; - - @NotBlank(message = "내용을 입력해 주세요.") - @Length(max = 5000) - private String content; - - public ArticleRequest(final String title, final String content) { - this.title = title; - this.content = content; - } + T createContent(); } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/CommunityArticleRequest.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/CommunityArticleRequest.java new file mode 100644 index 000000000..16192d621 --- /dev/null +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/CommunityArticleRequest.java @@ -0,0 +1,30 @@ +package com.woowacourse.moamoa.studyroom.service.request; + +import com.woowacourse.moamoa.studyroom.domain.article.CommunityContent; +import javax.validation.constraints.NotBlank; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.hibernate.validator.constraints.Length; + +@Getter +@NoArgsConstructor +public class CommunityArticleRequest implements ArticleRequest { + + @NotBlank(message = "내용을 입력해 주세요.") + @Length(max = 30) + private String title; + + @NotBlank(message = "내용을 입력해 주세요.") + @Length(max = 5000) + private String content; + + public CommunityArticleRequest(final String title, final String content) { + this.title = title; + this.content = content; + } + + @Override + public CommunityContent createContent() { + return new CommunityContent(title, content); + } +} diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/LinkArticleRequest.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/LinkArticleRequest.java index 32735f056..67bfcd810 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/LinkArticleRequest.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/LinkArticleRequest.java @@ -10,7 +10,7 @@ @NoArgsConstructor @AllArgsConstructor @Getter -public class LinkArticleRequest implements AbstractArticleRequest{ +public class LinkArticleRequest implements ArticleRequest { @NotBlank(message = "공유할 링크 URL을 입력해 주세요.") @Size(max = 500, message = "링크 URL은 500자를 초과할 수 없습니다.") @@ -20,7 +20,7 @@ public class LinkArticleRequest implements AbstractArticleRequest{ private String description; @Override - public LinkContent mapToContent() { + public LinkContent createContent() { return new LinkContent(linkUrl, description); } } diff --git a/backend/src/test/java/com/woowacourse/acceptance/steps/StudyRelatedSteps.java b/backend/src/test/java/com/woowacourse/acceptance/steps/StudyRelatedSteps.java index ef94172bc..e22eef7bf 100644 --- a/backend/src/test/java/com/woowacourse/acceptance/steps/StudyRelatedSteps.java +++ b/backend/src/test/java/com/woowacourse/acceptance/steps/StudyRelatedSteps.java @@ -4,9 +4,9 @@ import static org.springframework.http.HttpHeaders.CONTENT_TYPE; import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; -import com.woowacourse.moamoa.studyroom.service.request.LinkArticleRequest; import com.woowacourse.moamoa.review.service.request.WriteReviewRequest; -import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; +import com.woowacourse.moamoa.studyroom.service.request.CommunityArticleRequest; +import com.woowacourse.moamoa.studyroom.service.request.LinkArticleRequest; import io.restassured.RestAssured; import org.junit.jupiter.api.Assertions; import org.springframework.http.HttpHeaders; @@ -74,7 +74,7 @@ public class StudyRelatedSteps extends Steps { final String location = RestAssured.given().log().all() .header(org.apache.http.HttpHeaders.AUTHORIZATION, token) .header(org.apache.http.HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) - .body(objectMapper.writeValueAsString(new ArticleRequest(title, content))) + .body(objectMapper.writeValueAsString(new CommunityArticleRequest(title, content))) .pathParam("study-id", studyId) .when().log().all() .post("/api/studies/{study-id}/notice/articles") @@ -93,7 +93,7 @@ public class StudyRelatedSteps extends Steps { final String location = RestAssured.given().log().all() .header(org.apache.http.HttpHeaders.AUTHORIZATION, token) .header(org.apache.http.HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) - .body(objectMapper.writeValueAsString(new ArticleRequest(title, content))) + .body(objectMapper.writeValueAsString(new CommunityArticleRequest(title, content))) .pathParam("study-id", studyId) .when().log().all() .post("/api/studies/{study-id}/community/articles") diff --git a/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/CommunityArticleAcceptanceTest.java b/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/CommunityArticleAcceptanceTest.java index d12ee30bb..cb419bd4a 100644 --- a/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/CommunityArticleAcceptanceTest.java +++ b/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/CommunityArticleAcceptanceTest.java @@ -24,7 +24,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.woowacourse.acceptance.AcceptanceTest; -import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; +import com.woowacourse.moamoa.studyroom.service.request.CommunityArticleRequest; import com.woowacourse.moamoa.studyroom.service.response.ArticleResponse; import com.woowacourse.moamoa.studyroom.service.response.ArticleSummariesResponse; import com.woowacourse.moamoa.studyroom.service.response.ArticleSummaryResponse; @@ -47,7 +47,7 @@ void writeArticleToCommunity() throws Exception { // arrange long 스터디_ID = 그린론이().로그인하고().자바_스터디를().시작일자는(LocalDate.now()).생성한다(); String 토큰 = 그린론이().로그인한다(); - ArticleRequest request = new ArticleRequest("게시글 제목", "게시글 내용"); + CommunityArticleRequest request = new CommunityArticleRequest("게시글 제목", "게시글 내용"); // act final String location = RestAssured.given(spec).log().all() @@ -275,7 +275,7 @@ void updateArticleToCommunity() throws JsonProcessingException { long 게시글_ID = 그린론이().로그인하고().스터디에(스터디_ID).게시글을_작성한다("게시글 제목", "게시글 내용"); String 토큰 = 그린론이().로그인한다(); - final ArticleRequest request = new ArticleRequest("게시글 제목 수정", "게시글 내용 수정"); + final CommunityArticleRequest request = new CommunityArticleRequest("게시글 제목 수정", "게시글 내용 수정"); // act RestAssured.given(spec).log().all() diff --git a/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/LinkArticleAcceptanceTest.java b/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/LinkArticleAcceptanceTest.java index 785515073..4d96077a4 100644 --- a/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/LinkArticleAcceptanceTest.java +++ b/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/LinkArticleAcceptanceTest.java @@ -154,11 +154,11 @@ void getAllLink() { @DisplayName("작성한 링크 공유글을 수정할 수 있다.") @Test void updateLink() { - final LinkArticleRequest linkArticleRequest = new LinkArticleRequest("https://github.com/sc0116", + final LinkArticleRequest articleRequest = new LinkArticleRequest("https://github.com/sc0116", "링크 설명입니다."); final LocalDate 지금 = LocalDate.now(); final Long 자바_스터디_ID = 짱구가().로그인하고().자바_스터디를().시작일자는(지금).생성한다(); - final Long 짱구_링크공유_ID = 짱구가().로그인하고().스터디에(자바_스터디_ID).링크를_공유한다(linkArticleRequest); + final Long 짱구_링크공유_ID = 짱구가().로그인하고().스터디에(자바_스터디_ID).링크를_공유한다(articleRequest); final String token = 짱구가().로그인한다(); final LinkArticleRequest editingLinkRequest = new LinkArticleRequest("https://github.com/woowacourse", @@ -201,11 +201,11 @@ void updateLink() { @DisplayName("작성한 링크 공유글을 삭제할 수 있다.") @Test void deleteLink() { - final LinkArticleRequest linkArticleRequest = new LinkArticleRequest("https://github.com/sc0116", + final LinkArticleRequest articleRequest = new LinkArticleRequest("https://github.com/sc0116", "링크 설명입니다."); final LocalDate 지금 = LocalDate.now(); final Long 자바_스터디_ID = 짱구가().로그인하고().자바_스터디를().시작일자는(지금).생성한다(); - final Long 짱구_링크공유_ID = 짱구가().로그인하고().스터디에(자바_스터디_ID).링크를_공유한다(linkArticleRequest); + final Long 짱구_링크공유_ID = 짱구가().로그인하고().스터디에(자바_스터디_ID).링크를_공유한다(articleRequest); final String token = 짱구가().로그인한다(); RestAssured.given(spec).log().all() diff --git a/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/NoticeAcceptanceTest.java b/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/NoticeAcceptanceTest.java index 7a6360c5f..a0f3218ea 100644 --- a/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/NoticeAcceptanceTest.java +++ b/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/NoticeAcceptanceTest.java @@ -20,7 +20,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.woowacourse.acceptance.AcceptanceTest; -import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; +import com.woowacourse.moamoa.studyroom.service.request.CommunityArticleRequest; import com.woowacourse.moamoa.studyroom.service.response.ArticleResponse; import com.woowacourse.moamoa.studyroom.service.response.ArticleSummariesResponse; import com.woowacourse.moamoa.studyroom.service.response.ArticleSummaryResponse; @@ -43,7 +43,7 @@ void writeNotice() throws Exception { // arrange long 스터디_ID = 그린론이().로그인하고().자바_스터디를().시작일자는(LocalDate.now()).생성한다(); String 토큰 = 그린론이().로그인한다(); - ArticleRequest request = new ArticleRequest("공지사항 제목", "공지사항 내용"); + CommunityArticleRequest request = new CommunityArticleRequest("공지사항 제목", "공지사항 내용"); // act final String location = RestAssured.given(spec).log().all() @@ -269,7 +269,7 @@ void updateArticleToCommunity() throws JsonProcessingException { long 공지글_ID = 그린론이().로그인하고().스터디에(스터디_ID).공지사항을_작성한다("게시글 제목", "게시글 내용"); String 토큰 = 그린론이().로그인한다(); - final ArticleRequest request = new ArticleRequest("게시글 제목 수정", "게시글 내용 수정"); + final CommunityArticleRequest request = new CommunityArticleRequest("게시글 제목 수정", "게시글 내용 수정"); // act RestAssured.given(spec).log().all() diff --git a/backend/src/test/java/com/woowacourse/moamoa/WebMVCTest.java b/backend/src/test/java/com/woowacourse/moamoa/WebMVCTest.java index 36c9aec70..fddc33147 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/WebMVCTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/WebMVCTest.java @@ -11,6 +11,8 @@ import com.woowacourse.moamoa.common.MockedServiceObjectsBeanRegister; import com.woowacourse.moamoa.member.domain.Member; import com.woowacourse.moamoa.member.domain.repository.MemberRepository; +import com.woowacourse.moamoa.studyroom.domain.article.CommunityArticle; +import com.woowacourse.moamoa.studyroom.domain.article.CommunityContent; import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; import com.woowacourse.moamoa.studyroom.domain.article.LinkContent; import com.woowacourse.moamoa.studyroom.service.ArticleService; @@ -53,7 +55,10 @@ public abstract class WebMVCTest { protected NativeWebRequest nativeWebRequest; @MockBean - protected ArticleService articleService; + protected ArticleService articleService1; + + @MockBean + protected ArticleService articleService2; @BeforeEach void setUp() { diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/DeletingNoticeArticleControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/DeletingNoticeArticleControllerTest.java index 932908bd5..339698e55 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/DeletingNoticeArticleControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/DeletingNoticeArticleControllerTest.java @@ -18,7 +18,7 @@ import com.woowacourse.moamoa.studyroom.service.NoticeArticleService; import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; -import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; +import com.woowacourse.moamoa.studyroom.service.request.CommunityArticleRequest; import java.time.LocalDate; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -67,7 +67,7 @@ void deleteCommunityArticle() { Study study = studyService .createStudy(member.getId(), javaStudyRequest.startDate(LocalDate.now()).build()); - ArticleRequest request = new ArticleRequest("게시글 제목", "게시글 내용"); + CommunityArticleRequest request = new CommunityArticleRequest("게시글 제목", "게시글 내용"); NoticeArticle article = noticeArticleService.createArticle(member.getId(), study.getId(), request); //act @@ -103,7 +103,7 @@ void throwExceptionWhenDeletingByNotParticipant() { Study study = studyService .createStudy(member.getId(), javaStudyRequest.startDate(LocalDate.now()).build()); - ArticleRequest request = new ArticleRequest("게시글 제목", "게시글 내용"); + CommunityArticleRequest request = new CommunityArticleRequest("게시글 제목", "게시글 내용"); NoticeArticle article = noticeArticleService.createArticle(member.getId(), study.getId(), request); final Long otherId = other.getId(); diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingCommunityArticleSummariesControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingCommunityArticleSummariesControllerTest.java index 6093cca41..a7c48487c 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingCommunityArticleSummariesControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingCommunityArticleSummariesControllerTest.java @@ -16,8 +16,7 @@ import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.NoticeArticleDao; import com.woowacourse.moamoa.studyroom.service.NoticeArticleService; -import com.woowacourse.moamoa.study.service.exception.StudyNotFoundException; -import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; +import com.woowacourse.moamoa.studyroom.service.request.CommunityArticleRequest; import com.woowacourse.moamoa.studyroom.service.response.ArticleSummariesResponse; import com.woowacourse.moamoa.studyroom.service.response.ArticleSummaryResponse; import com.woowacourse.moamoa.studyroom.service.response.AuthorResponse; @@ -75,15 +74,15 @@ void getCommunityArticles() { Study study = studyService.createStudy(그린론.getId(), javaStudyRequest.startDate(LocalDate.now()).build()); noticeArticleService - .createArticle(그린론.getId(), study.getId(), new ArticleRequest("제목1", "내용1")); + .createArticle(그린론.getId(), study.getId(), new CommunityArticleRequest("제목1", "내용1")); noticeArticleService - .createArticle(그린론.getId(), study.getId(), new ArticleRequest("제목2", "내용2")); + .createArticle(그린론.getId(), study.getId(), new CommunityArticleRequest("제목2", "내용2")); NoticeArticle article3 = noticeArticleService - .createArticle(그린론.getId(), study.getId(), new ArticleRequest("제목3", "내용3")); + .createArticle(그린론.getId(), study.getId(), new CommunityArticleRequest("제목3", "내용3")); NoticeArticle article4 = noticeArticleService - .createArticle(그린론.getId(), study.getId(), new ArticleRequest("제목4", "내용4")); + .createArticle(그린론.getId(), study.getId(), new CommunityArticleRequest("제목4", "내용4")); NoticeArticle article5 = noticeArticleService - .createArticle(그린론.getId(), study.getId(), new ArticleRequest("제목5", "내용5")); + .createArticle(그린론.getId(), study.getId(), new CommunityArticleRequest("제목5", "내용5")); // act ResponseEntity response = sut.getArticles(study.getId(), PageRequest.of(0, 3)); diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingNoticeArticleControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingNoticeArticleControllerTest.java index cef944075..2c4c52153 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingNoticeArticleControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingNoticeArticleControllerTest.java @@ -17,7 +17,7 @@ import com.woowacourse.moamoa.studyroom.query.NoticeArticleDao; import com.woowacourse.moamoa.studyroom.service.NoticeArticleService; import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; -import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; +import com.woowacourse.moamoa.studyroom.service.request.CommunityArticleRequest; import com.woowacourse.moamoa.studyroom.service.response.ArticleResponse; import com.woowacourse.moamoa.studyroom.service.response.AuthorResponse; import java.time.LocalDate; @@ -68,7 +68,7 @@ void getStudyCommunityArticle() { Study study = studyService .createStudy(member.getId(), javaStudyRequest.startDate(LocalDate.now()).build()); - ArticleRequest request = new ArticleRequest("게시글 제목", "게시글 내용"); + CommunityArticleRequest request = new CommunityArticleRequest("게시글 제목", "게시글 내용"); NoticeArticle article = noticeArticleService.createArticle(member.getId(), study.getId(), request); //act diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java index 96b071d29..9f1772b47 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java @@ -13,13 +13,14 @@ import com.woowacourse.moamoa.study.domain.repository.StudyRepository; import com.woowacourse.moamoa.study.service.StudyService; import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; +import com.woowacourse.moamoa.studyroom.domain.article.LinkContent; +import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; +import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; import com.woowacourse.moamoa.studyroom.domain.repository.article.LinkArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.LinkArticleDao; import com.woowacourse.moamoa.studyroom.service.ArticleService; import com.woowacourse.moamoa.studyroom.service.LinkArticleService; -import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; -import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; import com.woowacourse.moamoa.studyroom.service.request.LinkArticleRequest; import java.time.LocalDate; import javax.persistence.EntityManager; @@ -57,14 +58,15 @@ class LinkArticleControllerTest { private StudyService studyService; private LinkArticleService linkArticleService; + private ArticleService articleService; @BeforeEach void setUp() { - linkArticleService = new LinkArticleService(studyRoomRepository, linkArticleRepository, linkArticleDao); + linkArticleService = new LinkArticleService(linkArticleDao); studyService = new StudyService(studyRepository, memberRepository, new DateTimeSystem()); - sut = new LinkArticleController(linkArticleService, - new ArticleService<>(studyRoomRepository, articleRepository)); + articleService = new ArticleService<>(studyRoomRepository, articleRepository); + sut = new LinkArticleController(linkArticleService, articleService); } @DisplayName("스터디에 참여하지 않은 회원은 링크 공유를 할 수 없다.") @@ -77,10 +79,10 @@ void createByNotParticipatedMember() { entityManager.flush(); entityManager.clear(); - final LinkArticleRequest linkArticleRequest = + final LinkArticleRequest articleRequest = new LinkArticleRequest("https://github.com/sc0116", "링크 설명입니다."); - assertThatThrownBy(() -> sut.createLink(디우.getId(), 자바_스터디.getId(), linkArticleRequest)) + assertThatThrownBy(() -> sut.createLink(디우.getId(), 자바_스터디.getId(), articleRequest)) .isInstanceOf(UneditableArticleException.class); } @@ -107,13 +109,13 @@ void updateByNotParticipatedMember() { final Study 자바_스터디 = studyService.createStudy(짱구.getId(), 자바_스터디_신청서(LocalDate.now())); - final LinkArticleRequest linkArticleRequest = new LinkArticleRequest("https://github.com/sc0116", "링크 설명입니다."); - final LinkArticle 링크_게시글 = linkArticleService.createLink(짱구.getId(), 자바_스터디.getId(), linkArticleRequest); + final LinkArticleRequest articleRequest = new LinkArticleRequest("https://github.com/sc0116", "링크 설명입니다."); + final LinkArticle 링크_게시글 = articleService.createArticle(짱구.getId(), 자바_스터디.getId(), articleRequest); entityManager.flush(); entityManager.clear(); - assertThatThrownBy(() -> sut.updateLink(디우.getId(), 자바_스터디.getId(), 링크_게시글.getId(), linkArticleRequest)) + assertThatThrownBy(() -> sut.updateLink(디우.getId(), 자바_스터디.getId(), 링크_게시글.getId(), articleRequest)) .isInstanceOf(UneditableArticleException.class); } @@ -138,8 +140,8 @@ void deleteByNotParticipatedMember() { final Study 자바_스터디 = studyService.createStudy(짱구.getId(), 자바_스터디_신청서(LocalDate.now())); - final LinkArticleRequest linkArticleRequest = new LinkArticleRequest("https://github.com/sc0116", "링크 설명입니다."); - final LinkArticle 링크_게시글 = linkArticleService.createLink(짱구.getId(), 자바_스터디.getId(), linkArticleRequest); + final LinkArticleRequest articleRequest = new LinkArticleRequest("https://github.com/sc0116", "링크 설명입니다."); + final LinkArticle 링크_게시글 = articleService.createArticle(짱구.getId(), 자바_스터디.getId(), articleRequest); entityManager.flush(); entityManager.clear(); diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/NoticeArticleControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/NoticeArticleControllerTest.java index 7aff13ce5..cc33498d3 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/NoticeArticleControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/NoticeArticleControllerTest.java @@ -1,6 +1,5 @@ package com.woowacourse.moamoa.studyroom.controller; -import static com.woowacourse.moamoa.studyroom.domain.article.ArticleType.NOTICE; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -19,7 +18,7 @@ import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.NoticeArticleDao; import com.woowacourse.moamoa.studyroom.service.NoticeArticleService; -import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; +import com.woowacourse.moamoa.studyroom.service.request.CommunityArticleRequest; import java.time.LocalDate; import java.util.Set; import org.junit.jupiter.api.BeforeEach; @@ -68,7 +67,7 @@ void createCommunityArticle() { Study study = studyService .createStudy(owner.getId(), javaStudyRequest.startDate(LocalDate.now()).build()); - ArticleRequest request = new ArticleRequest("게시글 제목", "게시글 내용"); + CommunityArticleRequest request = new CommunityArticleRequest("게시글 제목", "게시글 내용"); // act ResponseEntity response = sut.createArticle(owner.getId(), study.getId(), request); @@ -96,7 +95,7 @@ void createNoticeArticle() { Study study = studyService .createStudy(owner.getId(), javaStudyRequest.startDate(LocalDate.now()).build()); - ArticleRequest request = new ArticleRequest("게시글 제목", "게시글 내용"); + CommunityArticleRequest request = new CommunityArticleRequest("게시글 제목", "게시글 내용"); // act ResponseEntity response = sut.createArticle(owner.getId(), study.getId(), request); @@ -122,7 +121,7 @@ void throwExceptionWhenWriteToNotFoundStudy() { Member member = memberRepository.save(new Member(1L, "username", "imageUrl", "profileUrl")); final Long memberId = member.getId(); - final ArticleRequest articleRequest = new ArticleRequest("제목", "내용"); + final CommunityArticleRequest articleRequest = new CommunityArticleRequest("제목", "내용"); // act & assert assertThatThrownBy(() -> sut.createArticle(memberId, 1L, articleRequest)) diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/UpdatingNoticeArticleControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/UpdatingNoticeArticleControllerTest.java index affa0fcda..18ac56b86 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/UpdatingNoticeArticleControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/UpdatingNoticeArticleControllerTest.java @@ -19,7 +19,7 @@ import com.woowacourse.moamoa.studyroom.service.NoticeArticleService; import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; -import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; +import com.woowacourse.moamoa.studyroom.service.request.CommunityArticleRequest; import java.time.LocalDate; import java.util.Set; import org.junit.jupiter.api.BeforeEach; @@ -70,12 +70,12 @@ void updateArticle() { Study study = studyService .createStudy(owner.getId(), javaStudyBuilder.startDate(LocalDate.now()).build()); NoticeArticle article = noticeArticleService - .createArticle(owner.getId(), study.getId(), new ArticleRequest("제목", "내용")); + .createArticle(owner.getId(), study.getId(), new CommunityArticleRequest("제목", "내용")); // act final ResponseEntity response = sut .updateArticle(owner.getId(), study.getId(), article.getId(), - new ArticleRequest("제목 수정", "내용 수정")); + new CommunityArticleRequest("제목 수정", "내용 수정")); // assert NoticeArticle actualArticle = noticeArticleRepository.findById(article.getId()).orElseThrow(); @@ -98,7 +98,7 @@ void throwExceptionWhenUpdateToNotFoundArticle() { final Long memberId = member.getId(); final Long studyId = study.getId(); - final ArticleRequest articleRequest = new ArticleRequest("제목 수정", "내용 수정"); + final CommunityArticleRequest articleRequest = new CommunityArticleRequest("제목 수정", "내용 수정"); // act & assert assertThatThrownBy(() -> @@ -116,14 +116,14 @@ void throwExceptionWhenUpdateByNotParticipant() { Study study = studyService .createStudy(member.getId(), javaStudyBuilder.startDate(LocalDate.now()).build()); - ArticleRequest request = new ArticleRequest("게시글 제목", "게시글 내용"); + CommunityArticleRequest request = new CommunityArticleRequest("게시글 제목", "게시글 내용"); final NoticeArticle article = noticeArticleService .createArticle(member.getId(), study.getId(), request); final Long otherId = other.getId(); final Long studyId = study.getId(); final Long articleId = article.getId(); - final ArticleRequest articleRequest = new ArticleRequest("제목 수정", "내용 수정"); + final CommunityArticleRequest articleRequest = new CommunityArticleRequest("제목 수정", "내용 수정"); // act & assert assertThatThrownBy(() -> sut.updateArticle(otherId, studyId, articleId, articleRequest)) diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/StudyRoomTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/StudyRoomTest.java index b88b7bc44..dbbb45eb3 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/StudyRoomTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/StudyRoomTest.java @@ -5,7 +5,6 @@ import com.woowacourse.moamoa.member.domain.Member; import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; -import com.woowacourse.moamoa.studyroom.domain.article.LinkContent; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -17,45 +16,6 @@ class StudyRoomTest { - @ParameterizedTest - @DisplayName("스터디에 참여한 참가자는 커뮤니티 게시글을 작성할 수 있다.") - @MethodSource("provideAccessibleAccessorForCommunityArticle") - void writeCommunityArticleByParticipant(final Accessor accessor) { - // arrange - final Member owner = createMember(1L); - final Member participant = createMember(2L); - final StudyRoom studyRoom = createStudyRoom(1L, owner, participant); - - // act & assert - assertThatCode(() -> studyRoom.writeCommunityArticle(accessor, "제목", "내용")) - .doesNotThrowAnyException(); - } - - private static Stream provideAccessibleAccessorForCommunityArticle() { - return Stream.of( - Arguments.of(new Accessor(1L, 1L)), // 방장 - Arguments.of(new Accessor(2L, 1L)) // 일반 참가자 - ); - } - - @ParameterizedTest - @DisplayName("스터디에 참여하지 않은 참가자는 커뮤니티 게시글을 작성할 수 없다.") - @MethodSource("provideNonAccessibleAccessorForCommunityArticle") - void cantWriteCommunityArticleByNonParticipants(final Accessor accessor) { - Member owner = createMember(1L); - StudyRoom studyRoom = createStudyRoom(1L, owner); - - assertThatThrownBy(() -> studyRoom.writeCommunityArticle(accessor, "제목", "내용")) - .isInstanceOf(UneditableArticleException.class); - } - - private static Stream provideNonAccessibleAccessorForCommunityArticle() { - return Stream.of( - Arguments.of(new Accessor(2L, 1L)), // memberId가 잘못된 경우 - Arguments.of(new Accessor(1L, 2L)) // studyId가 잘못된 경우 - ); - } - @DisplayName("방장은 공지글을 작성할 수 있다.") @Test void writeNoticeArticleByOwner() { @@ -89,47 +49,6 @@ private static Stream provideNonAccessibleAccessorForNoticeArticle() ); } - @ParameterizedTest - @DisplayName("링크 게시글을 스터디에 참여한 인원은 작성할 수 있다.") - @MethodSource("provideAccessibleAccessorForLinkArticle") - void writeLinkArticleByAccessibleAccessor(final Accessor accessor) { - // arrange - final Member owner = createMember(1L); - final Member participant = createMember(2L); - final StudyRoom studyRoom = createStudyRoom(1L, owner, participant); - - // act & assert - assertThatCode(() -> studyRoom.writeLinkArticle(accessor, new LinkContent("link url", "설명"))) - .doesNotThrowAnyException(); - } - - private static Stream provideAccessibleAccessorForLinkArticle() { - return Stream.of( - Arguments.of(new Accessor(1L, 1L)), // 방장 - Arguments.of(new Accessor(2L, 1L)) // 일반 참여자 - ); - } - - @ParameterizedTest - @DisplayName("링크글을 스터디 참여자만 작성할 수 있다.") - @MethodSource("provideNonAccessibleAccessorForLinkArticle") - void cantWriteLinkArticleByNonAccessibleAccessor(final Accessor accessor) { - // arrange - final Member owner = createMember(1L); - final StudyRoom studyRoom = createStudyRoom(1L, owner); - - // act & assert - assertThatThrownBy(() -> studyRoom.writeLinkArticle(accessor, new LinkContent("link url", "설명"))) - .isInstanceOf(UneditableArticleException.class); - } - - private static Stream provideNonAccessibleAccessorForLinkArticle() { - return Stream.of( - Arguments.of(new Accessor(1L, 2L)), // studyId가 잘못된 경우 - Arguments.of(new Accessor(2L, 1L)) // 스터디에 참여하지 않은 접근자 - ); - } - private StudyRoom createStudyRoom(long studyId, Member owner, Member... participant) { final Set participants = Stream.of(participant) .map(Member::getId) diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticleTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticleTest.java index 4d6aceca1..713882ab9 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticleTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticleTest.java @@ -2,7 +2,6 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.*; import com.woowacourse.moamoa.member.domain.Member; import com.woowacourse.moamoa.studyroom.domain.Accessor; @@ -25,16 +24,14 @@ void update() { final Member owner = createMember(1L); final StudyRoom studyRoom = createStudyRoom(1L, owner); final Accessor accessor = new Accessor(owner.getId(), studyRoom.getId()); - final CommunityArticle sut = studyRoom.writeCommunityArticle(accessor, "제목", "내용"); + final CommunityContent communityContent = new CommunityContent("제목", "내용"); + final CommunityArticle sut = communityContent.createArticle(studyRoom, new Accessor(owner.getId(), studyRoom.getId())); // act - sut.update(accessor, "수정된 제목", "수정된 내용"); + sut.update(accessor, new CommunityContent("수정된 제목", "수정된 내용")); // assert - assertAll( - () -> assertThat(sut.getTitle()).isEqualTo("수정된 제목"), - () -> assertThat(sut.getContent()).isEqualTo("수정된 내용") - ); + assertThat(sut.getContent()).isEqualTo(new CommunityContent("수정된 제목", "수정된 내용")); } @ParameterizedTest @@ -43,10 +40,10 @@ void update() { void updateByNotAuthor(final long memberId, final long studyId) { final Member owner = createMember(1L); final StudyRoom studyRoom = createStudyRoom(1L, owner); - final CommunityArticle sut = studyRoom.writeCommunityArticle(new Accessor(owner.getId(), studyRoom.getId()), - "제목", "내용"); + final CommunityContent communityContent = new CommunityContent("제목", "내용"); + final CommunityArticle sut = communityContent.createArticle(studyRoom, new Accessor(owner.getId(), studyRoom.getId())); - assertThatThrownBy(() -> sut.update(new Accessor(memberId, studyId), "수정된 제목", "수정된 내용")) + assertThatThrownBy(() -> sut.update(new Accessor(memberId, studyId), new CommunityContent("수정된 제목", "수정된 내용"))) .isInstanceOf(UneditableArticleException.class); } @@ -55,8 +52,8 @@ void updateByNotAuthor(final long memberId, final long studyId) { void delete() { final Member owner = createMember(1L); final StudyRoom studyRoom = createStudyRoom(1L, owner); - final CommunityArticle sut = studyRoom.writeCommunityArticle(new Accessor(owner.getId(), studyRoom.getId()), - "제목", "내용"); + final CommunityContent communityContent = new CommunityContent("제목", "내용"); + final CommunityArticle sut = communityContent.createArticle(studyRoom, new Accessor(owner.getId(), studyRoom.getId())); sut.delete(new Accessor(1L, 1L)); @@ -69,8 +66,8 @@ void delete() { void deleteByNotAuthor(final long memberId, final long studyId) { final Member owner = createMember(1L); final StudyRoom studyRoom = createStudyRoom(1L, owner); - final CommunityArticle sut = studyRoom.writeCommunityArticle(new Accessor(owner.getId(), studyRoom.getId()), - "제목", "내용"); + final CommunityContent communityContent = new CommunityContent("제목", "내용"); + final CommunityArticle sut = communityContent.createArticle(studyRoom, new Accessor(owner.getId(), studyRoom.getId())); assertThatThrownBy(() -> sut.delete(new Accessor(memberId, studyId))) .isInstanceOf(UneditableArticleException.class); diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityContentTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityContentTest.java new file mode 100644 index 000000000..ef1e209b5 --- /dev/null +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityContentTest.java @@ -0,0 +1,71 @@ +package com.woowacourse.moamoa.studyroom.domain.article; + +import static org.assertj.core.api.Assertions.assertThatCode; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import com.woowacourse.moamoa.member.domain.Member; +import com.woowacourse.moamoa.studyroom.domain.Accessor; +import com.woowacourse.moamoa.studyroom.domain.StudyRoom; +import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +class CommunityContentTest { + + @ParameterizedTest + @DisplayName("스터디에 참여한 참가자는 커뮤니티 게시글을 작성할 수 있다.") + @MethodSource("provideAccessibleAccessorForCommunityArticle") + void writeCommunityArticleByParticipant(final Accessor accessor) { + // arrange + final Member owner = createMember(1L); + final Member participant = createMember(2L); + final StudyRoom studyRoom = createStudyRoom(1L, owner, participant); + final CommunityContent sut = new CommunityContent("제목", "설명"); + + // act & assert + assertThatCode(() -> sut.createArticle(studyRoom, accessor)) + .doesNotThrowAnyException(); + } + + private static Stream provideAccessibleAccessorForCommunityArticle() { + return Stream.of( + Arguments.of(new Accessor(1L, 1L)), // 방장 + Arguments.of(new Accessor(2L, 1L)) // 일반 참가자 + ); + } + + @ParameterizedTest + @DisplayName("스터디에 참여하지 않은 참가자는 커뮤니티 게시글을 작성할 수 없다.") + @MethodSource("provideNonAccessibleAccessorForCommunityArticle") + void cantWriteCommunityArticleByNonParticipants(final Accessor accessor) { + final Member owner = createMember(1L); + final StudyRoom studyRoom = createStudyRoom(1L, owner); + final CommunityContent sut = new CommunityContent("제목", "설명"); + + assertThatThrownBy(() -> sut.createArticle(studyRoom, accessor)) + .isInstanceOf(UneditableArticleException.class); + } + + private static Stream provideNonAccessibleAccessorForCommunityArticle() { + return Stream.of( + Arguments.of(new Accessor(2L, 1L)), // memberId가 잘못된 경우 + Arguments.of(new Accessor(1L, 2L)) // studyId가 잘못된 경우 + ); + } + + private StudyRoom createStudyRoom(long studyId, Member owner, Member... participant) { + final Set participants = Stream.of(participant) + .map(Member::getId) + .collect(Collectors.toSet()); + return new StudyRoom(studyId, owner.getId(), participants); + } + + private Member createMember(final long id) { + return new Member(id, id, "username" + id, "image", "profile"); + } +} diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticleTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticleTest.java index c59a4fbf8..2f19e65fc 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticleTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticleTest.java @@ -25,7 +25,8 @@ void update() { final Member owner = createMember(1L); final StudyRoom studyRoom = createStudyRoom(1L, owner); final Accessor accessor = new Accessor(owner.getId(), studyRoom.getId()); - final LinkArticle sut = studyRoom.writeLinkArticle(accessor, new LinkContent("link", "설명")); + final LinkContent linkContent = new LinkContent("link", "설명"); + final LinkArticle sut = linkContent.createArticle(studyRoom, accessor); // act sut.update(accessor, new LinkContent("updated link", "수정된 설명")); @@ -43,8 +44,8 @@ void update() { void updateByNotAuthor(final long memberId, final long studyId) { final Member owner = createMember(1L); final StudyRoom studyRoom = createStudyRoom(1L, owner); - final LinkArticle sut = studyRoom.writeLinkArticle(new Accessor(owner.getId(), studyRoom.getId()), - new LinkContent("link", "설명")); + final LinkContent linkContent = new LinkContent("link", "설명"); + final LinkArticle sut = linkContent.createArticle(studyRoom, new Accessor(owner.getId(), studyRoom.getId())); assertThatThrownBy(() -> sut.update(new Accessor(memberId, studyId), new LinkContent("updated link", "수정된 설명"))) .isInstanceOf(UneditableArticleException.class); @@ -55,13 +56,12 @@ void updateByNotAuthor(final long memberId, final long studyId) { void delete() { final Member owner = createMember(1L); final StudyRoom studyRoom = createStudyRoom(1L, owner); + final LinkContent linkContent = new LinkContent("link", "설명"); + final LinkArticle sut = linkContent.createArticle(studyRoom, new Accessor(owner.getId(), studyRoom.getId())); - final LinkArticle linkArticle = studyRoom.writeLinkArticle(new Accessor(owner.getId(), studyRoom.getId()), - new LinkContent("link", "설명")); + sut.delete(new Accessor(1L, 1L)); - linkArticle.delete(new Accessor(1L, 1L)); - - assertThat(linkArticle.isDeleted()).isTrue(); + assertThat(sut.isDeleted()).isTrue(); } @ParameterizedTest @@ -70,11 +70,10 @@ void delete() { void deleteByNotAuthor(final long memberId, final long studyId) { final Member owner = createMember(1L); final StudyRoom studyRoom = createStudyRoom(1L, owner); + final LinkContent linkContent = new LinkContent("link", "설명"); + final LinkArticle sut = linkContent.createArticle(studyRoom, new Accessor(owner.getId(), studyRoom.getId())); - final LinkArticle linkArticle = studyRoom.writeLinkArticle(new Accessor(owner.getId(), studyRoom.getId()), - new LinkContent("link", "설명")); - - assertThatThrownBy(() -> linkArticle.delete(new Accessor(memberId, studyId))) + assertThatThrownBy(() -> sut.delete(new Accessor(memberId, studyId))) .isInstanceOf(UneditableArticleException.class); } diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/LinkContentTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/LinkContentTest.java new file mode 100644 index 000000000..17fc6b6a6 --- /dev/null +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/LinkContentTest.java @@ -0,0 +1,75 @@ +package com.woowacourse.moamoa.studyroom.domain.article; + +import static org.assertj.core.api.Assertions.assertThatCode; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import com.woowacourse.moamoa.member.domain.Member; +import com.woowacourse.moamoa.studyroom.domain.Accessor; +import com.woowacourse.moamoa.studyroom.domain.StudyRoom; +import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +class LinkContentTest { + + @ParameterizedTest + @DisplayName("링크 게시글을 스터디에 참여한 인원은 작성할 수 있다.") + @MethodSource("provideAccessibleAccessorForLinkArticle") + void writeLinkArticleByAccessibleAccessor(final Accessor accessor) { + // arrange + final Member owner = createMember(1L); + final Member participant = createMember(2L); + final StudyRoom studyRoom = createStudyRoom(1L, owner, participant); + final LinkContent sut = new LinkContent("link", "설명"); + + // act & assert + assertThatCode(() -> sut.createArticle(studyRoom, accessor)) + .doesNotThrowAnyException(); + } + + private static Stream provideAccessibleAccessorForLinkArticle() { + return Stream.of( + Arguments.of(new Accessor(1L, 1L)), // 방장 + Arguments.of(new Accessor(2L, 1L)) // 일반 참여자 + ); + } + + @ParameterizedTest + @DisplayName("링크글을 스터디 참여자만 작성할 수 있다.") + @MethodSource("provideNonAccessibleAccessorForLinkArticle") + void cantWriteLinkArticleByNonAccessibleAccessor(final Accessor accessor) { + // arrange + final Member owner = createMember(1L); + final StudyRoom studyRoom = createStudyRoom(1L, owner); + + // act & assert + final LinkContent sut = new LinkContent("link", "설명"); + + // act & assert + assertThatThrownBy(() -> sut.createArticle(studyRoom, accessor)) + .isInstanceOf(UneditableArticleException.class); + } + + private static Stream provideNonAccessibleAccessorForLinkArticle() { + return Stream.of( + Arguments.of(new Accessor(1L, 2L)), // studyId가 잘못된 경우 + Arguments.of(new Accessor(2L, 1L)) // 스터디에 참여하지 않은 접근자 + ); + } + + private StudyRoom createStudyRoom(long studyId, Member owner, Member... participant) { + final Set participants = Stream.of(participant) + .map(Member::getId) + .collect(Collectors.toSet()); + return new StudyRoom(studyId, owner.getId(), participants); + } + + private Member createMember(final long id) { + return new Member(id, id, "username" + id, "image", "profile"); + } +} diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/ArticleServiceTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/ArticleServiceTest.java new file mode 100644 index 000000000..cf4bc0dcd --- /dev/null +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/ArticleServiceTest.java @@ -0,0 +1,144 @@ +package com.woowacourse.moamoa.studyroom.service; + +import static com.woowacourse.moamoa.fixtures.MemberFixtures.디우; +import static com.woowacourse.moamoa.fixtures.MemberFixtures.짱구; +import static com.woowacourse.moamoa.fixtures.StudyFixtures.자바_스터디_신청서; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import com.woowacourse.moamoa.common.RepositoryTest; +import com.woowacourse.moamoa.common.utils.DateTimeSystem; +import com.woowacourse.moamoa.member.domain.Member; +import com.woowacourse.moamoa.member.domain.repository.MemberRepository; +import com.woowacourse.moamoa.study.domain.Study; +import com.woowacourse.moamoa.study.domain.repository.StudyRepository; +import com.woowacourse.moamoa.study.service.StudyService; +import com.woowacourse.moamoa.study.service.request.StudyRequest; +import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; +import com.woowacourse.moamoa.studyroom.domain.article.LinkContent; +import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; +import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; +import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; +import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; +import com.woowacourse.moamoa.studyroom.service.request.LinkArticleRequest; +import java.time.LocalDate; +import javax.persistence.EntityManager; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.jpa.repository.JpaRepository; + +@RepositoryTest +class ArticleServiceTest { + + @Autowired + private MemberRepository memberRepository; + + @Autowired + private StudyRepository studyRepository; + + @Autowired + private StudyRoomRepository studyRoomRepository; + + @Autowired + private JpaRepository articleRepository; + + @Autowired + private EntityManager entityManager; + + private StudyService studyService; + + private ArticleService sut; + + @BeforeEach + void setUp() { + studyService = new StudyService(studyRepository, memberRepository, new DateTimeSystem()); + + sut = new ArticleService<>(studyRoomRepository, articleRepository); + } + + @DisplayName("스터디에 참여하지 않은 회원은 링크 공유를 할 수 없다.") + @Test + void createByNotParticipatedMember() { + final Member 짱구 = saveMember(짱구()); + final Member 디우 = saveMember(디우()); + final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); + + final ArticleRequest articleRequest = new LinkArticleRequest("www.naver.com", "설명"); + + assertThatThrownBy(() -> sut.createArticle(디우.getId(), 자바_스터디.getId(), articleRequest)) + .isInstanceOf(UneditableArticleException.class); + } + + @DisplayName("존재하지 않는 링크 공유글을 수정할 수 없다.") + @Test + void updateByInvalidLinkId() { + final Member 짱구 = saveMember(짱구()); + final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); + + final ArticleRequest articleRequest = new LinkArticleRequest("www.naver.com", "수정"); + + assertThatThrownBy(() -> sut.updateArticle(짱구.getId(), 자바_스터디.getId(), -1L, articleRequest)) + .isInstanceOf(ArticleNotFoundException.class); + } + + @DisplayName("스터디에 참여하지 않은 경우 링크 공유글을 수정할 수 없다.") + @Test + void updateByNotParticipatedMember() { + final Member 짱구 = saveMember(짱구()); + final Member 디우 = saveMember(디우()); + final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); + + final ArticleRequest articleRequest = new LinkArticleRequest("www.naver.com", "설명"); + final LinkArticle 링크_게시글 = createArticle(짱구, 자바_스터디, articleRequest); + + assertThatThrownBy(() -> sut.updateArticle(디우.getId(), 자바_스터디.getId(), 링크_게시글.getId(), articleRequest)) + .isInstanceOf(UneditableArticleException.class); + } + + @DisplayName("존재하지 않는 링크 공유글을 삭제할 수 없다.") + @Test + void deleteByInvalidLinkId() { + final Member 짱구 = saveMember(짱구()); + final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); + + assertThatThrownBy(() -> sut.deleteArticle(짱구.getId(), 자바_스터디.getId(), -1L)) + .isInstanceOf(ArticleNotFoundException.class); + } + + @DisplayName("스터디에 참여하지 않은 경우 링크 공유글을 삭제할 수 없다.") + @Test + void deleteByNotParticipatedMember() { + final Member 짱구 = saveMember(짱구()); + final Member 디우 = saveMember(디우()); + final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); + + final ArticleRequest articleRequest = new LinkArticleRequest("www.naver.com", "설명"); + final LinkArticle 링크_게시글 = sut.createArticle(짱구.getId(), 자바_스터디.getId(), articleRequest); + + assertThatThrownBy(() -> sut.deleteArticle(디우.getId(), 자바_스터디.getId(), 링크_게시글.getId())) + .isInstanceOf(UneditableArticleException.class); + } + + private Member saveMember(final Member member) { + final Member savedMember = memberRepository.save(member); + entityManager.flush(); + entityManager.clear(); + return savedMember; + } + + private Study createStudy(final Member owner, StudyRequest studyRequest) { + final Study study = studyService.createStudy(owner.getId(), studyRequest); + entityManager.flush(); + entityManager.clear(); + return study; + } + + private LinkArticle createArticle(final Member author, final Study study, + final ArticleRequest articleRequest) { + final LinkArticle article = sut.createArticle(author.getId(), study.getId(), articleRequest); + entityManager.flush(); + entityManager.clear(); + return article; + } +} diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/CreatingNoticeArticleControllerWebMvcTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/CreatingNoticeArticleControllerWebMvcTest.java index 04ae5f368..1986b9779 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/CreatingNoticeArticleControllerWebMvcTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/CreatingNoticeArticleControllerWebMvcTest.java @@ -7,7 +7,7 @@ import com.woowacourse.moamoa.WebMVCTest; import com.woowacourse.moamoa.studyroom.service.NoticeArticleService; -import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; +import com.woowacourse.moamoa.studyroom.service.request.CommunityArticleRequest; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -57,7 +57,7 @@ void badRequestByNullOrEmptyTitle(String title) throws Exception { post("/api/studies/{study-id}/community/articles", "1") .header(HttpHeaders.AUTHORIZATION, token) .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(new ArticleRequest(title, "content"))) + .content(objectMapper.writeValueAsString(new CommunityArticleRequest(title, "content"))) ) .andExpect(status().isBadRequest()) .andDo(print()); @@ -73,7 +73,7 @@ void badRequestByNullOrEmptyContent(String content) throws Exception { post("/api/studies/{study-id}/community/articles", "1") .header(HttpHeaders.AUTHORIZATION, token) .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(new ArticleRequest("title", content))) + .content(objectMapper.writeValueAsString(new CommunityArticleRequest("title", content))) ) .andExpect(status().isBadRequest()) .andDo(print()); @@ -89,7 +89,7 @@ void badRequestByBlankTitle(String title) throws Exception { post("/api/studies/{study-id}/community/articles", "1") .header(HttpHeaders.AUTHORIZATION, token) .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(new ArticleRequest(title, "content"))) + .content(objectMapper.writeValueAsString(new CommunityArticleRequest(title, "content"))) ) .andExpect(status().isBadRequest()) .andDo(print()); @@ -105,7 +105,7 @@ void badRequestByBlankContent(String content) throws Exception { post("/api/studies/{study-id}/community/articles", "1") .header(HttpHeaders.AUTHORIZATION, token) .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(new ArticleRequest("title", content))) + .content(objectMapper.writeValueAsString(new CommunityArticleRequest("title", content))) ) .andExpect(status().isBadRequest()) .andDo(print()); @@ -120,7 +120,7 @@ void badRequestByInvalidLengthTitle() throws Exception { post("/api/studies/{study-id}/community/articles", "1") .header(HttpHeaders.AUTHORIZATION, token) .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(new ArticleRequest("a".repeat(31), "cotent"))) + .content(objectMapper.writeValueAsString(new CommunityArticleRequest("a".repeat(31), "cotent"))) ) .andExpect(status().isBadRequest()) .andDo(print()); @@ -135,7 +135,7 @@ void badRequestByInvalidLengthContent() throws Exception { post("/api/studies/{study-id}/community/articles", "1") .header(HttpHeaders.AUTHORIZATION, token) .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(new ArticleRequest("a".repeat(5001), "cotent"))) + .content(objectMapper.writeValueAsString(new CommunityArticleRequest("a".repeat(5001), "cotent"))) ) .andExpect(status().isBadRequest()) .andDo(print()); diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/UpdatingNoticeArticleControllerWebMvcTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/UpdatingNoticeArticleControllerWebMvcTest.java index b1b6b18e1..3d4d2b7f0 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/UpdatingNoticeArticleControllerWebMvcTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/UpdatingNoticeArticleControllerWebMvcTest.java @@ -5,7 +5,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import com.woowacourse.moamoa.WebMVCTest; -import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; +import com.woowacourse.moamoa.studyroom.service.request.CommunityArticleRequest; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -53,7 +53,7 @@ void badRequestByNullOrEmptyTitle(String title) throws Exception { put("/api/studies/{study-id}/community/articles/{article-id}", "1", "1") .header(HttpHeaders.AUTHORIZATION, token) .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(new ArticleRequest(title, "content"))) + .content(objectMapper.writeValueAsString(new CommunityArticleRequest(title, "content"))) ) .andExpect(status().isBadRequest()) .andDo(print()); @@ -69,7 +69,7 @@ void badRequestByNullOrEmptyContent(String content) throws Exception { put("/api/studies/{study-id}/community/articles/{article-id}", "1", "1") .header(HttpHeaders.AUTHORIZATION, token) .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(new ArticleRequest("title", content))) + .content(objectMapper.writeValueAsString(new CommunityArticleRequest("title", content))) ) .andExpect(status().isBadRequest()) .andDo(print()); @@ -85,7 +85,7 @@ void badRequestByBlankTitle(String title) throws Exception { put("/api/studies/{study-id}/community/articles/{article-id}", "1", "1") .header(HttpHeaders.AUTHORIZATION, token) .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(new ArticleRequest(title, "content"))) + .content(objectMapper.writeValueAsString(new CommunityArticleRequest(title, "content"))) ) .andExpect(status().isBadRequest()) .andDo(print()); @@ -101,7 +101,7 @@ void badRequestByBlankContent(String content) throws Exception { put("/api/studies/{study-id}/community/articles/{article-id}", "1", "1") .header(HttpHeaders.AUTHORIZATION, token) .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(new ArticleRequest("title", content))) + .content(objectMapper.writeValueAsString(new CommunityArticleRequest("title", content))) ) .andExpect(status().isBadRequest()) .andDo(print()); @@ -116,7 +116,7 @@ void badRequestByInvalidLengthTitle() throws Exception { put("/api/studies/{study-id}/community/articles/{article-id}", "1", "1") .header(HttpHeaders.AUTHORIZATION, token) .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(new ArticleRequest("a".repeat(31), "cotent"))) + .content(objectMapper.writeValueAsString(new CommunityArticleRequest("a".repeat(31), "cotent"))) ) .andExpect(status().isBadRequest()) .andDo(print()); @@ -131,7 +131,7 @@ void badRequestByInvalidLengthContent() throws Exception { put("/api/studies/{study-id}/community/articles/{article-id}", "1", "1") .header(HttpHeaders.AUTHORIZATION, token) .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(new ArticleRequest("a".repeat(5001), "cotent"))) + .content(objectMapper.writeValueAsString(new CommunityArticleRequest("a".repeat(5001), "cotent"))) ) .andExpect(status().isBadRequest()) .andDo(print()); From 503e38d336127e5cbe2fbdf86146fb818d49bcc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=A7=84=ED=98=81?= Date: Fri, 16 Sep 2022 00:49:13 +0900 Subject: [PATCH 23/40] =?UTF-8?q?refactor:=20NoticeArticle=20=EC=A0=9C?= =?UTF-8?q?=EB=84=A4=EB=A6=AD=20=EC=A0=81=EC=9A=A9=20=EB=B0=8F=20ArticleSe?= =?UTF-8?q?rvice=20=EC=B6=94=EC=83=81=ED=99=94=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=EB=A1=9C=20=EC=A0=84=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/ArticleServiceConfig.java | 29 --------- .../CommunityArticleController.java | 14 ++--- .../controller/LinkArticleController.java | 14 ++--- .../controller/NoticeArticleController.java | 8 +-- .../moamoa/studyroom/domain/StudyRoom.java | 15 +---- .../domain/article/CommunityArticle.java | 4 +- .../studyroom/domain/article/LinkArticle.java | 2 +- .../domain/article/NoticeArticle.java | 33 +++++----- .../domain/article/NoticeContent.java | 60 +++++++++++++++++++ .../exception/ArticleNotFoundException.java | 8 ++- ...rvice.java => AbstractArticleService.java} | 21 +++---- .../service/CommunityArticleService.java | 10 +++- .../studyroom/service/LinkArticleService.java | 12 +++- .../service/NoticeArticleService.java | 46 ++------------ .../service/request/NoticeArticleRequest.java | 30 ++++++++++ .../com/woowacourse/moamoa/WebMVCTest.java | 10 +--- .../DeletingNoticeArticleControllerTest.java | 15 +++-- .../GettingNoticeArticleControllerTest.java | 12 +++- ...NoticeArticleSummariesControllerTest.java} | 23 ++++--- .../controller/LinkArticleControllerTest.java | 13 ++-- .../NoticeArticleControllerTest.java | 30 +++++----- .../UpdatingNoticeArticleControllerTest.java | 29 +++++---- .../domain/article/NoticeArticleTest.java | 26 ++++---- .../NoticeContentTest.java} | 12 ++-- ...t.java => AbstractArticleServiceTest.java} | 11 ++-- 25 files changed, 260 insertions(+), 227 deletions(-) delete mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/config/ArticleServiceConfig.java create mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeContent.java rename backend/src/main/java/com/woowacourse/moamoa/studyroom/service/{ArticleService.java => AbstractArticleService.java} (82%) create mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/NoticeArticleRequest.java rename backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/{GettingCommunityArticleSummariesControllerTest.java => GettingNoticeArticleSummariesControllerTest.java} (87%) rename backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/{StudyRoomTest.java => article/NoticeContentTest.java} (81%) rename backend/src/test/java/com/woowacourse/moamoa/studyroom/service/{ArticleServiceTest.java => AbstractArticleServiceTest.java} (95%) diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/config/ArticleServiceConfig.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/config/ArticleServiceConfig.java deleted file mode 100644 index 5b54a4237..000000000 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/config/ArticleServiceConfig.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.woowacourse.moamoa.studyroom.config; - -import com.woowacourse.moamoa.studyroom.domain.article.CommunityArticle; -import com.woowacourse.moamoa.studyroom.domain.article.CommunityContent; -import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; -import com.woowacourse.moamoa.studyroom.domain.article.LinkContent; -import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; -import com.woowacourse.moamoa.studyroom.service.ArticleService; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.data.jpa.repository.JpaRepository; - -@Configuration -public class ArticleServiceConfig { - - @Bean - public ArticleService linkGenericArticleService( - StudyRoomRepository studyRoomRepository, JpaRepository articleRepository - ) { - return new ArticleService<>(studyRoomRepository, articleRepository); - } - - @Bean - public ArticleService communityGenericArticleService( - StudyRoomRepository studyRoomRepository, JpaRepository articleRepository - ) { - return new ArticleService<>(studyRoomRepository, articleRepository); - } -} diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/CommunityArticleController.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/CommunityArticleController.java index 3124c75b9..d3ec3c19e 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/CommunityArticleController.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/CommunityArticleController.java @@ -2,8 +2,6 @@ import com.woowacourse.moamoa.auth.config.AuthenticatedMemberId; import com.woowacourse.moamoa.studyroom.domain.article.CommunityArticle; -import com.woowacourse.moamoa.studyroom.domain.article.CommunityContent; -import com.woowacourse.moamoa.studyroom.service.ArticleService; import com.woowacourse.moamoa.studyroom.service.CommunityArticleService; import com.woowacourse.moamoa.studyroom.service.request.CommunityArticleRequest; import com.woowacourse.moamoa.studyroom.service.response.ArticleResponse; @@ -29,12 +27,8 @@ public class CommunityArticleController { private final CommunityArticleService communityArticleService; - private final ArticleService articleService; - - public CommunityArticleController(final CommunityArticleService communityArticleService, - final ArticleService articleService) { + public CommunityArticleController(final CommunityArticleService communityArticleService) { this.communityArticleService = communityArticleService; - this.articleService = articleService; } @PostMapping @@ -42,7 +36,7 @@ public ResponseEntity createArticle(@AuthenticatedMemberId final Long id, @PathVariable("study-id") final Long studyId, @Valid @RequestBody final CommunityArticleRequest request ) { - final CommunityArticle article = articleService.createArticle(id, studyId, request); + final CommunityArticle article = communityArticleService.createArticle(id, studyId, request); final URI location = URI.create("/api/studies/" + studyId + "/community/articles/" + article.getId()); return ResponseEntity.created(location).header("Access-Control-Allow-Headers", HttpHeaders.LOCATION).build(); } @@ -58,7 +52,7 @@ public ResponseEntity deleteArticle(@AuthenticatedMemberId final Long id, @PathVariable("study-id") final Long studyId, @PathVariable("article-id") final Long articleId ) { - articleService.deleteArticle(id, studyId, articleId); + communityArticleService.deleteArticle(id, studyId, articleId); return ResponseEntity.noContent().build(); } @@ -76,7 +70,7 @@ public ResponseEntity updateArticle(@AuthenticatedMemberId final Long id, @PathVariable("article-id") final Long articleId, @Valid @RequestBody final CommunityArticleRequest request ) { - articleService.updateArticle(id, studyId, articleId, request); + communityArticleService.updateArticle(id, studyId, articleId, request); return ResponseEntity.noContent().build(); } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleController.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleController.java index 0bb2203b1..170b46568 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleController.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleController.java @@ -1,9 +1,6 @@ package com.woowacourse.moamoa.studyroom.controller; import com.woowacourse.moamoa.auth.config.AuthenticatedMemberId; -import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; -import com.woowacourse.moamoa.studyroom.domain.article.LinkContent; -import com.woowacourse.moamoa.studyroom.service.ArticleService; import com.woowacourse.moamoa.studyroom.service.LinkArticleService; import com.woowacourse.moamoa.studyroom.service.request.LinkArticleRequest; import com.woowacourse.moamoa.studyroom.service.response.LinksResponse; @@ -26,12 +23,9 @@ public class LinkArticleController { private final LinkArticleService linkArticleService; - private final ArticleService articleService; - public LinkArticleController(final LinkArticleService linkArticleService, - final ArticleService articleService) { + public LinkArticleController(final LinkArticleService linkArticleService) { this.linkArticleService = linkArticleService; - this.articleService = articleService; } @GetMapping @@ -49,7 +43,7 @@ public ResponseEntity createLink( @PathVariable("study-id") final Long studyId, @Valid @RequestBody final LinkArticleRequest articleRequest ) { - final Long id = articleService.createArticle(memberId, studyId, articleRequest).getId(); + final Long id = linkArticleService.createArticle(memberId, studyId, articleRequest).getId(); return ResponseEntity.created(URI.create("/api/studies/" + studyId + "/reference-room/links/" + id)).build(); } @@ -60,7 +54,7 @@ public ResponseEntity updateLink( @PathVariable("link-id") final Long linkId, @Valid @RequestBody final LinkArticleRequest articleRequest ) { - articleService.updateArticle(memberId, studyId, linkId, articleRequest); + linkArticleService.updateArticle(memberId, studyId, linkId, articleRequest); return ResponseEntity.noContent().build(); } @@ -70,7 +64,7 @@ public ResponseEntity deleteLink( @PathVariable("study-id") final Long studyId, @PathVariable("link-id") final Long linkId ) { - articleService.deleteArticle(memberId, studyId, linkId); + linkArticleService.deleteArticle(memberId, studyId, linkId); return ResponseEntity.noContent().build(); } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/NoticeArticleController.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/NoticeArticleController.java index eee548156..b8bd768e0 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/NoticeArticleController.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/NoticeArticleController.java @@ -1,9 +1,9 @@ package com.woowacourse.moamoa.studyroom.controller; +import com.woowacourse.moamoa.auth.config.AuthenticatedMemberId; import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; import com.woowacourse.moamoa.studyroom.service.NoticeArticleService; -import com.woowacourse.moamoa.auth.config.AuthenticatedMemberId; -import com.woowacourse.moamoa.studyroom.service.request.CommunityArticleRequest; +import com.woowacourse.moamoa.studyroom.service.request.NoticeArticleRequest; import com.woowacourse.moamoa.studyroom.service.response.ArticleResponse; import com.woowacourse.moamoa.studyroom.service.response.ArticleSummariesResponse; import java.net.URI; @@ -34,7 +34,7 @@ public NoticeArticleController(final NoticeArticleService noticeArticleService) @PostMapping public ResponseEntity createArticle(@AuthenticatedMemberId final Long id, @PathVariable("study-id") final Long studyId, - @Valid @RequestBody final CommunityArticleRequest request + @Valid @RequestBody final NoticeArticleRequest request ) { final NoticeArticle article = noticeArticleService.createArticle(id, studyId, request); final URI location = URI.create("/api/studies/" + studyId + "/notice/articles/" + article.getId()); @@ -70,7 +70,7 @@ public ResponseEntity getArticles(@PathVariable("study public ResponseEntity updateArticle(@AuthenticatedMemberId final Long id, @PathVariable("study-id") final Long studyId, @PathVariable("article-id") final Long articleId, - @Valid @RequestBody final CommunityArticleRequest request + @Valid @RequestBody final NoticeArticleRequest request ) { noticeArticleService.updateArticle(id, studyId, articleId, request); return ResponseEntity.noContent().build(); diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/StudyRoom.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/StudyRoom.java index ca9a82e79..684c6a914 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/StudyRoom.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/StudyRoom.java @@ -1,11 +1,10 @@ package com.woowacourse.moamoa.studyroom.domain; +import com.woowacourse.moamoa.studyroom.domain.article.Article; import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; -import com.woowacourse.moamoa.studyroom.domain.article.CommunityArticle; -import com.woowacourse.moamoa.studyroom.domain.article.CommunityContent; -import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; -import com.woowacourse.moamoa.studyroom.domain.article.LinkContent; +import com.woowacourse.moamoa.studyroom.domain.article.Content; import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; +import com.woowacourse.moamoa.studyroom.domain.article.NoticeContent; import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; import java.util.Objects; import java.util.Set; @@ -42,14 +41,6 @@ public boolean isPermittedAccessor(final Accessor accessor) { return studyId.equals(accessor.getStudyId()) && permittedParticipants.isPermittedAccessor(accessor); } - public NoticeArticle writeNoticeArticle(final Accessor accessor, final String title, final String content) { - if (isOwner(accessor)) { - return new NoticeArticle(title, content, accessor.getMemberId(), this); - } - - throw new UneditableArticleException(studyId, accessor, ArticleType.NOTICE); - } - public Long getId() { return studyId; } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticle.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticle.java index a968d52e3..3d5f8cbc8 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticle.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticle.java @@ -43,11 +43,11 @@ public class CommunityArticle extends BaseEntity implements Article{ @Column(nullable = false) private boolean deleted; - public LinkArticle(final StudyRoom studyRoom, final Long authorId, final LinkContent content) { + LinkArticle(final StudyRoom studyRoom, final Long authorId, final LinkContent content) { this(null, studyRoom, authorId, content); } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticle.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticle.java index 3d2142596..9db46a2ab 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticle.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticle.java @@ -8,6 +8,7 @@ import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; import java.util.Objects; import javax.persistence.Column; +import javax.persistence.Embedded; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; @@ -25,7 +26,7 @@ @Getter @Table(name = "notice") @Where(clause = "deleted = false") -public class NoticeArticle extends BaseEntity { +public class NoticeArticle extends BaseEntity implements Article { @Id @GeneratedValue(strategy = IDENTITY) @@ -38,36 +39,34 @@ public class NoticeArticle extends BaseEntity { @JoinColumn(name = "study_id") private StudyRoom studyRoom; - private String title; - - private String content; + @Embedded + private NoticeContent content; private boolean deleted; - public NoticeArticle(final String title, final String content, final Long authorId, - final StudyRoom studyRoom) { - this(null, title, content, authorId, studyRoom); + NoticeArticle(final Long authorId, final StudyRoom studyRoom, final NoticeContent content) { + this(null, authorId, studyRoom, content); } - public NoticeArticle(final Long id, final String title, final String content, final Long authorId, - final StudyRoom studyRoom) { - this.title = title; - this.content = content; + private NoticeArticle(final Long id, final Long authorId, + final StudyRoom studyRoom, final NoticeContent content) { this.id = id; this.authorId = authorId; this.studyRoom = studyRoom; this.deleted = false; + this.content = content; } - public final void update(final Accessor accessor, final String title, final String content) { + @Override + public void update(final Accessor accessor, final NoticeContent content) { if (!studyRoom.isOwner(accessor)) { throw new UneditableArticleException(studyRoom.getId(), accessor, ArticleType.NOTICE); } - this.title = title; this.content = content; } + @Override public void delete(final Accessor accessor) { if (!studyRoom.isOwner(accessor)) { throw new UneditableArticleException(studyRoom.getId(), accessor, ArticleType.NOTICE); @@ -89,13 +88,13 @@ public boolean equals(final Object o) { return false; } final NoticeArticle that = (NoticeArticle) o; - return Objects.equals(getId(), that.getId()) && Objects.equals(getTitle(), that.getTitle()) - && Objects.equals(getContent(), that.getContent()) && Objects.equals(getAuthorId(), - that.getAuthorId()) && Objects.equals(getStudyRoom(), that.getStudyRoom()); + return deleted == that.deleted && Objects.equals(id, that.id) && Objects + .equals(authorId, that.authorId) && Objects.equals(studyRoom, that.studyRoom) && Objects + .equals(content, that.content); } @Override public int hashCode() { - return Objects.hash(getId(), getTitle(), getContent(), getAuthorId(), getStudyRoom()); + return Objects.hash(id, authorId, studyRoom, content, deleted); } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeContent.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeContent.java new file mode 100644 index 000000000..fe3dd610a --- /dev/null +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeContent.java @@ -0,0 +1,60 @@ +package com.woowacourse.moamoa.studyroom.domain.article; + +import com.woowacourse.moamoa.studyroom.domain.Accessor; +import com.woowacourse.moamoa.studyroom.domain.StudyRoom; +import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; +import java.util.Objects; +import javax.persistence.Column; +import javax.persistence.Embeddable; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +@Embeddable +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class NoticeContent implements Content { + + @Column(nullable = false) + private String title; + + @Column(nullable = false) + private String content; + + public NoticeContent(final String title, final String content) { + this.title = title; + this.content = content; + } + + @Override + public NoticeArticle createArticle(final StudyRoom studyRoom, final Accessor accessor) { + if (studyRoom.isOwner(accessor)) { + return new NoticeArticle(accessor.getMemberId(), studyRoom, this); + } + + throw new UneditableArticleException(studyRoom.getId(), accessor, ArticleType.NOTICE); + } + + public String getTitle() { + return title; + } + + public String getContent() { + return content; + } + + @Override + public boolean equals(final Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + final NoticeContent that = (NoticeContent) o; + return Objects.equals(title, that.title) && Objects.equals(content, that.content); + } + + @Override + public int hashCode() { + return Objects.hash(title, content); + } +} diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/ArticleNotFoundException.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/ArticleNotFoundException.java index 2eab43c52..feb8f11a0 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/ArticleNotFoundException.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/ArticleNotFoundException.java @@ -1,11 +1,17 @@ package com.woowacourse.moamoa.studyroom.domain.exception; import com.woowacourse.moamoa.common.exception.NotFoundException; +import com.woowacourse.moamoa.studyroom.domain.article.Article; import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; +import com.woowacourse.moamoa.studyroom.domain.article.Content; public class ArticleNotFoundException extends NotFoundException { public ArticleNotFoundException(long articleId, ArticleType type) { - super(String.format("%d의 식별자를 가진 타입 %s의 게시글이 존재하지 않습니다.", articleId, type)); + super(String.format("%d의 식별자를 가진 %s 게시글이 존재하지 않습니다.", articleId, type)); + } + + public ArticleNotFoundException(final Long articleId, final Class> articleType) { + super(String.format("%d의 식별자를 가진 %s 게시글이 존재하지 않습니다.", articleId, articleType.getSimpleName())); } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ArticleService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/AbstractArticleService.java similarity index 82% rename from backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ArticleService.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/service/AbstractArticleService.java index 0d5fd61c4..dc85e2672 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ArticleService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/AbstractArticleService.java @@ -4,25 +4,27 @@ import com.woowacourse.moamoa.studyroom.domain.Accessor; import com.woowacourse.moamoa.studyroom.domain.StudyRoom; import com.woowacourse.moamoa.studyroom.domain.article.Article; -import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; import com.woowacourse.moamoa.studyroom.domain.article.Content; -import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; +import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.transaction.annotation.Transactional; @Transactional -public class ArticleService, C extends Content> { +public abstract class AbstractArticleService, C extends Content> { private final StudyRoomRepository studyRoomRepository; private final JpaRepository articleRepository; + private final Class articleType; - public ArticleService( - final StudyRoomRepository studyRoomRepository, final JpaRepository articleRepository + protected AbstractArticleService( + final StudyRoomRepository studyRoomRepository, final JpaRepository articleRepository, + final Class articleType ) { this.studyRoomRepository = studyRoomRepository; this.articleRepository = articleRepository; + this.articleType = articleType; } public A createArticle( @@ -30,7 +32,6 @@ public A createArticle( ) { final StudyRoom studyRoom = studyRoomRepository.findByStudyId(studyId) .orElseThrow(StudyNotFoundException::new); - final C content = articleRequest.createContent(); final A article = content.createArticle(studyRoom, new Accessor(memberId, studyId)); @@ -41,15 +42,15 @@ public void updateArticle( final Long memberId, final Long studyId, final Long articleId, final ArticleRequest articleRequest ) { final A article = articleRepository.findById(articleId) - .orElseThrow(() -> new ArticleNotFoundException(articleId, ArticleType.LINK)); + .orElseThrow(() -> new ArticleNotFoundException(articleId, articleType)); + final C newContent = articleRequest.createContent(); - article.update(new Accessor(memberId, studyId), articleRequest.createContent()); + article.update(new Accessor(memberId, studyId), newContent); } public void deleteArticle(final Long memberId, final Long studyId, final Long articleId) { final A article = articleRepository.findById(articleId) - .orElseThrow(() -> new ArticleNotFoundException(articleId, ArticleType.LINK)); - + .orElseThrow(() -> new ArticleNotFoundException(articleId, articleType)); final Accessor accessor = new Accessor(memberId, studyId); article.delete(accessor); diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleService.java index cfeb19ed6..a988651a2 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleService.java @@ -1,6 +1,9 @@ package com.woowacourse.moamoa.studyroom.service; import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; +import com.woowacourse.moamoa.studyroom.domain.article.CommunityArticle; +import com.woowacourse.moamoa.studyroom.domain.article.CommunityContent; +import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.CommunityArticleDao; import com.woowacourse.moamoa.studyroom.query.data.ArticleData; import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; @@ -11,16 +14,19 @@ import java.util.stream.Collectors; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service @Transactional(readOnly = true) -public class CommunityArticleService { +public class CommunityArticleService extends AbstractArticleService { private final CommunityArticleDao communityArticleDao; - public CommunityArticleService(final CommunityArticleDao communityArticleDao) { + public CommunityArticleService(final StudyRoomRepository studyRoomRepository, JpaRepository articleRepository, + final CommunityArticleDao communityArticleDao) { + super(studyRoomRepository, articleRepository, CommunityArticle.class); this.communityArticleDao = communityArticleDao; } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java index d61e519e5..004e2c946 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java @@ -1,20 +1,28 @@ package com.woowacourse.moamoa.studyroom.service; +import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; +import com.woowacourse.moamoa.studyroom.domain.article.LinkContent; +import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.LinkArticleDao; import com.woowacourse.moamoa.studyroom.query.data.LinkArticleData; import com.woowacourse.moamoa.studyroom.service.response.LinksResponse; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Slice; +import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service @Transactional -public class LinkArticleService { +public class LinkArticleService extends AbstractArticleService { private final LinkArticleDao linkArticleDao; - public LinkArticleService(final LinkArticleDao linkArticleDao) { + public LinkArticleService(final StudyRoomRepository studyRoomRepository, + final JpaRepository articleRepository, + final LinkArticleDao linkArticleDao + ) { + super(studyRoomRepository, articleRepository, LinkArticle.class); this.linkArticleDao = linkArticleDao; } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleService.java index eb5aad7b1..3033b179e 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleService.java @@ -1,16 +1,12 @@ package com.woowacourse.moamoa.studyroom.service; -import com.woowacourse.moamoa.study.service.exception.StudyNotFoundException; -import com.woowacourse.moamoa.studyroom.domain.Accessor; -import com.woowacourse.moamoa.studyroom.domain.StudyRoom; import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; -import com.woowacourse.moamoa.studyroom.domain.repository.article.NoticeArticleRepository; +import com.woowacourse.moamoa.studyroom.domain.article.NoticeContent; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.NoticeArticleDao; import com.woowacourse.moamoa.studyroom.query.data.ArticleData; import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; -import com.woowacourse.moamoa.studyroom.service.request.CommunityArticleRequest; import com.woowacourse.moamoa.studyroom.service.response.ArticleResponse; import com.woowacourse.moamoa.studyroom.service.response.ArticleSummariesResponse; import com.woowacourse.moamoa.studyroom.service.response.ArticleSummaryResponse; @@ -19,51 +15,30 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service @Transactional(readOnly = true) -public class NoticeArticleService { +public class NoticeArticleService extends AbstractArticleService { - private final StudyRoomRepository studyRoomRepository; - private final NoticeArticleRepository noticeArticleRepository; private final NoticeArticleDao noticeArticleDao; @Autowired public NoticeArticleService(final StudyRoomRepository studyRoomRepository, - final NoticeArticleRepository noticeArticleRepository, + final JpaRepository articleRepository, final NoticeArticleDao noticeArticleDao) { - this.studyRoomRepository = studyRoomRepository; - this.noticeArticleRepository = noticeArticleRepository; + super(studyRoomRepository, articleRepository, NoticeArticle.class); this.noticeArticleDao = noticeArticleDao; } - @Transactional - public NoticeArticle createArticle(final Long memberId, final Long studyId, - final CommunityArticleRequest request) { - final StudyRoom studyRoom = studyRoomRepository.findByStudyId(studyId) - .orElseThrow(StudyNotFoundException::new); - final Accessor accessor = new Accessor(memberId, studyId); - final NoticeArticle article = studyRoom.writeNoticeArticle(accessor, request.getTitle(), request.getContent()); - return noticeArticleRepository.save(article); - } - public ArticleResponse getArticle(final Long articleId) { final ArticleData data = noticeArticleDao.getById(articleId) .orElseThrow(() -> new ArticleNotFoundException(articleId, ArticleType.NOTICE)); return new ArticleResponse(data); } - @Transactional - public void deleteArticle(final Long memberId, final Long studyId, final Long articleId) { - final NoticeArticle article = noticeArticleRepository - .findById(articleId) - .orElseThrow(() -> new ArticleNotFoundException(articleId, ArticleType.NOTICE)); - - article.delete(new Accessor(memberId, studyId)); - } - public ArticleSummariesResponse getArticles(final Long studyId, final Pageable pageable) { final Page page = noticeArticleDao.getAllByStudyId(studyId, pageable); @@ -74,15 +49,4 @@ public ArticleSummariesResponse getArticles(final Long studyId, final Pageable p return new ArticleSummariesResponse(articles, page.getNumber(), page.getTotalPages() - 1, page.getTotalElements()); } - - @Transactional - public void updateArticle(final Long memberId, final Long studyId, final Long articleId, final CommunityArticleRequest request) { - final NoticeArticle article = noticeArticleRepository - .findById(articleId) - .orElseThrow(() -> new ArticleNotFoundException(articleId, ArticleType.NOTICE)); - - final Accessor accessor = new Accessor(memberId, studyId); - - article.update(accessor, request.getTitle(), request.getContent()); - } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/NoticeArticleRequest.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/NoticeArticleRequest.java new file mode 100644 index 000000000..d98d47e61 --- /dev/null +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/NoticeArticleRequest.java @@ -0,0 +1,30 @@ +package com.woowacourse.moamoa.studyroom.service.request; + +import com.woowacourse.moamoa.studyroom.domain.article.NoticeContent; +import javax.validation.constraints.NotBlank; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.hibernate.validator.constraints.Length; + +@Getter +@NoArgsConstructor +public class NoticeArticleRequest implements ArticleRequest { + + @NotBlank(message = "내용을 입력해 주세요.") + @Length(max = 30) + private String title; + + @NotBlank(message = "내용을 입력해 주세요.") + @Length(max = 5000) + private String content; + + public NoticeArticleRequest(final String title, final String content) { + this.title = title; + this.content = content; + } + + @Override + public NoticeContent createContent() { + return new NoticeContent(title, content); + } +} diff --git a/backend/src/test/java/com/woowacourse/moamoa/WebMVCTest.java b/backend/src/test/java/com/woowacourse/moamoa/WebMVCTest.java index fddc33147..a8e4ad4e4 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/WebMVCTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/WebMVCTest.java @@ -15,7 +15,9 @@ import com.woowacourse.moamoa.studyroom.domain.article.CommunityContent; import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; import com.woowacourse.moamoa.studyroom.domain.article.LinkContent; -import com.woowacourse.moamoa.studyroom.service.ArticleService; +import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; +import com.woowacourse.moamoa.studyroom.domain.article.NoticeContent; +import com.woowacourse.moamoa.studyroom.service.AbstractArticleService; import java.util.Optional; import javax.servlet.http.HttpServletRequest; import org.junit.jupiter.api.BeforeEach; @@ -54,12 +56,6 @@ public abstract class WebMVCTest { @MockBean protected NativeWebRequest nativeWebRequest; - @MockBean - protected ArticleService articleService1; - - @MockBean - protected ArticleService articleService2; - @BeforeEach void setUp() { when(memberRepository.findByGithubId(any())) diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/DeletingNoticeArticleControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/DeletingNoticeArticleControllerTest.java index 339698e55..58809b271 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/DeletingNoticeArticleControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/DeletingNoticeArticleControllerTest.java @@ -12,18 +12,21 @@ import com.woowacourse.moamoa.study.service.StudyService; import com.woowacourse.moamoa.study.service.request.StudyRequestBuilder; import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; +import com.woowacourse.moamoa.studyroom.domain.article.NoticeContent; import com.woowacourse.moamoa.studyroom.domain.repository.article.NoticeArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.NoticeArticleDao; +import com.woowacourse.moamoa.studyroom.service.AbstractArticleService; import com.woowacourse.moamoa.studyroom.service.NoticeArticleService; import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; -import com.woowacourse.moamoa.studyroom.service.request.CommunityArticleRequest; +import com.woowacourse.moamoa.studyroom.service.request.NoticeArticleRequest; import java.time.LocalDate; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.jpa.repository.JpaRepository; @RepositoryTest class DeletingNoticeArticleControllerTest { @@ -46,6 +49,9 @@ class DeletingNoticeArticleControllerTest { @Autowired private NoticeArticleDao noticeArticleDao; + @Autowired + private JpaRepository articleRepository; + private StudyService studyService; private NoticeArticleController sut; private NoticeArticleService noticeArticleService; @@ -53,8 +59,7 @@ class DeletingNoticeArticleControllerTest { @BeforeEach void setUp() { studyService = new StudyService(studyRepository, memberRepository, new DateTimeSystem()); - noticeArticleService = new NoticeArticleService(studyRoomRepository, - noticeArticleRepository, noticeArticleDao); + noticeArticleService = new NoticeArticleService(studyRoomRepository, articleRepository, noticeArticleDao); sut = new NoticeArticleController(noticeArticleService); } @@ -67,7 +72,7 @@ void deleteCommunityArticle() { Study study = studyService .createStudy(member.getId(), javaStudyRequest.startDate(LocalDate.now()).build()); - CommunityArticleRequest request = new CommunityArticleRequest("게시글 제목", "게시글 내용"); + NoticeArticleRequest request = new NoticeArticleRequest("게시글 제목", "게시글 내용"); NoticeArticle article = noticeArticleService.createArticle(member.getId(), study.getId(), request); //act @@ -103,7 +108,7 @@ void throwExceptionWhenDeletingByNotParticipant() { Study study = studyService .createStudy(member.getId(), javaStudyRequest.startDate(LocalDate.now()).build()); - CommunityArticleRequest request = new CommunityArticleRequest("게시글 제목", "게시글 내용"); + NoticeArticleRequest request = new NoticeArticleRequest("게시글 제목", "게시글 내용"); NoticeArticle article = noticeArticleService.createArticle(member.getId(), study.getId(), request); final Long otherId = other.getId(); diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingNoticeArticleControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingNoticeArticleControllerTest.java index 2c4c52153..dbdea7683 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingNoticeArticleControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingNoticeArticleControllerTest.java @@ -12,12 +12,14 @@ import com.woowacourse.moamoa.study.service.StudyService; import com.woowacourse.moamoa.study.service.request.StudyRequestBuilder; import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; +import com.woowacourse.moamoa.studyroom.domain.article.NoticeContent; import com.woowacourse.moamoa.studyroom.domain.repository.article.NoticeArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.NoticeArticleDao; +import com.woowacourse.moamoa.studyroom.service.AbstractArticleService; import com.woowacourse.moamoa.studyroom.service.NoticeArticleService; import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; -import com.woowacourse.moamoa.studyroom.service.request.CommunityArticleRequest; +import com.woowacourse.moamoa.studyroom.service.request.NoticeArticleRequest; import com.woowacourse.moamoa.studyroom.service.response.ArticleResponse; import com.woowacourse.moamoa.studyroom.service.response.AuthorResponse; import java.time.LocalDate; @@ -25,6 +27,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -49,6 +52,9 @@ class GettingNoticeArticleControllerTest { @Autowired private NoticeArticleDao noticeArticleDao; + @Autowired + private JpaRepository articleRepository; + private StudyService studyService; private NoticeArticleController sut; private NoticeArticleService noticeArticleService; @@ -56,7 +62,7 @@ class GettingNoticeArticleControllerTest { @BeforeEach void setUp() { studyService = new StudyService(studyRepository, memberRepository, new DateTimeSystem()); - noticeArticleService = new NoticeArticleService(studyRoomRepository, noticeArticleRepository, noticeArticleDao); + noticeArticleService = new NoticeArticleService(studyRoomRepository, articleRepository, noticeArticleDao); sut = new NoticeArticleController(noticeArticleService); } @@ -68,7 +74,7 @@ void getStudyCommunityArticle() { Study study = studyService .createStudy(member.getId(), javaStudyRequest.startDate(LocalDate.now()).build()); - CommunityArticleRequest request = new CommunityArticleRequest("게시글 제목", "게시글 내용"); + NoticeArticleRequest request = new NoticeArticleRequest("게시글 제목", "게시글 내용"); NoticeArticle article = noticeArticleService.createArticle(member.getId(), study.getId(), request); //act diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingCommunityArticleSummariesControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingNoticeArticleSummariesControllerTest.java similarity index 87% rename from backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingCommunityArticleSummariesControllerTest.java rename to backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingNoticeArticleSummariesControllerTest.java index a7c48487c..c61d4a942 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingCommunityArticleSummariesControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingNoticeArticleSummariesControllerTest.java @@ -12,11 +12,13 @@ import com.woowacourse.moamoa.study.service.StudyService; import com.woowacourse.moamoa.study.service.request.StudyRequestBuilder; import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; +import com.woowacourse.moamoa.studyroom.domain.article.NoticeContent; import com.woowacourse.moamoa.studyroom.domain.repository.article.NoticeArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.NoticeArticleDao; +import com.woowacourse.moamoa.studyroom.service.AbstractArticleService; import com.woowacourse.moamoa.studyroom.service.NoticeArticleService; -import com.woowacourse.moamoa.studyroom.service.request.CommunityArticleRequest; +import com.woowacourse.moamoa.studyroom.service.request.NoticeArticleRequest; import com.woowacourse.moamoa.studyroom.service.response.ArticleSummariesResponse; import com.woowacourse.moamoa.studyroom.service.response.ArticleSummaryResponse; import com.woowacourse.moamoa.studyroom.service.response.AuthorResponse; @@ -27,11 +29,12 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.PageRequest; +import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @RepositoryTest -class GettingCommunityArticleSummariesControllerTest { +class GettingNoticeArticleSummariesControllerTest { StudyRequestBuilder javaStudyRequest = new StudyRequestBuilder() .title("java 스터디").excerpt("자바 설명").thumbnail("java image").description("자바 소개"); @@ -55,12 +58,14 @@ class GettingCommunityArticleSummariesControllerTest { @Autowired private NoticeArticleDao noticeArticleDao; + @Autowired + private JpaRepository articleRepository; + private NoticeArticleController sut; @BeforeEach void setUp() { - noticeArticleService = new NoticeArticleService(studyRoomRepository, - noticeArticleRepository, noticeArticleDao); + noticeArticleService = new NoticeArticleService(studyRoomRepository, articleRepository, noticeArticleDao); studyService = new StudyService(studyRepository, memberRepository, new DateTimeSystem()); sut = new NoticeArticleController(noticeArticleService); } @@ -74,15 +79,15 @@ void getCommunityArticles() { Study study = studyService.createStudy(그린론.getId(), javaStudyRequest.startDate(LocalDate.now()).build()); noticeArticleService - .createArticle(그린론.getId(), study.getId(), new CommunityArticleRequest("제목1", "내용1")); + .createArticle(그린론.getId(), study.getId(), new NoticeArticleRequest("제목1", "내용1")); noticeArticleService - .createArticle(그린론.getId(), study.getId(), new CommunityArticleRequest("제목2", "내용2")); + .createArticle(그린론.getId(), study.getId(), new NoticeArticleRequest("제목2", "내용2")); NoticeArticle article3 = noticeArticleService - .createArticle(그린론.getId(), study.getId(), new CommunityArticleRequest("제목3", "내용3")); + .createArticle(그린론.getId(), study.getId(), new NoticeArticleRequest("제목3", "내용3")); NoticeArticle article4 = noticeArticleService - .createArticle(그린론.getId(), study.getId(), new CommunityArticleRequest("제목4", "내용4")); + .createArticle(그린론.getId(), study.getId(), new NoticeArticleRequest("제목4", "내용4")); NoticeArticle article5 = noticeArticleService - .createArticle(그린론.getId(), study.getId(), new CommunityArticleRequest("제목5", "내용5")); + .createArticle(그린론.getId(), study.getId(), new NoticeArticleRequest("제목5", "내용5")); // act ResponseEntity response = sut.getArticles(study.getId(), PageRequest.of(0, 3)); diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java index 9f1772b47..271f58a80 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java @@ -19,7 +19,7 @@ import com.woowacourse.moamoa.studyroom.domain.repository.article.LinkArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.LinkArticleDao; -import com.woowacourse.moamoa.studyroom.service.ArticleService; +import com.woowacourse.moamoa.studyroom.service.AbstractArticleService; import com.woowacourse.moamoa.studyroom.service.LinkArticleService; import com.woowacourse.moamoa.studyroom.service.request.LinkArticleRequest; import java.time.LocalDate; @@ -58,15 +58,12 @@ class LinkArticleControllerTest { private StudyService studyService; private LinkArticleService linkArticleService; - private ArticleService articleService; @BeforeEach void setUp() { - linkArticleService = new LinkArticleService(linkArticleDao); + linkArticleService = new LinkArticleService(studyRoomRepository, articleRepository, linkArticleDao); studyService = new StudyService(studyRepository, memberRepository, new DateTimeSystem()); - - articleService = new ArticleService<>(studyRoomRepository, articleRepository); - sut = new LinkArticleController(linkArticleService, articleService); + sut = new LinkArticleController(linkArticleService); } @DisplayName("스터디에 참여하지 않은 회원은 링크 공유를 할 수 없다.") @@ -110,7 +107,7 @@ void updateByNotParticipatedMember() { final Study 자바_스터디 = studyService.createStudy(짱구.getId(), 자바_스터디_신청서(LocalDate.now())); final LinkArticleRequest articleRequest = new LinkArticleRequest("https://github.com/sc0116", "링크 설명입니다."); - final LinkArticle 링크_게시글 = articleService.createArticle(짱구.getId(), 자바_스터디.getId(), articleRequest); + final LinkArticle 링크_게시글 = linkArticleService.createArticle(짱구.getId(), 자바_스터디.getId(), articleRequest); entityManager.flush(); entityManager.clear(); @@ -141,7 +138,7 @@ void deleteByNotParticipatedMember() { final Study 자바_스터디 = studyService.createStudy(짱구.getId(), 자바_스터디_신청서(LocalDate.now())); final LinkArticleRequest articleRequest = new LinkArticleRequest("https://github.com/sc0116", "링크 설명입니다."); - final LinkArticle 링크_게시글 = articleService.createArticle(짱구.getId(), 자바_스터디.getId(), articleRequest); + final LinkArticle 링크_게시글 = linkArticleService.createArticle(짱구.getId(), 자바_스터디.getId(), articleRequest); entityManager.flush(); entityManager.clear(); diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/NoticeArticleControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/NoticeArticleControllerTest.java index cc33498d3..c94e1eb9a 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/NoticeArticleControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/NoticeArticleControllerTest.java @@ -12,19 +12,20 @@ import com.woowacourse.moamoa.study.service.StudyService; import com.woowacourse.moamoa.study.service.exception.StudyNotFoundException; import com.woowacourse.moamoa.study.service.request.StudyRequestBuilder; -import com.woowacourse.moamoa.studyroom.domain.StudyRoom; import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; +import com.woowacourse.moamoa.studyroom.domain.article.NoticeContent; import com.woowacourse.moamoa.studyroom.domain.repository.article.NoticeArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.NoticeArticleDao; +import com.woowacourse.moamoa.studyroom.service.AbstractArticleService; import com.woowacourse.moamoa.studyroom.service.NoticeArticleService; -import com.woowacourse.moamoa.studyroom.service.request.CommunityArticleRequest; +import com.woowacourse.moamoa.studyroom.service.request.NoticeArticleRequest; import java.time.LocalDate; -import java.util.Set; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -49,6 +50,9 @@ class NoticeArticleControllerTest { @Autowired private NoticeArticleDao noticeArticleDao; + @Autowired + private JpaRepository articleRepository; + private StudyService studyService; private NoticeArticleController sut; @@ -56,7 +60,8 @@ class NoticeArticleControllerTest { void setUp() { studyService = new StudyService(studyRepository, memberRepository, new DateTimeSystem()); sut = new NoticeArticleController( - new NoticeArticleService(studyRoomRepository, noticeArticleRepository, noticeArticleDao)); + new NoticeArticleService(studyRoomRepository, articleRepository, noticeArticleDao) + ); } @DisplayName("커뮤니티 게시글을 작성한다.") @@ -67,7 +72,7 @@ void createCommunityArticle() { Study study = studyService .createStudy(owner.getId(), javaStudyRequest.startDate(LocalDate.now()).build()); - CommunityArticleRequest request = new CommunityArticleRequest("게시글 제목", "게시글 내용"); + NoticeArticleRequest request = new NoticeArticleRequest("게시글 제목", "게시글 내용"); // act ResponseEntity response = sut.createArticle(owner.getId(), study.getId(), request); @@ -78,13 +83,10 @@ void createCommunityArticle() { NoticeArticle actualArticle = noticeArticleRepository.findById(articleId) .orElseThrow(); - StudyRoom expectStudyRoom = new StudyRoom(study.getId(), owner.getId(), Set.of()); assertThat(response.getStatusCode()).isEqualTo(HttpStatus.CREATED); assertThat(location).matches("/api/studies/\\d+/notice/articles/\\d+"); - assertThat(actualArticle).isEqualTo( - new NoticeArticle(articleId, "게시글 제목", "게시글 내용", owner.getId(), expectStudyRoom) - ); + assertThat(actualArticle.getContent()).isEqualTo(new NoticeContent("게시글 제목", "게시글 내용")); } @DisplayName("커뮤니티 공지사항을 작성한다.") @@ -95,7 +97,7 @@ void createNoticeArticle() { Study study = studyService .createStudy(owner.getId(), javaStudyRequest.startDate(LocalDate.now()).build()); - CommunityArticleRequest request = new CommunityArticleRequest("게시글 제목", "게시글 내용"); + NoticeArticleRequest request = new NoticeArticleRequest("게시글 제목", "게시글 내용"); // act ResponseEntity response = sut.createArticle(owner.getId(), study.getId(), request); @@ -105,13 +107,9 @@ void createNoticeArticle() { Long articleId = Long.valueOf(location.replaceAll("/api/studies/\\d+/notice/articles/", "")); NoticeArticle actualArticle = noticeArticleRepository.findById(articleId).orElseThrow(); - StudyRoom expectStudyRoom = new StudyRoom(study.getId(), owner.getId(), Set.of()); - assertThat(response.getStatusCode()).isEqualTo(HttpStatus.CREATED); assertThat(location).matches("/api/studies/\\d+/notice/articles/\\d+"); - assertThat(actualArticle).isEqualTo( - new NoticeArticle(articleId, "게시글 제목", "게시글 내용", owner.getId(), expectStudyRoom) - ); + assertThat(actualArticle.getContent()).isEqualTo(new NoticeContent("게시글 제목", "게시글 내용")); } @DisplayName("스터디가 없는 경우 게시글 작성 시 예외가 발생한다.") @@ -121,7 +119,7 @@ void throwExceptionWhenWriteToNotFoundStudy() { Member member = memberRepository.save(new Member(1L, "username", "imageUrl", "profileUrl")); final Long memberId = member.getId(); - final CommunityArticleRequest articleRequest = new CommunityArticleRequest("제목", "내용"); + final NoticeArticleRequest articleRequest = new NoticeArticleRequest("제목", "내용"); // act & assert assertThatThrownBy(() -> sut.createArticle(memberId, 1L, articleRequest)) diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/UpdatingNoticeArticleControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/UpdatingNoticeArticleControllerTest.java index 18ac56b86..17934baa6 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/UpdatingNoticeArticleControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/UpdatingNoticeArticleControllerTest.java @@ -11,21 +11,22 @@ import com.woowacourse.moamoa.study.domain.repository.StudyRepository; import com.woowacourse.moamoa.study.service.StudyService; import com.woowacourse.moamoa.study.service.request.StudyRequestBuilder; -import com.woowacourse.moamoa.studyroom.domain.StudyRoom; import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; +import com.woowacourse.moamoa.studyroom.domain.article.NoticeContent; import com.woowacourse.moamoa.studyroom.domain.repository.article.NoticeArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.NoticeArticleDao; +import com.woowacourse.moamoa.studyroom.service.AbstractArticleService; import com.woowacourse.moamoa.studyroom.service.NoticeArticleService; import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; -import com.woowacourse.moamoa.studyroom.service.request.CommunityArticleRequest; +import com.woowacourse.moamoa.studyroom.service.request.NoticeArticleRequest; import java.time.LocalDate; -import java.util.Set; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -50,6 +51,9 @@ class UpdatingNoticeArticleControllerTest { @Autowired private NoticeArticleDao noticeArticleDao; + @Autowired + private JpaRepository articleRepository; + private StudyService studyService; private NoticeArticleController sut; private NoticeArticleService noticeArticleService; @@ -57,8 +61,7 @@ class UpdatingNoticeArticleControllerTest { @BeforeEach void setUp() { studyService = new StudyService(studyRepository, memberRepository, new DateTimeSystem()); - noticeArticleService = new NoticeArticleService(studyRoomRepository, - noticeArticleRepository, noticeArticleDao); + noticeArticleService = new NoticeArticleService(studyRoomRepository, articleRepository, noticeArticleDao); sut = new NoticeArticleController(noticeArticleService); } @@ -70,22 +73,18 @@ void updateArticle() { Study study = studyService .createStudy(owner.getId(), javaStudyBuilder.startDate(LocalDate.now()).build()); NoticeArticle article = noticeArticleService - .createArticle(owner.getId(), study.getId(), new CommunityArticleRequest("제목", "내용")); + .createArticle(owner.getId(), study.getId(), new NoticeArticleRequest("제목", "내용")); // act final ResponseEntity response = sut .updateArticle(owner.getId(), study.getId(), article.getId(), - new CommunityArticleRequest("제목 수정", "내용 수정")); + new NoticeArticleRequest("제목 수정", "내용 수정")); // assert NoticeArticle actualArticle = noticeArticleRepository.findById(article.getId()).orElseThrow(); - StudyRoom expectStudyRoom = new StudyRoom(study.getId(), owner.getId(), Set.of()); - NoticeArticle expectArticle = new NoticeArticle(article.getId(), "제목 수정", "내용 수정", owner.getId(), - expectStudyRoom); - assertThat(response.getStatusCode()).isEqualTo(HttpStatus.NO_CONTENT); - assertThat(actualArticle).isEqualTo(expectArticle); + assertThat(actualArticle.getContent()).isEqualTo(new NoticeContent("제목 수정", "내용 수정")); } @DisplayName("게시글이 없는 경우 수정 시 예외가 발생한다.") @@ -98,7 +97,7 @@ void throwExceptionWhenUpdateToNotFoundArticle() { final Long memberId = member.getId(); final Long studyId = study.getId(); - final CommunityArticleRequest articleRequest = new CommunityArticleRequest("제목 수정", "내용 수정"); + final NoticeArticleRequest articleRequest = new NoticeArticleRequest("제목 수정", "내용 수정"); // act & assert assertThatThrownBy(() -> @@ -116,14 +115,14 @@ void throwExceptionWhenUpdateByNotParticipant() { Study study = studyService .createStudy(member.getId(), javaStudyBuilder.startDate(LocalDate.now()).build()); - CommunityArticleRequest request = new CommunityArticleRequest("게시글 제목", "게시글 내용"); + NoticeArticleRequest request = new NoticeArticleRequest("게시글 제목", "게시글 내용"); final NoticeArticle article = noticeArticleService .createArticle(member.getId(), study.getId(), request); final Long otherId = other.getId(); final Long studyId = study.getId(); final Long articleId = article.getId(); - final CommunityArticleRequest articleRequest = new CommunityArticleRequest("제목 수정", "내용 수정"); + final NoticeArticleRequest articleRequest = new NoticeArticleRequest("제목 수정", "내용 수정"); // act & assert assertThatThrownBy(() -> sut.updateArticle(otherId, studyId, articleId, articleRequest)) diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticleTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticleTest.java index f8068df33..bbe0b3d4b 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticleTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticleTest.java @@ -25,16 +25,14 @@ void update() { final Member owner = createMember(1L); final StudyRoom studyRoom = createStudyRoom(1L, owner); final Accessor accessor = new Accessor(owner.getId(), studyRoom.getId()); - final NoticeArticle sut = studyRoom.writeNoticeArticle(accessor, "제목", "내용"); + final NoticeContent noticeContent = new NoticeContent("제목", "내용"); + final NoticeArticle sut = noticeContent.createArticle(studyRoom, accessor); // act - sut.update(accessor, "수정된 제목", "수정된 내용"); + sut.update(accessor, new NoticeContent("수정된 제목", "수정된 내용")); // assert - assertAll( - () -> assertThat(sut.getTitle()).isEqualTo("수정된 제목"), - () -> assertThat(sut.getContent()).isEqualTo("수정된 내용") - ); + assertThat(sut.getContent()).isEqualTo(new NoticeContent("수정된 제목", "수정된 내용")); } @ParameterizedTest @@ -44,10 +42,10 @@ void updateByNotAuthor(final long memberId, final long studyId) { final Member owner = createMember(1L); final Member participant = createMember(2L); final StudyRoom studyRoom = createStudyRoom(1L, owner, participant); - final NoticeArticle sut = studyRoom.writeNoticeArticle(new Accessor(owner.getId(), studyRoom.getId()), - "제목", "내용"); + final NoticeContent noticeContent = new NoticeContent("제목", "내용"); + final NoticeArticle sut = noticeContent.createArticle(studyRoom, new Accessor(owner.getId(), studyRoom.getId())); - assertThatThrownBy(() -> sut.update(new Accessor(memberId, studyId), "수정된 제목", "수정된 설명")) + assertThatThrownBy(() -> sut.update(new Accessor(memberId, studyId), new NoticeContent("수정된 제목", "수정된 설명"))) .isInstanceOf(UneditableArticleException.class); } @@ -56,9 +54,8 @@ void updateByNotAuthor(final long memberId, final long studyId) { void delete() { final Member owner = createMember(1L); final StudyRoom studyRoom = createStudyRoom(1L, owner); - - final NoticeArticle sut = studyRoom.writeNoticeArticle(new Accessor(owner.getId(), studyRoom.getId()), - "제목", "내용"); + final NoticeContent noticeContent = new NoticeContent("제목", "내용"); + final NoticeArticle sut = noticeContent.createArticle(studyRoom, new Accessor(owner.getId(), studyRoom.getId())); sut.delete(new Accessor(1L, 1L)); @@ -72,9 +69,8 @@ void deleteByNotAuthor(final long memberId, final long studyId) { final Member owner = createMember(1L); final Member participant = createMember(2L); final StudyRoom studyRoom = createStudyRoom(1L, owner, participant); - - final NoticeArticle sut = studyRoom.writeNoticeArticle(new Accessor(owner.getId(), studyRoom.getId()), - "제목", "내용"); + final NoticeContent noticeContent = new NoticeContent("제목", "내용"); + final NoticeArticle sut = noticeContent.createArticle(studyRoom, new Accessor(owner.getId(), studyRoom.getId())); assertThatThrownBy(() -> sut.delete(new Accessor(memberId, studyId))) .isInstanceOf(UneditableArticleException.class); diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/StudyRoomTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeContentTest.java similarity index 81% rename from backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/StudyRoomTest.java rename to backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeContentTest.java index dbbb45eb3..cbd20318d 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/StudyRoomTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeContentTest.java @@ -1,9 +1,11 @@ -package com.woowacourse.moamoa.studyroom.domain; +package com.woowacourse.moamoa.studyroom.domain.article; import static org.assertj.core.api.Assertions.assertThatCode; import static org.assertj.core.api.Assertions.assertThatThrownBy; import com.woowacourse.moamoa.member.domain.Member; +import com.woowacourse.moamoa.studyroom.domain.Accessor; +import com.woowacourse.moamoa.studyroom.domain.StudyRoom; import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; import java.util.Set; import java.util.stream.Collectors; @@ -14,7 +16,7 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -class StudyRoomTest { +class NoticeContentTest { @DisplayName("방장은 공지글을 작성할 수 있다.") @Test @@ -22,9 +24,10 @@ void writeNoticeArticleByOwner() { // arrange final Member owner = createMember(1L); final StudyRoom studyRoom = createStudyRoom(1L, owner); + final NoticeContent sut = new NoticeContent("제목", "내용"); // act & assert - assertThatCode(() -> studyRoom.writeNoticeArticle(new Accessor(1L, 1L), "제목", "내용")) + assertThatCode(() -> sut.createArticle(studyRoom, new Accessor(1L, 1L))) .doesNotThrowAnyException(); } @@ -36,9 +39,10 @@ void cantWriteNoticeArticleByNonOwner(final Accessor accessor) { final Member owner = createMember(1L); final Member participant = createMember(2L); final StudyRoom studyRoom = createStudyRoom(1L, owner, participant); + final NoticeContent sut = new NoticeContent("제목", "내용"); // act && assert - assertThatThrownBy(() -> studyRoom.writeNoticeArticle(accessor, "제목", "내용")) + assertThatThrownBy(() -> sut.createArticle(studyRoom, accessor)) .isInstanceOf(UneditableArticleException.class); } diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/ArticleServiceTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/AbstractArticleServiceTest.java similarity index 95% rename from backend/src/test/java/com/woowacourse/moamoa/studyroom/service/ArticleServiceTest.java rename to backend/src/test/java/com/woowacourse/moamoa/studyroom/service/AbstractArticleServiceTest.java index cf4bc0dcd..429029f2e 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/ArticleServiceTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/AbstractArticleServiceTest.java @@ -18,6 +18,7 @@ import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; +import com.woowacourse.moamoa.studyroom.query.LinkArticleDao; import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; import com.woowacourse.moamoa.studyroom.service.request.LinkArticleRequest; import java.time.LocalDate; @@ -29,7 +30,7 @@ import org.springframework.data.jpa.repository.JpaRepository; @RepositoryTest -class ArticleServiceTest { +class AbstractArticleServiceTest { @Autowired private MemberRepository memberRepository; @@ -43,18 +44,20 @@ class ArticleServiceTest { @Autowired private JpaRepository articleRepository; + @Autowired + private LinkArticleDao linkArticleDao; + @Autowired private EntityManager entityManager; private StudyService studyService; - private ArticleService sut; + private AbstractArticleService sut; @BeforeEach void setUp() { studyService = new StudyService(studyRepository, memberRepository, new DateTimeSystem()); - - sut = new ArticleService<>(studyRoomRepository, articleRepository); + sut = new LinkArticleService(studyRoomRepository, articleRepository, linkArticleDao); } @DisplayName("스터디에 참여하지 않은 회원은 링크 공유를 할 수 없다.") From 547589ec5b74dfec8f36b056f2017b772dda2393 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=A7=84=ED=98=81?= Date: Fri, 16 Sep 2022 01:10:00 +0900 Subject: [PATCH 24/40] =?UTF-8?q?refactor:=20ArticleRepository=20=EC=9D=B8?= =?UTF-8?q?=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4=20=EC=B6=94=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/article/ArticleRepository.java | 14 +++++++++++++ .../article/CommunityArticleRepository.java | 2 +- .../article/LinkArticleRepository.java | 2 +- .../article/NoticeArticleRepository.java | 2 +- .../service/AbstractArticleService.java | 6 +++--- .../service/CommunityArticleService.java | 3 ++- .../studyroom/service/LinkArticleService.java | 3 ++- .../service/NoticeArticleService.java | 3 ++- .../DeletingNoticeArticleControllerTest.java | 20 ++++++++----------- .../GettingNoticeArticleControllerTest.java | 14 ++++--------- ...gNoticeArticleSummariesControllerTest.java | 9 +++------ .../controller/LinkArticleControllerTest.java | 10 ++-------- .../NoticeArticleControllerTest.java | 7 +++---- .../UpdatingNoticeArticleControllerTest.java | 15 +++++--------- .../service/AbstractArticleServiceTest.java | 4 ++-- 15 files changed, 53 insertions(+), 61 deletions(-) create mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/ArticleRepository.java diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/ArticleRepository.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/ArticleRepository.java new file mode 100644 index 000000000..95a8c3ed7 --- /dev/null +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/ArticleRepository.java @@ -0,0 +1,14 @@ +package com.woowacourse.moamoa.studyroom.domain.repository.article; + +import com.woowacourse.moamoa.studyroom.domain.article.Article; +import com.woowacourse.moamoa.studyroom.domain.article.Content; +import java.util.Optional; + +public interface ArticleRepository>> { + + A save(A article); + + Optional findById(Long id); + + boolean existsById(Long id); +} diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/CommunityArticleRepository.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/CommunityArticleRepository.java index c2ccad9e1..09bd6b9e7 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/CommunityArticleRepository.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/CommunityArticleRepository.java @@ -3,5 +3,5 @@ import com.woowacourse.moamoa.studyroom.domain.article.CommunityArticle; import org.springframework.data.jpa.repository.JpaRepository; -public interface CommunityArticleRepository extends JpaRepository { +interface CommunityArticleRepository extends JpaRepository, ArticleRepository { } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/LinkArticleRepository.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/LinkArticleRepository.java index 135848849..a2e069742 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/LinkArticleRepository.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/LinkArticleRepository.java @@ -3,5 +3,5 @@ import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; import org.springframework.data.jpa.repository.JpaRepository; -public interface LinkArticleRepository extends JpaRepository { +interface LinkArticleRepository extends JpaRepository, ArticleRepository { } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/NoticeArticleRepository.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/NoticeArticleRepository.java index a74fd76fc..3748097ab 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/NoticeArticleRepository.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/NoticeArticleRepository.java @@ -3,5 +3,5 @@ import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; import org.springframework.data.jpa.repository.JpaRepository; -public interface NoticeArticleRepository extends JpaRepository { +interface NoticeArticleRepository extends JpaRepository, ArticleRepository { } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/AbstractArticleService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/AbstractArticleService.java index dc85e2672..a338c47e7 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/AbstractArticleService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/AbstractArticleService.java @@ -6,20 +6,20 @@ import com.woowacourse.moamoa.studyroom.domain.article.Article; import com.woowacourse.moamoa.studyroom.domain.article.Content; import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; +import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; -import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.transaction.annotation.Transactional; @Transactional public abstract class AbstractArticleService, C extends Content> { private final StudyRoomRepository studyRoomRepository; - private final JpaRepository articleRepository; + private final ArticleRepository articleRepository; private final Class articleType; protected AbstractArticleService( - final StudyRoomRepository studyRoomRepository, final JpaRepository articleRepository, + final StudyRoomRepository studyRoomRepository, final ArticleRepository articleRepository, final Class articleType ) { this.studyRoomRepository = studyRoomRepository; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleService.java index a988651a2..1262ea35e 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleService.java @@ -3,6 +3,7 @@ import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; import com.woowacourse.moamoa.studyroom.domain.article.CommunityArticle; import com.woowacourse.moamoa.studyroom.domain.article.CommunityContent; +import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.CommunityArticleDao; import com.woowacourse.moamoa.studyroom.query.data.ArticleData; @@ -24,7 +25,7 @@ public class CommunityArticleService extends AbstractArticleService articleRepository, + public CommunityArticleService(final StudyRoomRepository studyRoomRepository, ArticleRepository articleRepository, final CommunityArticleDao communityArticleDao) { super(studyRoomRepository, articleRepository, CommunityArticle.class); this.communityArticleDao = communityArticleDao; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java index 004e2c946..cecf76d85 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java @@ -2,6 +2,7 @@ import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; import com.woowacourse.moamoa.studyroom.domain.article.LinkContent; +import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.LinkArticleDao; import com.woowacourse.moamoa.studyroom.query.data.LinkArticleData; @@ -19,7 +20,7 @@ public class LinkArticleService extends AbstractArticleService articleRepository, + final ArticleRepository articleRepository, final LinkArticleDao linkArticleDao ) { super(studyRoomRepository, articleRepository, LinkArticle.class); diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleService.java index 3033b179e..fb925d527 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleService.java @@ -3,6 +3,7 @@ import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; import com.woowacourse.moamoa.studyroom.domain.article.NoticeContent; +import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.NoticeArticleDao; import com.woowacourse.moamoa.studyroom.query.data.ArticleData; @@ -27,7 +28,7 @@ public class NoticeArticleService extends AbstractArticleService articleRepository, + final ArticleRepository articleRepository, final NoticeArticleDao noticeArticleDao) { super(studyRoomRepository, articleRepository, NoticeArticle.class); this.noticeArticleDao = noticeArticleDao; diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/DeletingNoticeArticleControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/DeletingNoticeArticleControllerTest.java index 58809b271..4aa0f2e0b 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/DeletingNoticeArticleControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/DeletingNoticeArticleControllerTest.java @@ -12,21 +12,18 @@ import com.woowacourse.moamoa.study.service.StudyService; import com.woowacourse.moamoa.study.service.request.StudyRequestBuilder; import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; -import com.woowacourse.moamoa.studyroom.domain.article.NoticeContent; -import com.woowacourse.moamoa.studyroom.domain.repository.article.NoticeArticleRepository; +import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; +import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; +import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.NoticeArticleDao; -import com.woowacourse.moamoa.studyroom.service.AbstractArticleService; import com.woowacourse.moamoa.studyroom.service.NoticeArticleService; -import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; -import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; import com.woowacourse.moamoa.studyroom.service.request.NoticeArticleRequest; import java.time.LocalDate; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.jpa.repository.JpaRepository; @RepositoryTest class DeletingNoticeArticleControllerTest { @@ -44,22 +41,21 @@ class DeletingNoticeArticleControllerTest { private MemberRepository memberRepository; @Autowired - private NoticeArticleRepository noticeArticleRepository; + private ArticleRepository noticeArticleRepository; @Autowired private NoticeArticleDao noticeArticleDao; - @Autowired - private JpaRepository articleRepository; - private StudyService studyService; - private NoticeArticleController sut; + private NoticeArticleService noticeArticleService; + private NoticeArticleController sut; + @BeforeEach void setUp() { studyService = new StudyService(studyRepository, memberRepository, new DateTimeSystem()); - noticeArticleService = new NoticeArticleService(studyRoomRepository, articleRepository, noticeArticleDao); + noticeArticleService = new NoticeArticleService(studyRoomRepository, noticeArticleRepository, noticeArticleDao); sut = new NoticeArticleController(noticeArticleService); } diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingNoticeArticleControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingNoticeArticleControllerTest.java index dbdea7683..d0ac98572 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingNoticeArticleControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingNoticeArticleControllerTest.java @@ -12,13 +12,11 @@ import com.woowacourse.moamoa.study.service.StudyService; import com.woowacourse.moamoa.study.service.request.StudyRequestBuilder; import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; -import com.woowacourse.moamoa.studyroom.domain.article.NoticeContent; -import com.woowacourse.moamoa.studyroom.domain.repository.article.NoticeArticleRepository; +import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; +import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.NoticeArticleDao; -import com.woowacourse.moamoa.studyroom.service.AbstractArticleService; import com.woowacourse.moamoa.studyroom.service.NoticeArticleService; -import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; import com.woowacourse.moamoa.studyroom.service.request.NoticeArticleRequest; import com.woowacourse.moamoa.studyroom.service.response.ArticleResponse; import com.woowacourse.moamoa.studyroom.service.response.AuthorResponse; @@ -27,7 +25,6 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -47,14 +44,11 @@ class GettingNoticeArticleControllerTest { private MemberRepository memberRepository; @Autowired - private NoticeArticleRepository noticeArticleRepository; + private ArticleRepository noticeArticleRepository; @Autowired private NoticeArticleDao noticeArticleDao; - @Autowired - private JpaRepository articleRepository; - private StudyService studyService; private NoticeArticleController sut; private NoticeArticleService noticeArticleService; @@ -62,7 +56,7 @@ class GettingNoticeArticleControllerTest { @BeforeEach void setUp() { studyService = new StudyService(studyRepository, memberRepository, new DateTimeSystem()); - noticeArticleService = new NoticeArticleService(studyRoomRepository, articleRepository, noticeArticleDao); + noticeArticleService = new NoticeArticleService(studyRoomRepository, noticeArticleRepository, noticeArticleDao); sut = new NoticeArticleController(noticeArticleService); } diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingNoticeArticleSummariesControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingNoticeArticleSummariesControllerTest.java index c61d4a942..b6d976bb3 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingNoticeArticleSummariesControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingNoticeArticleSummariesControllerTest.java @@ -1,7 +1,6 @@ package com.woowacourse.moamoa.studyroom.controller; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; import com.woowacourse.moamoa.common.RepositoryTest; import com.woowacourse.moamoa.common.utils.DateTimeSystem; @@ -12,11 +11,9 @@ import com.woowacourse.moamoa.study.service.StudyService; import com.woowacourse.moamoa.study.service.request.StudyRequestBuilder; import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; -import com.woowacourse.moamoa.studyroom.domain.article.NoticeContent; -import com.woowacourse.moamoa.studyroom.domain.repository.article.NoticeArticleRepository; +import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.NoticeArticleDao; -import com.woowacourse.moamoa.studyroom.service.AbstractArticleService; import com.woowacourse.moamoa.studyroom.service.NoticeArticleService; import com.woowacourse.moamoa.studyroom.service.request.NoticeArticleRequest; import com.woowacourse.moamoa.studyroom.service.response.ArticleSummariesResponse; @@ -53,7 +50,7 @@ class GettingNoticeArticleSummariesControllerTest { private StudyRepository studyRepository; @Autowired - private NoticeArticleRepository noticeArticleRepository; + private ArticleRepository noticeArticleRepository; @Autowired private NoticeArticleDao noticeArticleDao; @@ -65,7 +62,7 @@ class GettingNoticeArticleSummariesControllerTest { @BeforeEach void setUp() { - noticeArticleService = new NoticeArticleService(studyRoomRepository, articleRepository, noticeArticleDao); + noticeArticleService = new NoticeArticleService(studyRoomRepository, noticeArticleRepository, noticeArticleDao); studyService = new StudyService(studyRepository, memberRepository, new DateTimeSystem()); sut = new NoticeArticleController(noticeArticleService); } diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java index 271f58a80..99286d1cd 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java @@ -13,13 +13,11 @@ import com.woowacourse.moamoa.study.domain.repository.StudyRepository; import com.woowacourse.moamoa.study.service.StudyService; import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; -import com.woowacourse.moamoa.studyroom.domain.article.LinkContent; import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; -import com.woowacourse.moamoa.studyroom.domain.repository.article.LinkArticleRepository; +import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.LinkArticleDao; -import com.woowacourse.moamoa.studyroom.service.AbstractArticleService; import com.woowacourse.moamoa.studyroom.service.LinkArticleService; import com.woowacourse.moamoa.studyroom.service.request.LinkArticleRequest; import java.time.LocalDate; @@ -28,7 +26,6 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.jpa.repository.JpaRepository; @RepositoryTest class LinkArticleControllerTest { @@ -43,10 +40,7 @@ class LinkArticleControllerTest { private StudyRoomRepository studyRoomRepository; @Autowired - private LinkArticleRepository linkArticleRepository; - - @Autowired - private JpaRepository articleRepository; + private ArticleRepository articleRepository; @Autowired private LinkArticleDao linkArticleDao; diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/NoticeArticleControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/NoticeArticleControllerTest.java index c94e1eb9a..e033686ee 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/NoticeArticleControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/NoticeArticleControllerTest.java @@ -14,10 +14,9 @@ import com.woowacourse.moamoa.study.service.request.StudyRequestBuilder; import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; import com.woowacourse.moamoa.studyroom.domain.article.NoticeContent; -import com.woowacourse.moamoa.studyroom.domain.repository.article.NoticeArticleRepository; +import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.NoticeArticleDao; -import com.woowacourse.moamoa.studyroom.service.AbstractArticleService; import com.woowacourse.moamoa.studyroom.service.NoticeArticleService; import com.woowacourse.moamoa.studyroom.service.request.NoticeArticleRequest; import java.time.LocalDate; @@ -42,7 +41,7 @@ class NoticeArticleControllerTest { private MemberRepository memberRepository; @Autowired - private NoticeArticleRepository noticeArticleRepository; + private ArticleRepository noticeArticleRepository; @Autowired private StudyRoomRepository studyRoomRepository; @@ -60,7 +59,7 @@ class NoticeArticleControllerTest { void setUp() { studyService = new StudyService(studyRepository, memberRepository, new DateTimeSystem()); sut = new NoticeArticleController( - new NoticeArticleService(studyRoomRepository, articleRepository, noticeArticleDao) + new NoticeArticleService(studyRoomRepository, noticeArticleRepository, noticeArticleDao) ); } diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/UpdatingNoticeArticleControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/UpdatingNoticeArticleControllerTest.java index 17934baa6..6b692b61e 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/UpdatingNoticeArticleControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/UpdatingNoticeArticleControllerTest.java @@ -13,20 +13,18 @@ import com.woowacourse.moamoa.study.service.request.StudyRequestBuilder; import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; import com.woowacourse.moamoa.studyroom.domain.article.NoticeContent; -import com.woowacourse.moamoa.studyroom.domain.repository.article.NoticeArticleRepository; +import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; +import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; +import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.NoticeArticleDao; -import com.woowacourse.moamoa.studyroom.service.AbstractArticleService; import com.woowacourse.moamoa.studyroom.service.NoticeArticleService; -import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; -import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; import com.woowacourse.moamoa.studyroom.service.request.NoticeArticleRequest; import java.time.LocalDate; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -46,14 +44,11 @@ class UpdatingNoticeArticleControllerTest { private MemberRepository memberRepository; @Autowired - private NoticeArticleRepository noticeArticleRepository; + private ArticleRepository noticeArticleRepository; @Autowired private NoticeArticleDao noticeArticleDao; - @Autowired - private JpaRepository articleRepository; - private StudyService studyService; private NoticeArticleController sut; private NoticeArticleService noticeArticleService; @@ -61,7 +56,7 @@ class UpdatingNoticeArticleControllerTest { @BeforeEach void setUp() { studyService = new StudyService(studyRepository, memberRepository, new DateTimeSystem()); - noticeArticleService = new NoticeArticleService(studyRoomRepository, articleRepository, noticeArticleDao); + noticeArticleService = new NoticeArticleService(studyRoomRepository, noticeArticleRepository, noticeArticleDao); sut = new NoticeArticleController(noticeArticleService); } diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/AbstractArticleServiceTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/AbstractArticleServiceTest.java index 429029f2e..7c78e6b49 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/AbstractArticleServiceTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/AbstractArticleServiceTest.java @@ -17,6 +17,7 @@ import com.woowacourse.moamoa.studyroom.domain.article.LinkContent; import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; +import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.LinkArticleDao; import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; @@ -27,7 +28,6 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.jpa.repository.JpaRepository; @RepositoryTest class AbstractArticleServiceTest { @@ -42,7 +42,7 @@ class AbstractArticleServiceTest { private StudyRoomRepository studyRoomRepository; @Autowired - private JpaRepository articleRepository; + private ArticleRepository articleRepository; @Autowired private LinkArticleDao linkArticleDao; From b3323a56d0d4643b60b4a0d2565e2363e8f917e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=A7=84=ED=98=81?= Date: Fri, 16 Sep 2022 16:24:11 +0900 Subject: [PATCH 25/40] =?UTF-8?q?refactor:=20Article=20=EC=B6=94=EC=83=81?= =?UTF-8?q?=20=ED=81=B4=EB=9E=98=EC=8A=A4=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../moamoa/studyroom/domain/StudyRoom.java | 6 -- .../studyroom/domain/article/Article.java | 68 ++++++++++++++++++- .../domain/article/CommunityArticle.java | 52 ++------------ .../studyroom/domain/article/LinkArticle.java | 61 +++-------------- .../studyroom/domain/article/LinkContent.java | 26 ++++--- .../domain/article/NoticeArticle.java | 68 +++---------------- .../exception/UneditableArticleException.java | 5 ++ .../repository/article/ArticleRepository.java | 2 - .../service/NoticeArticleService.java | 3 +- .../DeletingNoticeArticleControllerTest.java | 3 +- .../domain/article/LinkArticleTest.java | 5 +- backend/src/test/resources/schema.sql | 4 +- 12 files changed, 117 insertions(+), 186 deletions(-) diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/StudyRoom.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/StudyRoom.java index 684c6a914..25f703a70 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/StudyRoom.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/StudyRoom.java @@ -1,11 +1,5 @@ package com.woowacourse.moamoa.studyroom.domain; -import com.woowacourse.moamoa.studyroom.domain.article.Article; -import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; -import com.woowacourse.moamoa.studyroom.domain.article.Content; -import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; -import com.woowacourse.moamoa.studyroom.domain.article.NoticeContent; -import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; import java.util.Objects; import java.util.Set; import javax.persistence.Column; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java index 357b8cae8..b84db5045 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java @@ -1,10 +1,72 @@ package com.woowacourse.moamoa.studyroom.domain.article; +import com.woowacourse.moamoa.common.entity.BaseEntity; import com.woowacourse.moamoa.studyroom.domain.Accessor; +import com.woowacourse.moamoa.studyroom.domain.StudyRoom; +import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; +import javax.persistence.Column; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.MappedSuperclass; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; -public interface Article>> { +@MappedSuperclass +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public abstract class Article>> extends BaseEntity { - void update(final Accessor accessor, final T content); + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; - void delete(final Accessor accessor); + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "study_id") + protected StudyRoom studyRoom; + + @Column(name = "author_id", nullable = false) + protected Long authorId; + + @Column(nullable = false) + private boolean deleted; + + public Article(final Long id, final StudyRoom studyRoom, final Long authorId) { + this.id = id; + this.studyRoom = studyRoom; + this.authorId = authorId; + this.deleted = false; + } + + public final void update(final Accessor accessor, final T content) { + if (!isEditableAccessor(accessor)) { + throw new UneditableArticleException(studyRoom.getId(), accessor, ArticleType.NOTICE); + } + + updateContent(content); + } + + public final void delete(final Accessor accessor) { + if (!isEditableAccessor(accessor)) { + throw new UneditableArticleException(studyRoom.getId(), accessor, getClass()); + } + + deleted = true; + } + + public boolean isDeleted() { + return deleted; + } + + public Long getId() { + return id; + } + + protected abstract void updateContent(final T content); + + protected abstract boolean isEditableAccessor(final Accessor accessor); + + public abstract T getContent(); } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticle.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticle.java index 3d5f8cbc8..7ce0282a1 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticle.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticle.java @@ -1,19 +1,9 @@ package com.woowacourse.moamoa.studyroom.domain.article; -import static javax.persistence.GenerationType.IDENTITY; - -import com.woowacourse.moamoa.common.entity.BaseEntity; import com.woowacourse.moamoa.studyroom.domain.Accessor; import com.woowacourse.moamoa.studyroom.domain.StudyRoom; -import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; -import javax.persistence.Column; import javax.persistence.Embedded; import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; import javax.persistence.Table; import lombok.AccessLevel; import lombok.Getter; @@ -22,27 +12,13 @@ @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) -@Getter @Table(name = "community") @Where(clause = "deleted = false") -public class CommunityArticle extends BaseEntity implements Article { - - @Id - @GeneratedValue(strategy = IDENTITY) - private Long id; - - @Column(name = "author_id") - private Long authorId; - - @ManyToOne(fetch = FetchType.EAGER) - @JoinColumn(name = "study_id") - private StudyRoom studyRoom; +public class CommunityArticle extends Article { @Embedded private CommunityContent content; - private boolean deleted; - CommunityArticle(final StudyRoom studyRoom, final Long authorId, final CommunityContent content) { this(null, authorId, studyRoom, content); } @@ -50,36 +26,22 @@ public class CommunityArticle extends BaseEntity implements Article{ - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @ManyToOne(fetch = FetchType.EAGER) - @JoinColumn(name = "study_id") - private StudyRoom studyRoom; - - @Column(name = "member_id", nullable = false) - private Long authorId; +public class LinkArticle extends Article{ @Embedded private LinkContent content; - @Column(nullable = false) - private boolean deleted; - LinkArticle(final StudyRoom studyRoom, final Long authorId, final LinkContent content) { this(null, studyRoom, authorId, content); } private LinkArticle(final Long id, final StudyRoom studyRoom, final Long authorId, final LinkContent content) { - this.id = id; - this.studyRoom = studyRoom; - this.authorId = authorId; + super(id, studyRoom, authorId); this.content = content; - this.deleted = false; } - public void update(final Accessor accessor, final LinkContent content) { - if (!studyRoom.isPermittedAccessor(accessor) || !authorId.equals(accessor.getMemberId())) { - throw new UneditableArticleException(studyRoom.getId(), accessor, ArticleType.LINK); - } - + @Override + protected void updateContent(final LinkContent content) { this.content = content; } @Override - public void delete(final Accessor accessor) { - if (!studyRoom.isPermittedAccessor(accessor) || !authorId.equals(accessor.getMemberId())) { - throw new UneditableArticleException(studyRoom.getId(), accessor, ArticleType.LINK); - } - - deleted = true; - } - - public Long getId() { - return id; - } - - public String getLinkUrl() { - return content.getLinkUrl(); - } - - public String getDescription() { - return content.getDescription(); + protected boolean isEditableAccessor(final Accessor accessor) { + return studyRoom.isPermittedAccessor(accessor) && authorId.equals(accessor.getMemberId()); } - public boolean isDeleted() { - return deleted; + public LinkContent getContent() { + return content; } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkContent.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkContent.java index 83fd099d5..a048f3999 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkContent.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkContent.java @@ -3,6 +3,7 @@ import com.woowacourse.moamoa.studyroom.domain.Accessor; import com.woowacourse.moamoa.studyroom.domain.StudyRoom; import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; +import java.util.Objects; import javax.persistence.Column; import javax.persistence.Embeddable; import lombok.AccessLevel; @@ -22,14 +23,6 @@ public LinkContent(final String linkUrl, final String description) { this.description = description; } - public String getLinkUrl() { - return linkUrl; - } - - public String getDescription() { - return description; - } - @Override public LinkArticle createArticle(final StudyRoom studyRoom, final Accessor accessor) { if (studyRoom.isPermittedAccessor(accessor)) { @@ -38,4 +31,21 @@ public LinkArticle createArticle(final StudyRoom studyRoom, final Accessor acces throw new UneditableArticleException(studyRoom.getId(), accessor, ArticleType.LINK); } + + @Override + public boolean equals(final Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + final LinkContent that = (LinkContent) o; + return Objects.equals(linkUrl, that.linkUrl) && Objects.equals(description, that.description); + } + + @Override + public int hashCode() { + return Objects.hash(linkUrl, description); + } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticle.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticle.java index 9db46a2ab..506f8ef26 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticle.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticle.java @@ -1,20 +1,9 @@ package com.woowacourse.moamoa.studyroom.domain.article; -import static javax.persistence.GenerationType.IDENTITY; - -import com.woowacourse.moamoa.common.entity.BaseEntity; import com.woowacourse.moamoa.studyroom.domain.Accessor; import com.woowacourse.moamoa.studyroom.domain.StudyRoom; -import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; -import java.util.Objects; -import javax.persistence.Column; import javax.persistence.Embedded; import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; import javax.persistence.Table; import lombok.AccessLevel; import lombok.Getter; @@ -23,78 +12,37 @@ @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) -@Getter @Table(name = "notice") @Where(clause = "deleted = false") -public class NoticeArticle extends BaseEntity implements Article { - - @Id - @GeneratedValue(strategy = IDENTITY) - private Long id; - - @Column(name = "author_id") - private Long authorId; - - @ManyToOne(fetch = FetchType.EAGER) - @JoinColumn(name = "study_id") - private StudyRoom studyRoom; +public class NoticeArticle extends Article { @Embedded private NoticeContent content; - private boolean deleted; - NoticeArticle(final Long authorId, final StudyRoom studyRoom, final NoticeContent content) { this(null, authorId, studyRoom, content); } private NoticeArticle(final Long id, final Long authorId, final StudyRoom studyRoom, final NoticeContent content) { - this.id = id; - this.authorId = authorId; - this.studyRoom = studyRoom; - this.deleted = false; + super(id, studyRoom, authorId); this.content = content; } @Override - public void update(final Accessor accessor, final NoticeContent content) { - if (!studyRoom.isOwner(accessor)) { - throw new UneditableArticleException(studyRoom.getId(), accessor, ArticleType.NOTICE); - } - + protected void updateContent(final NoticeContent content) { this.content = content; } @Override - public void delete(final Accessor accessor) { - if (!studyRoom.isOwner(accessor)) { - throw new UneditableArticleException(studyRoom.getId(), accessor, ArticleType.NOTICE); - } - - deleted = true; - } - - public boolean isDeleted() { - return deleted; + protected boolean isEditableAccessor(final Accessor accessor) { + return studyRoom.isOwner(accessor); } @Override - public boolean equals(final Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - final NoticeArticle that = (NoticeArticle) o; - return deleted == that.deleted && Objects.equals(id, that.id) && Objects - .equals(authorId, that.authorId) && Objects.equals(studyRoom, that.studyRoom) && Objects - .equals(content, that.content); + public NoticeContent getContent() { + return content; } - @Override - public int hashCode() { - return Objects.hash(id, authorId, studyRoom, content, deleted); - } + } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/UneditableArticleException.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/UneditableArticleException.java index c63698ebf..6f1a98b69 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/UneditableArticleException.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/UneditableArticleException.java @@ -2,6 +2,7 @@ import com.woowacourse.moamoa.common.exception.BadRequestException; import com.woowacourse.moamoa.studyroom.domain.Accessor; +import com.woowacourse.moamoa.studyroom.domain.article.Article; import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; public class UneditableArticleException extends BadRequestException { @@ -9,4 +10,8 @@ public class UneditableArticleException extends BadRequestException { public UneditableArticleException(final Long studyId, final Accessor accessor, final ArticleType type) { super(String.format("스터디[%d]에 접근자[%s]가 %s의 게시글을 수정/추가할 수 없습니다.", studyId, accessor, type)); } + + public UneditableArticleException(final Long studyId, final Accessor accessor, final Class articleType) { + super(String.format("스터디[%d]에 접근자[%s]가 %s의 게시글을 수정/추가할 수 없습니다.", studyId, accessor, articleType.getSimpleName())); + } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/ArticleRepository.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/ArticleRepository.java index 95a8c3ed7..0b8fd1efa 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/ArticleRepository.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/ArticleRepository.java @@ -9,6 +9,4 @@ public interface ArticleRepository>> { A save(A article); Optional findById(Long id); - - boolean existsById(Long id); } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleService.java index fb925d527..ddf829705 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleService.java @@ -3,11 +3,11 @@ import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; import com.woowacourse.moamoa.studyroom.domain.article.NoticeContent; +import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.NoticeArticleDao; import com.woowacourse.moamoa.studyroom.query.data.ArticleData; -import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; import com.woowacourse.moamoa.studyroom.service.response.ArticleResponse; import com.woowacourse.moamoa.studyroom.service.response.ArticleSummariesResponse; import com.woowacourse.moamoa.studyroom.service.response.ArticleSummaryResponse; @@ -16,7 +16,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/DeletingNoticeArticleControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/DeletingNoticeArticleControllerTest.java index 4aa0f2e0b..f554353ce 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/DeletingNoticeArticleControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/DeletingNoticeArticleControllerTest.java @@ -75,7 +75,8 @@ void deleteCommunityArticle() { sut.deleteArticle(member.getId(), study.getId(), article.getId()); //assert - assertThat(noticeArticleRepository.existsById(article.getId())).isFalse(); + final NoticeArticle deletedArticle = noticeArticleRepository.findById(article.getId()).orElseThrow(); + assertThat(deletedArticle.isDeleted()).isTrue(); } @DisplayName("게시글이 없는 경우 조회 시 예외가 발생한다.") diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticleTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticleTest.java index 2f19e65fc..da279f632 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticleTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticleTest.java @@ -32,10 +32,7 @@ void update() { sut.update(accessor, new LinkContent("updated link", "수정된 설명")); // assert - assertAll( - () -> assertThat(sut.getLinkUrl()).isEqualTo("updated link"), - () -> assertThat(sut.getDescription()).isEqualTo("수정된 설명") - ); + assertThat(sut.getContent()).isEqualTo(new LinkContent("updated link", "수정된 설명")); } @ParameterizedTest diff --git a/backend/src/test/resources/schema.sql b/backend/src/test/resources/schema.sql index d193dfb4d..55257666a 100644 --- a/backend/src/test/resources/schema.sql +++ b/backend/src/test/resources/schema.sql @@ -54,14 +54,14 @@ CREATE TABLE link ( id BIGINT PRIMARY KEY AUTO_INCREMENT, study_id BIGINT NOT NULL, - member_id BIGINT NOT NULL, + author_id BIGINT NOT NULL, link_url MEDIUMTEXT NOT NULL, description MEDIUMTEXT, created_date DATETIME NOT NULL, last_modified_date DATETIME NOT NULL, deleted boolean NOT NULL, FOREIGN KEY (study_id) REFERENCES study (id), - FOREIGN KEY (member_id) REFERENCES member (id) + FOREIGN KEY (author_id) REFERENCES member (id) ); CREATE TABLE category From 6a0bfda63055566de087a7b4ea026f2837d7fd58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=A7=84=ED=98=81?= Date: Fri, 16 Sep 2022 16:47:40 +0900 Subject: [PATCH 26/40] =?UTF-8?q?refactor:=20LinkArticleDao=20sql=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EB=B0=8F=20ArticleType=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../moamoa/studyroom/domain/article/Article.java | 2 +- .../moamoa/studyroom/domain/article/ArticleType.java | 6 ------ .../moamoa/studyroom/domain/article/CommunityContent.java | 2 +- .../moamoa/studyroom/domain/article/LinkContent.java | 2 +- .../moamoa/studyroom/domain/article/NoticeContent.java | 2 +- .../domain/exception/ArticleNotFoundException.java | 6 ------ .../domain/exception/UneditableArticleException.java | 5 ----- .../woowacourse/moamoa/studyroom/query/LinkArticleDao.java | 2 +- .../moamoa/studyroom/service/CommunityArticleService.java | 6 ++---- .../moamoa/studyroom/service/NoticeArticleService.java | 3 +-- 10 files changed, 8 insertions(+), 28 deletions(-) delete mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleType.java diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java index b84db5045..77b478624 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java @@ -42,7 +42,7 @@ public Article(final Long id, final StudyRoom studyRoom, final Long authorId) { public final void update(final Accessor accessor, final T content) { if (!isEditableAccessor(accessor)) { - throw new UneditableArticleException(studyRoom.getId(), accessor, ArticleType.NOTICE); + throw new UneditableArticleException(studyRoom.getId(), accessor, getClass()); } updateContent(content); diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleType.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleType.java deleted file mode 100644 index e24e61100..000000000 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleType.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.woowacourse.moamoa.studyroom.domain.article; - -public enum ArticleType { - - COMMUNITY, NOTICE, LINK; -} diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityContent.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityContent.java index cc4564001..0b33d89de 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityContent.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityContent.java @@ -27,7 +27,7 @@ public CommunityContent(final String title, final String content) { @Override public CommunityArticle createArticle(final StudyRoom studyRoom, final Accessor accessor) { if (!studyRoom.isPermittedAccessor(accessor)) { - throw new UneditableArticleException(studyRoom.getId(), accessor, ArticleType.COMMUNITY); + throw new UneditableArticleException(studyRoom.getId(), accessor, CommunityArticle.class); } return new CommunityArticle(studyRoom, accessor.getMemberId(), this); diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkContent.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkContent.java index a048f3999..b4cdcf2d3 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkContent.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkContent.java @@ -29,7 +29,7 @@ public LinkArticle createArticle(final StudyRoom studyRoom, final Accessor acces return new LinkArticle(studyRoom, accessor.getMemberId(), this); } - throw new UneditableArticleException(studyRoom.getId(), accessor, ArticleType.LINK); + throw new UneditableArticleException(studyRoom.getId(), accessor, LinkArticle.class); } @Override diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeContent.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeContent.java index fe3dd610a..81ceb048b 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeContent.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeContent.java @@ -30,7 +30,7 @@ public NoticeArticle createArticle(final StudyRoom studyRoom, final Accessor acc return new NoticeArticle(accessor.getMemberId(), studyRoom, this); } - throw new UneditableArticleException(studyRoom.getId(), accessor, ArticleType.NOTICE); + throw new UneditableArticleException(studyRoom.getId(), accessor, NoticeArticle.class); } public String getTitle() { diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/ArticleNotFoundException.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/ArticleNotFoundException.java index feb8f11a0..9923dafd8 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/ArticleNotFoundException.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/ArticleNotFoundException.java @@ -2,15 +2,9 @@ import com.woowacourse.moamoa.common.exception.NotFoundException; import com.woowacourse.moamoa.studyroom.domain.article.Article; -import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; -import com.woowacourse.moamoa.studyroom.domain.article.Content; public class ArticleNotFoundException extends NotFoundException { - public ArticleNotFoundException(long articleId, ArticleType type) { - super(String.format("%d의 식별자를 가진 %s 게시글이 존재하지 않습니다.", articleId, type)); - } - public ArticleNotFoundException(final Long articleId, final Class> articleType) { super(String.format("%d의 식별자를 가진 %s 게시글이 존재하지 않습니다.", articleId, articleType.getSimpleName())); } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/UneditableArticleException.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/UneditableArticleException.java index 6f1a98b69..39cb97d23 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/UneditableArticleException.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/UneditableArticleException.java @@ -3,14 +3,9 @@ import com.woowacourse.moamoa.common.exception.BadRequestException; import com.woowacourse.moamoa.studyroom.domain.Accessor; import com.woowacourse.moamoa.studyroom.domain.article.Article; -import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; public class UneditableArticleException extends BadRequestException { - public UneditableArticleException(final Long studyId, final Accessor accessor, final ArticleType type) { - super(String.format("스터디[%d]에 접근자[%s]가 %s의 게시글을 수정/추가할 수 없습니다.", studyId, accessor, type)); - } - public UneditableArticleException(final Long studyId, final Accessor accessor, final Class articleType) { super(String.format("스터디[%d]에 접근자[%s]가 %s의 게시글을 수정/추가할 수 없습니다.", studyId, accessor, articleType.getSimpleName())); } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/query/LinkArticleDao.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/query/LinkArticleDao.java index 9eaf4d9e6..410250076 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/query/LinkArticleDao.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/query/LinkArticleDao.java @@ -23,7 +23,7 @@ public Slice findAllByStudyId(final Long studyId, final Pageabl final String sql = "SELECT link.id, link.link_url, link.description, link.created_date, link.last_modified_date, " + "member.github_id, member.username, member.image_url, member.profile_url " + "FROM link " - + "JOIN member ON link.member_id = member.id " + + "JOIN member ON link.author_id = member.id " + "WHERE link.deleted = false " + "AND link.study_id = :studyId " + "ORDER BY link.created_date DESC, link.id DESC " diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleService.java index 1262ea35e..916d13db4 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleService.java @@ -1,13 +1,12 @@ package com.woowacourse.moamoa.studyroom.service; -import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; import com.woowacourse.moamoa.studyroom.domain.article.CommunityArticle; import com.woowacourse.moamoa.studyroom.domain.article.CommunityContent; +import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.CommunityArticleDao; import com.woowacourse.moamoa.studyroom.query.data.ArticleData; -import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; import com.woowacourse.moamoa.studyroom.service.response.ArticleResponse; import com.woowacourse.moamoa.studyroom.service.response.ArticleSummariesResponse; import com.woowacourse.moamoa.studyroom.service.response.ArticleSummaryResponse; @@ -15,7 +14,6 @@ import java.util.stream.Collectors; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -33,7 +31,7 @@ public CommunityArticleService(final StudyRoomRepository studyRoomRepository, Ar public ArticleResponse getArticle(final Long articleId) { final ArticleData data = communityArticleDao.getById(articleId) - .orElseThrow(() -> new ArticleNotFoundException(articleId, ArticleType.COMMUNITY)); + .orElseThrow(() -> new ArticleNotFoundException(articleId, CommunityArticle.class)); return new ArticleResponse(data); } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleService.java index ddf829705..420c51ca1 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleService.java @@ -1,6 +1,5 @@ package com.woowacourse.moamoa.studyroom.service; -import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; import com.woowacourse.moamoa.studyroom.domain.article.NoticeContent; import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; @@ -35,7 +34,7 @@ public NoticeArticleService(final StudyRoomRepository studyRoomRepository, public ArticleResponse getArticle(final Long articleId) { final ArticleData data = noticeArticleDao.getById(articleId) - .orElseThrow(() -> new ArticleNotFoundException(articleId, ArticleType.NOTICE)); + .orElseThrow(() -> new ArticleNotFoundException(articleId, NoticeArticle.class)); return new ArticleResponse(data); } From 907c2e3a945adb5e5da0fa902c732a3412e0b996 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=A7=84=ED=98=81?= Date: Fri, 16 Sep 2022 18:24:35 +0900 Subject: [PATCH 27/40] =?UTF-8?q?test:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DeletingNoticeArticleControllerTest.java | 119 ---------- .../GettingNoticeArticleControllerTest.java | 103 --------- ...gNoticeArticleSummariesControllerTest.java | 121 ---------- .../controller/LinkArticleControllerTest.java | 143 ------------ .../NoticeArticleControllerTest.java | 127 ----------- .../UpdatingNoticeArticleControllerTest.java | 126 ----------- .../service/CommunityArticleServiceTest.java | 212 ++++++++++++++++++ ...eTest.java => LinkArticleServiceTest.java} | 96 ++++++-- .../service/NoticeArticleServiceTest.java | 212 ++++++++++++++++++ 9 files changed, 507 insertions(+), 752 deletions(-) delete mode 100644 backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/DeletingNoticeArticleControllerTest.java delete mode 100644 backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingNoticeArticleControllerTest.java delete mode 100644 backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingNoticeArticleSummariesControllerTest.java delete mode 100644 backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java delete mode 100644 backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/NoticeArticleControllerTest.java delete mode 100644 backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/UpdatingNoticeArticleControllerTest.java create mode 100644 backend/src/test/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleServiceTest.java rename backend/src/test/java/com/woowacourse/moamoa/studyroom/service/{AbstractArticleServiceTest.java => LinkArticleServiceTest.java} (60%) create mode 100644 backend/src/test/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleServiceTest.java diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/DeletingNoticeArticleControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/DeletingNoticeArticleControllerTest.java deleted file mode 100644 index f554353ce..000000000 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/DeletingNoticeArticleControllerTest.java +++ /dev/null @@ -1,119 +0,0 @@ -package com.woowacourse.moamoa.studyroom.controller; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -import com.woowacourse.moamoa.common.RepositoryTest; -import com.woowacourse.moamoa.common.utils.DateTimeSystem; -import com.woowacourse.moamoa.member.domain.Member; -import com.woowacourse.moamoa.member.domain.repository.MemberRepository; -import com.woowacourse.moamoa.study.domain.Study; -import com.woowacourse.moamoa.study.domain.repository.StudyRepository; -import com.woowacourse.moamoa.study.service.StudyService; -import com.woowacourse.moamoa.study.service.request.StudyRequestBuilder; -import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; -import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; -import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; -import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepository; -import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; -import com.woowacourse.moamoa.studyroom.query.NoticeArticleDao; -import com.woowacourse.moamoa.studyroom.service.NoticeArticleService; -import com.woowacourse.moamoa.studyroom.service.request.NoticeArticleRequest; -import java.time.LocalDate; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; - -@RepositoryTest -class DeletingNoticeArticleControllerTest { - - StudyRequestBuilder javaStudyRequest = new StudyRequestBuilder() - .title("java 스터디").excerpt("자바 설명").thumbnail("java image").description("자바 소개"); - - @Autowired - private StudyRepository studyRepository; - - @Autowired - private StudyRoomRepository studyRoomRepository; - - @Autowired - private MemberRepository memberRepository; - - @Autowired - private ArticleRepository noticeArticleRepository; - - @Autowired - private NoticeArticleDao noticeArticleDao; - - private StudyService studyService; - - private NoticeArticleService noticeArticleService; - - private NoticeArticleController sut; - - @BeforeEach - void setUp() { - studyService = new StudyService(studyRepository, memberRepository, new DateTimeSystem()); - noticeArticleService = new NoticeArticleService(studyRoomRepository, noticeArticleRepository, noticeArticleDao); - sut = new NoticeArticleController(noticeArticleService); - } - - @DisplayName("스터디 커뮤니티 게시글을 삭제한다.") - @Test - void deleteCommunityArticle() { - // arrange - Member member = memberRepository.save(new Member(1L, "username", "imageUrl", "profileUrl")); - - Study study = studyService - .createStudy(member.getId(), javaStudyRequest.startDate(LocalDate.now()).build()); - - NoticeArticleRequest request = new NoticeArticleRequest("게시글 제목", "게시글 내용"); - NoticeArticle article = noticeArticleService.createArticle(member.getId(), study.getId(), request); - - //act - sut.deleteArticle(member.getId(), study.getId(), article.getId()); - - //assert - final NoticeArticle deletedArticle = noticeArticleRepository.findById(article.getId()).orElseThrow(); - assertThat(deletedArticle.isDeleted()).isTrue(); - } - - @DisplayName("게시글이 없는 경우 조회 시 예외가 발생한다.") - @Test - void throwExceptionWhenGettingToNotFoundArticle() { - // arrange - Member member = memberRepository.save(new Member(1L, "username", "imageUrl", "profileUrl")); - Study study = studyService - .createStudy(member.getId(), javaStudyRequest.startDate(LocalDate.now()).build()); - - final Long memberId = member.getId(); - final Long studyId = study.getId(); - - // act & assert - assertThatThrownBy(() -> sut.deleteArticle(memberId, studyId, 1L)) - .isInstanceOf(ArticleNotFoundException.class); - } - - @DisplayName("게시글을 삭제할 수 없는 경우 예외가 발생한다.") - @Test - void throwExceptionWhenDeletingByNotParticipant() { - // arrange - Member member = memberRepository.save(new Member(1L, "username", "imageUrl", "profileUrl")); - Member other = memberRepository.save(new Member(2L, "username2", "imageUrl", "profileUrl")); - - Study study = studyService - .createStudy(member.getId(), javaStudyRequest.startDate(LocalDate.now()).build()); - - NoticeArticleRequest request = new NoticeArticleRequest("게시글 제목", "게시글 내용"); - NoticeArticle article = noticeArticleService.createArticle(member.getId(), study.getId(), request); - - final Long otherId = other.getId(); - final Long studyId = study.getId(); - final Long articleId = article.getId(); - - // act & assert - assertThatThrownBy(() -> sut.deleteArticle(otherId, studyId, articleId)) - .isInstanceOf(UneditableArticleException.class); - } -} diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingNoticeArticleControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingNoticeArticleControllerTest.java deleted file mode 100644 index d0ac98572..000000000 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingNoticeArticleControllerTest.java +++ /dev/null @@ -1,103 +0,0 @@ -package com.woowacourse.moamoa.studyroom.controller; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -import com.woowacourse.moamoa.common.RepositoryTest; -import com.woowacourse.moamoa.common.utils.DateTimeSystem; -import com.woowacourse.moamoa.member.domain.Member; -import com.woowacourse.moamoa.member.domain.repository.MemberRepository; -import com.woowacourse.moamoa.study.domain.Study; -import com.woowacourse.moamoa.study.domain.repository.StudyRepository; -import com.woowacourse.moamoa.study.service.StudyService; -import com.woowacourse.moamoa.study.service.request.StudyRequestBuilder; -import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; -import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; -import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepository; -import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; -import com.woowacourse.moamoa.studyroom.query.NoticeArticleDao; -import com.woowacourse.moamoa.studyroom.service.NoticeArticleService; -import com.woowacourse.moamoa.studyroom.service.request.NoticeArticleRequest; -import com.woowacourse.moamoa.studyroom.service.response.ArticleResponse; -import com.woowacourse.moamoa.studyroom.service.response.AuthorResponse; -import java.time.LocalDate; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; - -@RepositoryTest -class GettingNoticeArticleControllerTest { - - StudyRequestBuilder javaStudyRequest = new StudyRequestBuilder() - .title("java 스터디").excerpt("자바 설명").thumbnail("java image").description("자바 소개"); - - @Autowired - private StudyRepository studyRepository; - - @Autowired - private StudyRoomRepository studyRoomRepository; - - @Autowired - private MemberRepository memberRepository; - - @Autowired - private ArticleRepository noticeArticleRepository; - - @Autowired - private NoticeArticleDao noticeArticleDao; - - private StudyService studyService; - private NoticeArticleController sut; - private NoticeArticleService noticeArticleService; - - @BeforeEach - void setUp() { - studyService = new StudyService(studyRepository, memberRepository, new DateTimeSystem()); - noticeArticleService = new NoticeArticleService(studyRoomRepository, noticeArticleRepository, noticeArticleDao); - sut = new NoticeArticleController(noticeArticleService); - } - - @DisplayName("스터디 게시글을 단건 조회한다.") - @Test - void getStudyCommunityArticle() { - // arrange - Member member = memberRepository.save(new Member(1L, "username", "imageUrl", "profileUrl")); - Study study = studyService - .createStudy(member.getId(), javaStudyRequest.startDate(LocalDate.now()).build()); - - NoticeArticleRequest request = new NoticeArticleRequest("게시글 제목", "게시글 내용"); - NoticeArticle article = noticeArticleService.createArticle(member.getId(), study.getId(), request); - - //act - final ResponseEntity response = sut.getArticle(study.getId(), - article.getId()); - - //assert - final AuthorResponse expectedAuthorResponse = new AuthorResponse( - member.getGithubId(), member.getUsername(), member.getImageUrl(), member.getProfileUrl() - ); - assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); - assertThat(response.getBody()).isEqualTo( - new ArticleResponse(article.getId(), expectedAuthorResponse, request.getTitle(), request.getContent(), - LocalDate.now(), LocalDate.now())); - } - - @DisplayName("게시글이 없는 경우 조회 시 예외가 발생한다.") - @Test - void throwExceptionWhenGettingToNotFoundArticle() { - // arrange - Member member = memberRepository.save(new Member(1L, "username", "imageUrl", "profileUrl")); - Study study = studyService - .createStudy(member.getId(), javaStudyRequest.startDate(LocalDate.now()).build()); - - final Long memberId = member.getId(); - final Long studyId = study.getId(); - - // act & assert - assertThatThrownBy(() -> sut.getArticle(studyId, 1L)) - .isInstanceOf(ArticleNotFoundException.class); - } -} diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingNoticeArticleSummariesControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingNoticeArticleSummariesControllerTest.java deleted file mode 100644 index b6d976bb3..000000000 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/GettingNoticeArticleSummariesControllerTest.java +++ /dev/null @@ -1,121 +0,0 @@ -package com.woowacourse.moamoa.studyroom.controller; - -import static org.assertj.core.api.Assertions.assertThat; - -import com.woowacourse.moamoa.common.RepositoryTest; -import com.woowacourse.moamoa.common.utils.DateTimeSystem; -import com.woowacourse.moamoa.member.domain.Member; -import com.woowacourse.moamoa.member.domain.repository.MemberRepository; -import com.woowacourse.moamoa.study.domain.Study; -import com.woowacourse.moamoa.study.domain.repository.StudyRepository; -import com.woowacourse.moamoa.study.service.StudyService; -import com.woowacourse.moamoa.study.service.request.StudyRequestBuilder; -import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; -import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepository; -import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; -import com.woowacourse.moamoa.studyroom.query.NoticeArticleDao; -import com.woowacourse.moamoa.studyroom.service.NoticeArticleService; -import com.woowacourse.moamoa.studyroom.service.request.NoticeArticleRequest; -import com.woowacourse.moamoa.studyroom.service.response.ArticleSummariesResponse; -import com.woowacourse.moamoa.studyroom.service.response.ArticleSummaryResponse; -import com.woowacourse.moamoa.studyroom.service.response.AuthorResponse; -import java.time.LocalDate; -import java.util.List; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; - -@RepositoryTest -class GettingNoticeArticleSummariesControllerTest { - - StudyRequestBuilder javaStudyRequest = new StudyRequestBuilder() - .title("java 스터디").excerpt("자바 설명").thumbnail("java image").description("자바 소개"); - - private NoticeArticleService noticeArticleService; - - private StudyService studyService; - - @Autowired - private MemberRepository memberRepository; - - @Autowired - private StudyRoomRepository studyRoomRepository; - - @Autowired - private StudyRepository studyRepository; - - @Autowired - private ArticleRepository noticeArticleRepository; - - @Autowired - private NoticeArticleDao noticeArticleDao; - - @Autowired - private JpaRepository articleRepository; - - private NoticeArticleController sut; - - @BeforeEach - void setUp() { - noticeArticleService = new NoticeArticleService(studyRoomRepository, noticeArticleRepository, noticeArticleDao); - studyService = new StudyService(studyRepository, memberRepository, new DateTimeSystem()); - sut = new NoticeArticleController(noticeArticleService); - } - - @DisplayName("스터디 커뮤니티 글 목록을 조회한다.") - @Test - void getCommunityArticles() { - // arrange - Member 그린론 = memberRepository.save(new Member(1L, "그린론", "http://image", "http://profile")); - - Study study = studyService.createStudy(그린론.getId(), javaStudyRequest.startDate(LocalDate.now()).build()); - - noticeArticleService - .createArticle(그린론.getId(), study.getId(), new NoticeArticleRequest("제목1", "내용1")); - noticeArticleService - .createArticle(그린론.getId(), study.getId(), new NoticeArticleRequest("제목2", "내용2")); - NoticeArticle article3 = noticeArticleService - .createArticle(그린론.getId(), study.getId(), new NoticeArticleRequest("제목3", "내용3")); - NoticeArticle article4 = noticeArticleService - .createArticle(그린론.getId(), study.getId(), new NoticeArticleRequest("제목4", "내용4")); - NoticeArticle article5 = noticeArticleService - .createArticle(그린론.getId(), study.getId(), new NoticeArticleRequest("제목5", "내용5")); - - // act - ResponseEntity response = sut.getArticles(study.getId(), PageRequest.of(0, 3)); - - // assert - AuthorResponse author = new AuthorResponse(1L, "그린론", "http://image", "http://profile"); - - List articles = List.of( - new ArticleSummaryResponse(article5.getId(), author, "제목5", LocalDate.now(), LocalDate.now()), - new ArticleSummaryResponse(article4.getId(), author, "제목4", LocalDate.now(), LocalDate.now()), - new ArticleSummaryResponse(article3.getId(), author, "제목3", LocalDate.now(), LocalDate.now()) - ); - - assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); - assertThat(response.getBody()).isEqualTo( - new ArticleSummariesResponse(articles, 0, 1, 5) - ); - } - - @DisplayName("스터디가 없는 경우 빈 리스트를 반환한다.") - @Test - void returnEmptyDataWhenWriteToNotFoundStudy() { - // arrange - Member member = memberRepository.save(new Member(1L, "username", "imageUrl", "profileUrl")); - final Long memberId = member.getId(); - final PageRequest pageRequest = PageRequest.of(0, 3); - - // act - final ResponseEntity response = sut.getArticles(1L, pageRequest); - - // assert - assertThat(response.getBody().getArticles()).isEmpty(); - } -} diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java deleted file mode 100644 index 99286d1cd..000000000 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleControllerTest.java +++ /dev/null @@ -1,143 +0,0 @@ -package com.woowacourse.moamoa.studyroom.controller; - -import static com.woowacourse.moamoa.fixtures.MemberFixtures.디우; -import static com.woowacourse.moamoa.fixtures.MemberFixtures.짱구; -import static com.woowacourse.moamoa.fixtures.StudyFixtures.자바_스터디_신청서; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -import com.woowacourse.moamoa.common.RepositoryTest; -import com.woowacourse.moamoa.common.utils.DateTimeSystem; -import com.woowacourse.moamoa.member.domain.Member; -import com.woowacourse.moamoa.member.domain.repository.MemberRepository; -import com.woowacourse.moamoa.study.domain.Study; -import com.woowacourse.moamoa.study.domain.repository.StudyRepository; -import com.woowacourse.moamoa.study.service.StudyService; -import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; -import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; -import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; -import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepository; -import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; -import com.woowacourse.moamoa.studyroom.query.LinkArticleDao; -import com.woowacourse.moamoa.studyroom.service.LinkArticleService; -import com.woowacourse.moamoa.studyroom.service.request.LinkArticleRequest; -import java.time.LocalDate; -import javax.persistence.EntityManager; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; - -@RepositoryTest -class LinkArticleControllerTest { - - @Autowired - private MemberRepository memberRepository; - - @Autowired - private StudyRepository studyRepository; - - @Autowired - private StudyRoomRepository studyRoomRepository; - - @Autowired - private ArticleRepository articleRepository; - - @Autowired - private LinkArticleDao linkArticleDao; - - @Autowired - private EntityManager entityManager; - - private LinkArticleController sut; - - private StudyService studyService; - private LinkArticleService linkArticleService; - - @BeforeEach - void setUp() { - linkArticleService = new LinkArticleService(studyRoomRepository, articleRepository, linkArticleDao); - studyService = new StudyService(studyRepository, memberRepository, new DateTimeSystem()); - sut = new LinkArticleController(linkArticleService); - } - - @DisplayName("스터디에 참여하지 않은 회원은 링크 공유를 할 수 없다.") - @Test - void createByNotParticipatedMember() { - final Member 짱구 = memberRepository.save(짱구()); - final Member 디우 = memberRepository.save(디우()); - final Study 자바_스터디 = studyService.createStudy(짱구.getId(), 자바_스터디_신청서(LocalDate.now())); - - entityManager.flush(); - entityManager.clear(); - - final LinkArticleRequest articleRequest = - new LinkArticleRequest("https://github.com/sc0116", "링크 설명입니다."); - - assertThatThrownBy(() -> sut.createLink(디우.getId(), 자바_스터디.getId(), articleRequest)) - .isInstanceOf(UneditableArticleException.class); - } - - @DisplayName("존재하지 않는 링크 공유글을 수정할 수 없다.") - @Test - void updateByInvalidLinkId() { - final Member 짱구 = memberRepository.save(짱구()); - final Study 자바_스터디 = studyService.createStudy(짱구.getId(), 자바_스터디_신청서(LocalDate.now())); - - entityManager.flush(); - entityManager.clear(); - - final LinkArticleRequest editingLinkRequest = new LinkArticleRequest("www.naver.com", "수정"); - - assertThatThrownBy(() -> sut.updateLink(짱구.getId(), 자바_스터디.getId(), -1L, editingLinkRequest)) - .isInstanceOf(ArticleNotFoundException.class); - } - - @DisplayName("스터디에 참여하지 않은 경우 링크 공유글을 수정할 수 없다.") - @Test - void updateByNotParticipatedMember() { - final Member 짱구 = memberRepository.save(짱구()); - final Member 디우 = memberRepository.save(디우()); - - final Study 자바_스터디 = studyService.createStudy(짱구.getId(), 자바_스터디_신청서(LocalDate.now())); - - final LinkArticleRequest articleRequest = new LinkArticleRequest("https://github.com/sc0116", "링크 설명입니다."); - final LinkArticle 링크_게시글 = linkArticleService.createArticle(짱구.getId(), 자바_스터디.getId(), articleRequest); - - entityManager.flush(); - entityManager.clear(); - - assertThatThrownBy(() -> sut.updateLink(디우.getId(), 자바_스터디.getId(), 링크_게시글.getId(), articleRequest)) - .isInstanceOf(UneditableArticleException.class); - } - - @DisplayName("존재하지 않는 링크 공유글을 삭제할 수 없다.") - @Test - void deleteByInvalidLinkId() { - final Member 짱구 = memberRepository.save(짱구()); - final Study 자바_스터디 = studyService.createStudy(짱구.getId(), 자바_스터디_신청서(LocalDate.now())); - - entityManager.flush(); - entityManager.clear(); - - assertThatThrownBy(() -> sut.deleteLink(짱구.getId(), 자바_스터디.getId(), -1L)) - .isInstanceOf(ArticleNotFoundException.class); - } - - @DisplayName("스터디에 참여하지 않은 경우 링크 공유글을 삭제할 수 없다.") - @Test - void deleteByNotParticipatedMember() { - final Member 짱구 = memberRepository.save(짱구()); - final Member 디우 = memberRepository.save(디우()); - - final Study 자바_스터디 = studyService.createStudy(짱구.getId(), 자바_스터디_신청서(LocalDate.now())); - - final LinkArticleRequest articleRequest = new LinkArticleRequest("https://github.com/sc0116", "링크 설명입니다."); - final LinkArticle 링크_게시글 = linkArticleService.createArticle(짱구.getId(), 자바_스터디.getId(), articleRequest); - - entityManager.flush(); - entityManager.clear(); - - assertThatThrownBy(() -> sut.deleteLink(디우.getId(), 자바_스터디.getId(), 링크_게시글.getId())) - .isInstanceOf(UneditableArticleException.class); - } -} diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/NoticeArticleControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/NoticeArticleControllerTest.java deleted file mode 100644 index e033686ee..000000000 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/NoticeArticleControllerTest.java +++ /dev/null @@ -1,127 +0,0 @@ -package com.woowacourse.moamoa.studyroom.controller; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -import com.woowacourse.moamoa.common.RepositoryTest; -import com.woowacourse.moamoa.common.utils.DateTimeSystem; -import com.woowacourse.moamoa.member.domain.Member; -import com.woowacourse.moamoa.member.domain.repository.MemberRepository; -import com.woowacourse.moamoa.study.domain.Study; -import com.woowacourse.moamoa.study.domain.repository.StudyRepository; -import com.woowacourse.moamoa.study.service.StudyService; -import com.woowacourse.moamoa.study.service.exception.StudyNotFoundException; -import com.woowacourse.moamoa.study.service.request.StudyRequestBuilder; -import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; -import com.woowacourse.moamoa.studyroom.domain.article.NoticeContent; -import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepository; -import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; -import com.woowacourse.moamoa.studyroom.query.NoticeArticleDao; -import com.woowacourse.moamoa.studyroom.service.NoticeArticleService; -import com.woowacourse.moamoa.studyroom.service.request.NoticeArticleRequest; -import java.time.LocalDate; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; - -@RepositoryTest -class NoticeArticleControllerTest { - - StudyRequestBuilder javaStudyRequest = new StudyRequestBuilder() - .title("java 스터디").excerpt("자바 설명").thumbnail("java image").description("자바 소개"); - - @Autowired - private StudyRepository studyRepository; - - @Autowired - private MemberRepository memberRepository; - - @Autowired - private ArticleRepository noticeArticleRepository; - - @Autowired - private StudyRoomRepository studyRoomRepository; - - @Autowired - private NoticeArticleDao noticeArticleDao; - - @Autowired - private JpaRepository articleRepository; - - private StudyService studyService; - private NoticeArticleController sut; - - @BeforeEach - void setUp() { - studyService = new StudyService(studyRepository, memberRepository, new DateTimeSystem()); - sut = new NoticeArticleController( - new NoticeArticleService(studyRoomRepository, noticeArticleRepository, noticeArticleDao) - ); - } - - @DisplayName("커뮤니티 게시글을 작성한다.") - @Test - void createCommunityArticle() { - // arrange - Member owner = memberRepository.save(new Member(1L, "username", "imageUrl", "profileUrl")); - Study study = studyService - .createStudy(owner.getId(), javaStudyRequest.startDate(LocalDate.now()).build()); - - NoticeArticleRequest request = new NoticeArticleRequest("게시글 제목", "게시글 내용"); - - // act - ResponseEntity response = sut.createArticle(owner.getId(), study.getId(), request); - - // assert - String location = response.getHeaders().getLocation().getPath(); - Long articleId = Long.valueOf(location.replaceAll("/api/studies/\\d+/notice/articles/", "")); - - NoticeArticle actualArticle = noticeArticleRepository.findById(articleId) - .orElseThrow(); - - assertThat(response.getStatusCode()).isEqualTo(HttpStatus.CREATED); - assertThat(location).matches("/api/studies/\\d+/notice/articles/\\d+"); - assertThat(actualArticle.getContent()).isEqualTo(new NoticeContent("게시글 제목", "게시글 내용")); - } - - @DisplayName("커뮤니티 공지사항을 작성한다.") - @Test - void createNoticeArticle() { - // arrange - Member owner = memberRepository.save(new Member(1L, "username", "imageUrl", "profileUrl")); - Study study = studyService - .createStudy(owner.getId(), javaStudyRequest.startDate(LocalDate.now()).build()); - - NoticeArticleRequest request = new NoticeArticleRequest("게시글 제목", "게시글 내용"); - - // act - ResponseEntity response = sut.createArticle(owner.getId(), study.getId(), request); - - // assert - String location = response.getHeaders().getLocation().getPath(); - Long articleId = Long.valueOf(location.replaceAll("/api/studies/\\d+/notice/articles/", "")); - NoticeArticle actualArticle = noticeArticleRepository.findById(articleId).orElseThrow(); - - assertThat(response.getStatusCode()).isEqualTo(HttpStatus.CREATED); - assertThat(location).matches("/api/studies/\\d+/notice/articles/\\d+"); - assertThat(actualArticle.getContent()).isEqualTo(new NoticeContent("게시글 제목", "게시글 내용")); - } - - @DisplayName("스터디가 없는 경우 게시글 작성 시 예외가 발생한다.") - @Test - void throwExceptionWhenWriteToNotFoundStudy() { - // arrange - Member member = memberRepository.save(new Member(1L, "username", "imageUrl", "profileUrl")); - - final Long memberId = member.getId(); - final NoticeArticleRequest articleRequest = new NoticeArticleRequest("제목", "내용"); - - // act & assert - assertThatThrownBy(() -> sut.createArticle(memberId, 1L, articleRequest)) - .isInstanceOf(StudyNotFoundException.class); - } -} diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/UpdatingNoticeArticleControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/UpdatingNoticeArticleControllerTest.java deleted file mode 100644 index 6b692b61e..000000000 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/UpdatingNoticeArticleControllerTest.java +++ /dev/null @@ -1,126 +0,0 @@ -package com.woowacourse.moamoa.studyroom.controller; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -import com.woowacourse.moamoa.common.RepositoryTest; -import com.woowacourse.moamoa.common.utils.DateTimeSystem; -import com.woowacourse.moamoa.member.domain.Member; -import com.woowacourse.moamoa.member.domain.repository.MemberRepository; -import com.woowacourse.moamoa.study.domain.Study; -import com.woowacourse.moamoa.study.domain.repository.StudyRepository; -import com.woowacourse.moamoa.study.service.StudyService; -import com.woowacourse.moamoa.study.service.request.StudyRequestBuilder; -import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; -import com.woowacourse.moamoa.studyroom.domain.article.NoticeContent; -import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; -import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; -import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepository; -import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; -import com.woowacourse.moamoa.studyroom.query.NoticeArticleDao; -import com.woowacourse.moamoa.studyroom.service.NoticeArticleService; -import com.woowacourse.moamoa.studyroom.service.request.NoticeArticleRequest; -import java.time.LocalDate; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; - -@RepositoryTest -class UpdatingNoticeArticleControllerTest { - - StudyRequestBuilder javaStudyBuilder = new StudyRequestBuilder() - .title("java 스터디").excerpt("자바 설명").thumbnail("java image").description("자바 소개"); - - @Autowired - private StudyRepository studyRepository; - - @Autowired - private StudyRoomRepository studyRoomRepository; - - @Autowired - private MemberRepository memberRepository; - - @Autowired - private ArticleRepository noticeArticleRepository; - - @Autowired - private NoticeArticleDao noticeArticleDao; - - private StudyService studyService; - private NoticeArticleController sut; - private NoticeArticleService noticeArticleService; - - @BeforeEach - void setUp() { - studyService = new StudyService(studyRepository, memberRepository, new DateTimeSystem()); - noticeArticleService = new NoticeArticleService(studyRoomRepository, noticeArticleRepository, noticeArticleDao); - sut = new NoticeArticleController(noticeArticleService); - } - - @DisplayName("게시글을 수정한다.") - @Test - void updateArticle() { - // arrange - Member owner = memberRepository.save(new Member(1L, "username", "image", "profile")); - Study study = studyService - .createStudy(owner.getId(), javaStudyBuilder.startDate(LocalDate.now()).build()); - NoticeArticle article = noticeArticleService - .createArticle(owner.getId(), study.getId(), new NoticeArticleRequest("제목", "내용")); - - // act - final ResponseEntity response = sut - .updateArticle(owner.getId(), study.getId(), article.getId(), - new NoticeArticleRequest("제목 수정", "내용 수정")); - - // assert - NoticeArticle actualArticle = noticeArticleRepository.findById(article.getId()).orElseThrow(); - - assertThat(response.getStatusCode()).isEqualTo(HttpStatus.NO_CONTENT); - assertThat(actualArticle.getContent()).isEqualTo(new NoticeContent("제목 수정", "내용 수정")); - } - - @DisplayName("게시글이 없는 경우 수정 시 예외가 발생한다.") - @Test - void throwExceptionWhenUpdateToNotFoundArticle() { - // arrange - Member member = memberRepository.save(new Member(1L, "username", "imageUrl", "profileUrl")); - Study study = studyService - .createStudy(member.getId(), javaStudyBuilder.startDate(LocalDate.now()).build()); - - final Long memberId = member.getId(); - final Long studyId = study.getId(); - final NoticeArticleRequest articleRequest = new NoticeArticleRequest("제목 수정", "내용 수정"); - - // act & assert - assertThatThrownBy(() -> - sut.updateArticle(memberId, studyId, 1L, articleRequest) - ).isInstanceOf(ArticleNotFoundException.class); - } - - @DisplayName("게시글을 수정할 수 없는 경우 예외가 발생한다.") - @Test - void throwExceptionWhenUpdateByNotParticipant() { - // arrange - Member member = memberRepository.save(new Member(1L, "username", "imageUrl", "profileUrl")); - Member other = memberRepository.save(new Member(2L, "username2", "imageUrl", "profileUrl")); - - Study study = studyService - .createStudy(member.getId(), javaStudyBuilder.startDate(LocalDate.now()).build()); - - NoticeArticleRequest request = new NoticeArticleRequest("게시글 제목", "게시글 내용"); - final NoticeArticle article = noticeArticleService - .createArticle(member.getId(), study.getId(), request); - - final Long otherId = other.getId(); - final Long studyId = study.getId(); - final Long articleId = article.getId(); - final NoticeArticleRequest articleRequest = new NoticeArticleRequest("제목 수정", "내용 수정"); - - // act & assert - assertThatThrownBy(() -> sut.updateArticle(otherId, studyId, articleId, articleRequest)) - .isInstanceOf(UneditableArticleException.class); - } -} diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleServiceTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleServiceTest.java new file mode 100644 index 000000000..d63095df9 --- /dev/null +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleServiceTest.java @@ -0,0 +1,212 @@ +package com.woowacourse.moamoa.studyroom.service; + +import static com.woowacourse.moamoa.fixtures.MemberFixtures.디우; +import static com.woowacourse.moamoa.fixtures.MemberFixtures.짱구; +import static com.woowacourse.moamoa.fixtures.StudyFixtures.자바_스터디_신청서; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import com.woowacourse.moamoa.common.RepositoryTest; +import com.woowacourse.moamoa.common.utils.DateTimeSystem; +import com.woowacourse.moamoa.member.domain.Member; +import com.woowacourse.moamoa.member.domain.repository.MemberRepository; +import com.woowacourse.moamoa.study.domain.Study; +import com.woowacourse.moamoa.study.domain.repository.StudyRepository; +import com.woowacourse.moamoa.study.service.StudyService; +import com.woowacourse.moamoa.study.service.exception.StudyNotFoundException; +import com.woowacourse.moamoa.study.service.request.StudyRequest; +import com.woowacourse.moamoa.studyroom.domain.article.Article; +import com.woowacourse.moamoa.studyroom.domain.article.CommunityArticle; +import com.woowacourse.moamoa.studyroom.domain.article.CommunityContent; +import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; +import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; +import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepository; +import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; +import com.woowacourse.moamoa.studyroom.query.CommunityArticleDao; +import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; +import com.woowacourse.moamoa.studyroom.service.request.CommunityArticleRequest; +import java.time.LocalDate; +import javax.persistence.EntityManager; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +@RepositoryTest +public class CommunityArticleServiceTest { + + @Autowired + private MemberRepository memberRepository; + + @Autowired + private StudyRepository studyRepository; + + @Autowired + private StudyRoomRepository studyRoomRepository; + + @Autowired + private EntityManager entityManager; + + @Autowired + private ArticleRepository articleRepository; + + @Autowired + private CommunityArticleDao articleDao; + + private CommunityArticleService sut; + + @BeforeEach + void setUp() { + sut = new CommunityArticleService(studyRoomRepository, articleRepository, articleDao); + } + + @DisplayName("게시글을 작성한다.") + @Test + void createArticle() { + // arrange + final Member 짱구 = saveMember(짱구()); + final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); + final ArticleRequest articleRequest = new CommunityArticleRequest("제목", "설명"); + + // act + final CommunityArticle article = sut.createArticle(짱구.getId(), 자바_스터디.getId(), articleRequest); + + // assert + CommunityArticle actualArticle = articleRepository.findById(article.getId()) + .orElseThrow(); + assertThat(actualArticle.getContent()).isEqualTo(articleRequest.createContent()); + } + + @DisplayName("스터디가 없는 경우 게시글 작성 시 예외가 발생한다.") + @Test + void throwExceptionWhenWriteToNotFoundStudy() { + // arrange + final Member 짱구 = saveMember(짱구()); + final CommunityArticleRequest articleRequest = new CommunityArticleRequest("제목", "설명"); + + // act & assert + assertThatThrownBy(() -> sut.createArticle(짱구.getId(), 1L, articleRequest)) + .isInstanceOf(StudyNotFoundException.class); + } + + @DisplayName("스터디에 참여하지 않은 회원은 게시글을 작성할 수 없다.") + @Test + void createByNotParticipatedMember() { + final Member 짱구 = saveMember(짱구()); + final Member 디우 = saveMember(디우()); + final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); + + final CommunityArticleRequest articleRequest = new CommunityArticleRequest("제목", "설명"); + + assertThatThrownBy(() -> sut.createArticle(디우.getId(), 자바_스터디.getId(), articleRequest)) + .isInstanceOf(UneditableArticleException.class); + } + + @DisplayName("게시글을 수정한다.") + @Test + void updateArticle() { + // arrange + final Member 짱구 = saveMember(짱구()); + final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); + final CommunityArticleRequest articleRequest = new CommunityArticleRequest("제목", "설명"); + final ArticleRequest updatingArticleRequest = new CommunityArticleRequest("제목 수정", "설명 수정"); + final CommunityArticle article = sut.createArticle(짱구.getId(), 자바_스터디.getId(), articleRequest); + + // act + sut.updateArticle(짱구.getId(), 자바_스터디.getId(), article.getId(), updatingArticleRequest); + + // assert + Article actualArticle = articleRepository.findById(article.getId()).orElseThrow(); + assertThat(actualArticle.getContent()).isEqualTo(new CommunityContent("제목 수정", "설명 수정")); + } + + @DisplayName("존재하지 않는 게시글을 수정할 수 없다.") + @Test + void updateByInvalidLinkId() { + final Member 짱구 = saveMember(짱구()); + final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); + + final ArticleRequest articleRequest = new CommunityArticleRequest("제목", "수정"); + + assertThatThrownBy(() -> sut.updateArticle(짱구.getId(), 자바_스터디.getId(), -1L, articleRequest)) + .isInstanceOf(ArticleNotFoundException.class); + } + + @DisplayName("스터디에 참여하지 않은 경우 게시글을 수정할 수 없다.") + @Test + void updateByNotParticipatedMember() { + final Member 짱구 = saveMember(짱구()); + final Member 디우 = saveMember(디우()); + final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); + + final ArticleRequest articleRequest = new CommunityArticleRequest("제목", "설명"); + final Article 링크_게시글 = createArticle(짱구, 자바_스터디, articleRequest); + + assertThatThrownBy(() -> sut.updateArticle(디우.getId(), 자바_스터디.getId(), 링크_게시글.getId(), articleRequest)) + .isInstanceOf(UneditableArticleException.class); + } + + @DisplayName("게시글을 삭제한다.") + @Test + void deleteArticle() { + // arrange + final Member 짱구 = saveMember(짱구()); + final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); + final ArticleRequest articleRequest = new CommunityArticleRequest("제목", "설명"); + final Article 게시글 = createArticle(짱구, 자바_스터디, articleRequest); + + //act + sut.deleteArticle(짱구.getId(), 자바_스터디.getId(), 게시글.getId()); + + //assert + final Article deletedArticle = articleRepository.findById(게시글.getId()).orElseThrow(); + assertThat(deletedArticle.isDeleted()).isTrue(); + } + + @DisplayName("존재하지 않는 링크 공유글을 삭제할 수 없다.") + @Test + void deleteByInvalidLinkId() { + final Member 짱구 = saveMember(짱구()); + final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); + + assertThatThrownBy(() -> sut.deleteArticle(짱구.getId(), 자바_스터디.getId(), -1L)) + .isInstanceOf(ArticleNotFoundException.class); + } + + @DisplayName("스터디에 참여하지 않은 경우 링크 공유글을 삭제할 수 없다.") + @Test + void deleteByNotParticipatedMember() { + final Member 짱구 = saveMember(짱구()); + final Member 디우 = saveMember(디우()); + final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); + + final ArticleRequest articleRequest = new CommunityArticleRequest("제목", "설명"); + final CommunityArticle 링크_게시글 = sut.createArticle(짱구.getId(), 자바_스터디.getId(), articleRequest); + + assertThatThrownBy(() -> sut.deleteArticle(디우.getId(), 자바_스터디.getId(), 링크_게시글.getId())) + .isInstanceOf(UneditableArticleException.class); + } + + private Member saveMember(final Member member) { + final Member savedMember = memberRepository.save(member); + entityManager.flush(); + entityManager.clear(); + return savedMember; + } + + private Study createStudy(final Member owner, StudyRequest studyRequest) { + final StudyService studyService = new StudyService(studyRepository, memberRepository, new DateTimeSystem()); + final Study study = studyService.createStudy(owner.getId(), studyRequest); + entityManager.flush(); + entityManager.clear(); + return study; + } + + private CommunityArticle createArticle(final Member author, final Study study, + final ArticleRequest articleRequest) { + final CommunityArticle article = sut.createArticle(author.getId(), study.getId(), articleRequest); + entityManager.flush(); + entityManager.clear(); + return article; + } +} diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/AbstractArticleServiceTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/LinkArticleServiceTest.java similarity index 60% rename from backend/src/test/java/com/woowacourse/moamoa/studyroom/service/AbstractArticleServiceTest.java rename to backend/src/test/java/com/woowacourse/moamoa/studyroom/service/LinkArticleServiceTest.java index 7c78e6b49..206d53f0e 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/AbstractArticleServiceTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/LinkArticleServiceTest.java @@ -3,6 +3,7 @@ import static com.woowacourse.moamoa.fixtures.MemberFixtures.디우; import static com.woowacourse.moamoa.fixtures.MemberFixtures.짱구; import static com.woowacourse.moamoa.fixtures.StudyFixtures.자바_스터디_신청서; +import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import com.woowacourse.moamoa.common.RepositoryTest; @@ -12,7 +13,11 @@ import com.woowacourse.moamoa.study.domain.Study; import com.woowacourse.moamoa.study.domain.repository.StudyRepository; import com.woowacourse.moamoa.study.service.StudyService; +import com.woowacourse.moamoa.study.service.exception.StudyNotFoundException; import com.woowacourse.moamoa.study.service.request.StudyRequest; +import com.woowacourse.moamoa.studyroom.controller.LinkArticleController; +import com.woowacourse.moamoa.studyroom.domain.article.Article; +import com.woowacourse.moamoa.studyroom.domain.article.Content; import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; import com.woowacourse.moamoa.studyroom.domain.article.LinkContent; import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; @@ -23,14 +28,17 @@ import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; import com.woowacourse.moamoa.studyroom.service.request.LinkArticleRequest; import java.time.LocalDate; +import java.util.function.Supplier; import javax.persistence.EntityManager; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; @RepositoryTest -class AbstractArticleServiceTest { +public class LinkArticleServiceTest { @Autowired private MemberRepository memberRepository; @@ -42,38 +50,82 @@ class AbstractArticleServiceTest { private StudyRoomRepository studyRoomRepository; @Autowired - private ArticleRepository articleRepository; + private EntityManager entityManager; @Autowired - private LinkArticleDao linkArticleDao; + private ArticleRepository articleRepository; @Autowired - private EntityManager entityManager; - - private StudyService studyService; + private LinkArticleDao linkArticleDao; - private AbstractArticleService sut; + private LinkArticleService sut; @BeforeEach void setUp() { - studyService = new StudyService(studyRepository, memberRepository, new DateTimeSystem()); sut = new LinkArticleService(studyRoomRepository, articleRepository, linkArticleDao); } - @DisplayName("스터디에 참여하지 않은 회원은 링크 공유를 할 수 없다.") + @DisplayName("게시글을 작성한다.") + @Test + void createArticle() { + // arrange + final Member 짱구 = saveMember(짱구()); + final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); + final LinkArticleRequest articleRequest = new LinkArticleRequest("www.naver.com", "설명"); + + // act + final LinkArticle article = sut.createArticle(짱구.getId(), 자바_스터디.getId(), articleRequest); + + // assert + LinkArticle actualArticle = articleRepository.findById(article.getId()) + .orElseThrow(); + assertThat(actualArticle.getContent()).isEqualTo(articleRequest.createContent()); + } + + @DisplayName("스터디가 없는 경우 게시글 작성 시 예외가 발생한다.") + @Test + void throwExceptionWhenWriteToNotFoundStudy() { + // arrange + final Member 짱구 = saveMember(짱구()); + final LinkArticleRequest articleRequest = new LinkArticleRequest("www.naver.com", "설명"); + + // act & assert + assertThatThrownBy(() -> sut.createArticle(짱구.getId(), 1L, articleRequest)) + .isInstanceOf(StudyNotFoundException.class); + } + + @DisplayName("스터디에 참여하지 않은 회원은 게시글을 작성할 수 없다.") @Test void createByNotParticipatedMember() { final Member 짱구 = saveMember(짱구()); final Member 디우 = saveMember(디우()); final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); - final ArticleRequest articleRequest = new LinkArticleRequest("www.naver.com", "설명"); + final LinkArticleRequest articleRequest = new LinkArticleRequest("www.naver.com", "설명"); assertThatThrownBy(() -> sut.createArticle(디우.getId(), 자바_스터디.getId(), articleRequest)) .isInstanceOf(UneditableArticleException.class); } - @DisplayName("존재하지 않는 링크 공유글을 수정할 수 없다.") + @DisplayName("게시글을 수정한다.") + @Test + void updateArticle() { + // arrange + final Member 짱구 = saveMember(짱구()); + final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); + final LinkArticleRequest articleRequest = new LinkArticleRequest("www.naver.com", "설명"); + final ArticleRequest updatingArticleRequest = new LinkArticleRequest("링크 수정", "설명 수정"); + final LinkArticle article = sut.createArticle(짱구.getId(), 자바_스터디.getId(), articleRequest); + + // act + sut.updateArticle(짱구.getId(), 자바_스터디.getId(), article.getId(), updatingArticleRequest); + + // assert + Article actualArticle = articleRepository.findById(article.getId()).orElseThrow(); + assertThat(actualArticle.getContent()).isEqualTo(new LinkContent("링크 수정", "설명 수정")); + } + + @DisplayName("존재하지 않는 게시글을 수정할 수 없다.") @Test void updateByInvalidLinkId() { final Member 짱구 = saveMember(짱구()); @@ -85,7 +137,7 @@ void updateByInvalidLinkId() { .isInstanceOf(ArticleNotFoundException.class); } - @DisplayName("스터디에 참여하지 않은 경우 링크 공유글을 수정할 수 없다.") + @DisplayName("스터디에 참여하지 않은 경우 게시글을 수정할 수 없다.") @Test void updateByNotParticipatedMember() { final Member 짱구 = saveMember(짱구()); @@ -93,12 +145,29 @@ void updateByNotParticipatedMember() { final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); final ArticleRequest articleRequest = new LinkArticleRequest("www.naver.com", "설명"); - final LinkArticle 링크_게시글 = createArticle(짱구, 자바_스터디, articleRequest); + final Article 링크_게시글 = createArticle(짱구, 자바_스터디, articleRequest); assertThatThrownBy(() -> sut.updateArticle(디우.getId(), 자바_스터디.getId(), 링크_게시글.getId(), articleRequest)) .isInstanceOf(UneditableArticleException.class); } + @DisplayName("게시글을 삭제한다.") + @Test + void deleteArticle() { + // arrange + final Member 짱구 = saveMember(짱구()); + final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); + final ArticleRequest articleRequest = new LinkArticleRequest("www.naver.com", "설명"); + final Article 게시글 = createArticle(짱구, 자바_스터디, articleRequest); + + //act + sut.deleteArticle(짱구.getId(), 자바_스터디.getId(), 게시글.getId()); + + //assert + final Article deletedArticle = articleRepository.findById(게시글.getId()).orElseThrow(); + assertThat(deletedArticle.isDeleted()).isTrue(); + } + @DisplayName("존재하지 않는 링크 공유글을 삭제할 수 없다.") @Test void deleteByInvalidLinkId() { @@ -131,6 +200,7 @@ private Member saveMember(final Member member) { } private Study createStudy(final Member owner, StudyRequest studyRequest) { + final StudyService studyService = new StudyService(studyRepository, memberRepository, new DateTimeSystem()); final Study study = studyService.createStudy(owner.getId(), studyRequest); entityManager.flush(); entityManager.clear(); diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleServiceTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleServiceTest.java new file mode 100644 index 000000000..0a828aad4 --- /dev/null +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleServiceTest.java @@ -0,0 +1,212 @@ +package com.woowacourse.moamoa.studyroom.service; + +import static com.woowacourse.moamoa.fixtures.MemberFixtures.디우; +import static com.woowacourse.moamoa.fixtures.MemberFixtures.짱구; +import static com.woowacourse.moamoa.fixtures.StudyFixtures.자바_스터디_신청서; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import com.woowacourse.moamoa.common.RepositoryTest; +import com.woowacourse.moamoa.common.utils.DateTimeSystem; +import com.woowacourse.moamoa.member.domain.Member; +import com.woowacourse.moamoa.member.domain.repository.MemberRepository; +import com.woowacourse.moamoa.study.domain.Study; +import com.woowacourse.moamoa.study.domain.repository.StudyRepository; +import com.woowacourse.moamoa.study.service.StudyService; +import com.woowacourse.moamoa.study.service.exception.StudyNotFoundException; +import com.woowacourse.moamoa.study.service.request.StudyRequest; +import com.woowacourse.moamoa.studyroom.domain.article.Article; +import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; +import com.woowacourse.moamoa.studyroom.domain.article.NoticeContent; +import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; +import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; +import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepository; +import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; +import com.woowacourse.moamoa.studyroom.query.NoticeArticleDao; +import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; +import com.woowacourse.moamoa.studyroom.service.request.NoticeArticleRequest; +import java.time.LocalDate; +import javax.persistence.EntityManager; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +@RepositoryTest +public class NoticeArticleServiceTest { + + @Autowired + private MemberRepository memberRepository; + + @Autowired + private StudyRepository studyRepository; + + @Autowired + private StudyRoomRepository studyRoomRepository; + + @Autowired + private EntityManager entityManager; + + @Autowired + private ArticleRepository articleRepository; + + @Autowired + private NoticeArticleDao articleDao; + + private NoticeArticleService sut; + + @BeforeEach + void setUp() { + sut = new NoticeArticleService(studyRoomRepository, articleRepository, articleDao); + } + + @DisplayName("게시글을 작성한다.") + @Test + void createArticle() { + // arrange + final Member 짱구 = saveMember(짱구()); + final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); + final ArticleRequest articleRequest = new NoticeArticleRequest("제목", "설명"); + + // act + final NoticeArticle article = sut.createArticle(짱구.getId(), 자바_스터디.getId(), articleRequest); + + // assert + NoticeArticle actualArticle = articleRepository.findById(article.getId()) + .orElseThrow(); + assertThat(actualArticle.getContent()).isEqualTo(articleRequest.createContent()); + } + + @DisplayName("스터디가 없는 경우 게시글 작성 시 예외가 발생한다.") + @Test + void throwExceptionWhenWriteToNotFoundStudy() { + // arrange + final Member 짱구 = saveMember(짱구()); + final NoticeArticleRequest articleRequest = new NoticeArticleRequest("제목", "설명"); + + // act & assert + assertThatThrownBy(() -> sut.createArticle(짱구.getId(), 1L, articleRequest)) + .isInstanceOf(StudyNotFoundException.class); + } + + @DisplayName("스터디에 참여하지 않은 회원은 게시글을 작성할 수 없다.") + @Test + void createByNotParticipatedMember() { + final Member 짱구 = saveMember(짱구()); + final Member 디우 = saveMember(디우()); + final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); + + final NoticeArticleRequest articleRequest = new NoticeArticleRequest("제목", "설명"); + + assertThatThrownBy(() -> sut.createArticle(디우.getId(), 자바_스터디.getId(), articleRequest)) + .isInstanceOf(UneditableArticleException.class); + } + + @DisplayName("게시글을 수정한다.") + @Test + void updateArticle() { + // arrange + final Member 짱구 = saveMember(짱구()); + final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); + final NoticeArticleRequest articleRequest = new NoticeArticleRequest("제목", "설명"); + final ArticleRequest updatingArticleRequest = new NoticeArticleRequest("제목 수정", "설명 수정"); + final NoticeArticle article = sut.createArticle(짱구.getId(), 자바_스터디.getId(), articleRequest); + + // act + sut.updateArticle(짱구.getId(), 자바_스터디.getId(), article.getId(), updatingArticleRequest); + + // assert + Article actualArticle = articleRepository.findById(article.getId()).orElseThrow(); + assertThat(actualArticle.getContent()).isEqualTo(new NoticeContent("제목 수정", "설명 수정")); + } + + @DisplayName("존재하지 않는 게시글을 수정할 수 없다.") + @Test + void updateByInvalidLinkId() { + final Member 짱구 = saveMember(짱구()); + final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); + + final ArticleRequest articleRequest = new NoticeArticleRequest("제목", "수정"); + + assertThatThrownBy(() -> sut.updateArticle(짱구.getId(), 자바_스터디.getId(), -1L, articleRequest)) + .isInstanceOf(ArticleNotFoundException.class); + } + + @DisplayName("스터디에 참여하지 않은 경우 게시글을 수정할 수 없다.") + @Test + void updateByNotParticipatedMember() { + final Member 짱구 = saveMember(짱구()); + final Member 디우 = saveMember(디우()); + final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); + + final ArticleRequest articleRequest = new NoticeArticleRequest("제목", "설명"); + final Article 링크_게시글 = createArticle(짱구, 자바_스터디, articleRequest); + + assertThatThrownBy(() -> sut.updateArticle(디우.getId(), 자바_스터디.getId(), 링크_게시글.getId(), articleRequest)) + .isInstanceOf(UneditableArticleException.class); + } + + @DisplayName("게시글을 삭제한다.") + @Test + void deleteArticle() { + // arrange + final Member 짱구 = saveMember(짱구()); + final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); + final ArticleRequest articleRequest = new NoticeArticleRequest("제목", "설명"); + final Article 게시글 = createArticle(짱구, 자바_스터디, articleRequest); + + //act + sut.deleteArticle(짱구.getId(), 자바_스터디.getId(), 게시글.getId()); + + //assert + final Article deletedArticle = articleRepository.findById(게시글.getId()).orElseThrow(); + assertThat(deletedArticle.isDeleted()).isTrue(); + } + + @DisplayName("존재하지 않는 링크 공유글을 삭제할 수 없다.") + @Test + void deleteByInvalidLinkId() { + final Member 짱구 = saveMember(짱구()); + final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); + + assertThatThrownBy(() -> sut.deleteArticle(짱구.getId(), 자바_스터디.getId(), -1L)) + .isInstanceOf(ArticleNotFoundException.class); + } + + @DisplayName("스터디에 참여하지 않은 경우 링크 공유글을 삭제할 수 없다.") + @Test + void deleteByNotParticipatedMember() { + final Member 짱구 = saveMember(짱구()); + final Member 디우 = saveMember(디우()); + final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); + + final ArticleRequest articleRequest = new NoticeArticleRequest("제목", "설명"); + final NoticeArticle 링크_게시글 = sut.createArticle(짱구.getId(), 자바_스터디.getId(), articleRequest); + + assertThatThrownBy(() -> sut.deleteArticle(디우.getId(), 자바_스터디.getId(), 링크_게시글.getId())) + .isInstanceOf(UneditableArticleException.class); + } + + private Member saveMember(final Member member) { + final Member savedMember = memberRepository.save(member); + entityManager.flush(); + entityManager.clear(); + return savedMember; + } + + private Study createStudy(final Member owner, StudyRequest studyRequest) { + final StudyService studyService = new StudyService(studyRepository, memberRepository, new DateTimeSystem()); + final Study study = studyService.createStudy(owner.getId(), studyRequest); + entityManager.flush(); + entityManager.clear(); + return study; + } + + private NoticeArticle createArticle(final Member author, final Study study, + final ArticleRequest articleRequest) { + final NoticeArticle article = sut.createArticle(author.getId(), study.getId(), articleRequest); + entityManager.flush(); + entityManager.clear(); + return article; + } +} From c450b6403e5678a3840bf0637425616baf9215de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=A7=84=ED=98=81?= Date: Thu, 29 Sep 2022 21:20:37 +0900 Subject: [PATCH 28/40] =?UTF-8?q?refactor:=20=EC=BB=A4=EB=AE=A4=EB=8B=88?= =?UTF-8?q?=ED=8B=B0=20=EA=B2=8C=EC=8B=9C=EA=B8=80=20=EC=82=AD=EC=A0=9C=20?= =?UTF-8?q?URL=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20Article=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=EC=9E=90=20=EC=A0=91=EA=B7=BC=20=EC=A0=9C=EC=96=B4?= =?UTF-8?q?=EC=9E=90=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../moamoa/studyroom/controller/CommunityArticleController.java | 2 +- .../woowacourse/moamoa/studyroom/domain/article/Article.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/CommunityArticleController.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/CommunityArticleController.java index d3ec3c19e..6efdc8560 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/CommunityArticleController.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/CommunityArticleController.java @@ -47,7 +47,7 @@ public ResponseEntity getArticle(@PathVariable("article-id") fi return ResponseEntity.ok().body(response); } - @DeleteMapping("{article-id}") + @DeleteMapping("/{article-id}") public ResponseEntity deleteArticle(@AuthenticatedMemberId final Long id, @PathVariable("study-id") final Long studyId, @PathVariable("article-id") final Long articleId diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java index 77b478624..d5d51e2f2 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java @@ -33,7 +33,7 @@ public abstract class Article>> extends B @Column(nullable = false) private boolean deleted; - public Article(final Long id, final StudyRoom studyRoom, final Long authorId) { + protected Article(final Long id, final StudyRoom studyRoom, final Long authorId) { this.id = id; this.studyRoom = studyRoom; this.authorId = authorId; From bba885236d2ce04f03c351ef5772e609764d74af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=A7=84=ED=98=81?= Date: Thu, 29 Sep 2022 22:00:45 +0900 Subject: [PATCH 29/40] =?UTF-8?q?refactor:=20LinkArticle=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EA=B0=80=EB=8F=85?= =?UTF-8?q?=EC=84=B1=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../acceptance/steps/StudyRelatedSteps.java | 3 +- .../domain/article/LinkArticleTest.java | 75 ++++++++++++------- .../domain/article/LinkContentTest.java | 45 ++++++----- .../service/CommunityArticleServiceTest.java | 12 +-- .../service/LinkArticleServiceTest.java | 2 +- .../service/NoticeArticleServiceTest.java | 2 +- 6 files changed, 82 insertions(+), 57 deletions(-) diff --git a/backend/src/test/java/com/woowacourse/acceptance/steps/StudyRelatedSteps.java b/backend/src/test/java/com/woowacourse/acceptance/steps/StudyRelatedSteps.java index e22eef7bf..61f58540f 100644 --- a/backend/src/test/java/com/woowacourse/acceptance/steps/StudyRelatedSteps.java +++ b/backend/src/test/java/com/woowacourse/acceptance/steps/StudyRelatedSteps.java @@ -7,6 +7,7 @@ import com.woowacourse.moamoa.review.service.request.WriteReviewRequest; import com.woowacourse.moamoa.studyroom.service.request.CommunityArticleRequest; import com.woowacourse.moamoa.studyroom.service.request.LinkArticleRequest; +import com.woowacourse.moamoa.studyroom.service.request.NoticeArticleRequest; import io.restassured.RestAssured; import org.junit.jupiter.api.Assertions; import org.springframework.http.HttpHeaders; @@ -74,7 +75,7 @@ public class StudyRelatedSteps extends Steps { final String location = RestAssured.given().log().all() .header(org.apache.http.HttpHeaders.AUTHORIZATION, token) .header(org.apache.http.HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) - .body(objectMapper.writeValueAsString(new CommunityArticleRequest(title, content))) + .body(objectMapper.writeValueAsString(new NoticeArticleRequest(title, content))) .pathParam("study-id", studyId) .when().log().all() .post("/api/studies/{study-id}/notice/articles") diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticleTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticleTest.java index da279f632..b101e340a 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticleTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticleTest.java @@ -14,22 +14,25 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.CsvSource; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; class LinkArticleTest { + private static final long OWNER_ID = 1L; + private static final long STUDY_ID = 1L; + @DisplayName("링크 게시글을 작성자가 수정한다.") @Test void update() { // arrange - final Member owner = createMember(1L); - final StudyRoom studyRoom = createStudyRoom(1L, owner); - final Accessor accessor = new Accessor(owner.getId(), studyRoom.getId()); - final LinkContent linkContent = new LinkContent("link", "설명"); - final LinkArticle sut = linkContent.createArticle(studyRoom, accessor); + final Member owner = createOwner(); + final StudyRoom studyRoom = createStudyRoom(owner); + final LinkArticle sut = createLinkArticle(owner, studyRoom); + final Accessor authorAccessor = new Accessor(owner.getId(), studyRoom.getId()); // act - sut.update(accessor, new LinkContent("updated link", "수정된 설명")); + sut.update(authorAccessor, new LinkContent("updated link", "수정된 설명")); // assert assertThat(sut.getContent()).isEqualTo(new LinkContent("updated link", "수정된 설명")); @@ -37,24 +40,22 @@ void update() { @ParameterizedTest @DisplayName("스터디에 참여한 작성자 외에는 링크 게시글을 수정할 수 없다.") - @CsvSource({"2,1", "1,2"}) - void updateByNotAuthor(final long memberId, final long studyId) { - final Member owner = createMember(1L); - final StudyRoom studyRoom = createStudyRoom(1L, owner); - final LinkContent linkContent = new LinkContent("link", "설명"); - final LinkArticle sut = linkContent.createArticle(studyRoom, new Accessor(owner.getId(), studyRoom.getId())); + @MethodSource("provideForbiddenAccessor") + void updateByNotAuthor(final Accessor forbiddenAccessor) { + final Member owner = createOwner(); + final StudyRoom studyRoom = createStudyRoom(owner); + final LinkArticle sut = createLinkArticle(owner, studyRoom); - assertThatThrownBy(() -> sut.update(new Accessor(memberId, studyId), new LinkContent("updated link", "수정된 설명"))) + assertThatThrownBy(() -> sut.update(forbiddenAccessor, new LinkContent("updated link", "수정된 설명"))) .isInstanceOf(UneditableArticleException.class); } @DisplayName("스터디에 참여한 작성자만 링크 게시글을 삭제할 수 있다.") @Test void delete() { - final Member owner = createMember(1L); - final StudyRoom studyRoom = createStudyRoom(1L, owner); - final LinkContent linkContent = new LinkContent("link", "설명"); - final LinkArticle sut = linkContent.createArticle(studyRoom, new Accessor(owner.getId(), studyRoom.getId())); + final Member owner = createOwner(); + final StudyRoom studyRoom = createStudyRoom(owner); + final LinkArticle sut = createLinkArticle(owner, studyRoom); sut.delete(new Accessor(1L, 1L)); @@ -63,25 +64,41 @@ void delete() { @ParameterizedTest @DisplayName("스터디에 참여한 작성자 외에는 링크 게시글을 삭제할 수 없다.") - @CsvSource({"2,1", "1,2"}) - void deleteByNotAuthor(final long memberId, final long studyId) { - final Member owner = createMember(1L); - final StudyRoom studyRoom = createStudyRoom(1L, owner); - final LinkContent linkContent = new LinkContent("link", "설명"); - final LinkArticle sut = linkContent.createArticle(studyRoom, new Accessor(owner.getId(), studyRoom.getId())); + @MethodSource("provideForbiddenAccessor") + void deleteByNotAuthor(final Accessor forbiddenAccessor) { + final Member owner = createOwner(); + final StudyRoom studyRoom = createStudyRoom(owner); + final LinkArticle sut = createLinkArticle(owner, studyRoom); - assertThatThrownBy(() -> sut.delete(new Accessor(memberId, studyId))) + assertThatThrownBy(() -> sut.delete(forbiddenAccessor)) .isInstanceOf(UneditableArticleException.class); } - private StudyRoom createStudyRoom(long studyId, Member owner, Member... participant) { + private static Stream provideForbiddenAccessor() { + final long otherMemberId = OWNER_ID + 1; + final long otherStudyId = STUDY_ID + 1; + + return Stream.of( + Arguments.of(new Accessor(otherMemberId, STUDY_ID)), + Arguments.of(new Accessor(OWNER_ID, otherStudyId)), + Arguments.of(new Accessor(otherMemberId, otherStudyId)) + ); + } + + private Member createOwner() { + return new Member(OWNER_ID, OWNER_ID, "owner", "image", "profile"); + } + + private StudyRoom createStudyRoom(Member owner, Member... participant) { final Set participants = Stream.of(participant) .map(Member::getId) .collect(Collectors.toSet()); - return new StudyRoom(studyId, owner.getId(), participants); + return new StudyRoom(STUDY_ID, owner.getId(), participants); } - private Member createMember(final long id) { - return new Member(id, id, "username" + id, "image", "profile"); + private LinkArticle createLinkArticle(final Member owner, final StudyRoom studyRoom) { + final Accessor accessor = new Accessor(owner.getId(), studyRoom.getId()); + final LinkContent linkContent = new LinkContent("link", "설명"); + return linkContent.createArticle(studyRoom, accessor); } } diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/LinkContentTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/LinkContentTest.java index 17fc6b6a6..358f24d10 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/LinkContentTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/LinkContentTest.java @@ -17,56 +17,63 @@ class LinkContentTest { + private static final long OWNER_ID = 1L; + private static final long PARTICIPANT_ID = 2L; + private static final long STUDY_ID = 1L; + @ParameterizedTest @DisplayName("링크 게시글을 스터디에 참여한 인원은 작성할 수 있다.") - @MethodSource("provideAccessibleAccessorForLinkArticle") - void writeLinkArticleByAccessibleAccessor(final Accessor accessor) { + @MethodSource("providePermittedAccessorForLinkArticle") + void writeLinkArticleByAccessibleAccessor(final Accessor permittedAccessor) { // arrange - final Member owner = createMember(1L); - final Member participant = createMember(2L); - final StudyRoom studyRoom = createStudyRoom(1L, owner, participant); + final Member owner = createMember(OWNER_ID); + final Member participant = createMember(PARTICIPANT_ID); + final StudyRoom studyRoom = createStudyRoom(owner, participant); final LinkContent sut = new LinkContent("link", "설명"); // act & assert - assertThatCode(() -> sut.createArticle(studyRoom, accessor)) + assertThatCode(() -> sut.createArticle(studyRoom, permittedAccessor)) .doesNotThrowAnyException(); } - private static Stream provideAccessibleAccessorForLinkArticle() { + private static Stream providePermittedAccessorForLinkArticle() { return Stream.of( - Arguments.of(new Accessor(1L, 1L)), // 방장 - Arguments.of(new Accessor(2L, 1L)) // 일반 참여자 + Arguments.of(new Accessor(OWNER_ID, STUDY_ID)), + Arguments.of(new Accessor(PARTICIPANT_ID, STUDY_ID)) ); } @ParameterizedTest @DisplayName("링크글을 스터디 참여자만 작성할 수 있다.") - @MethodSource("provideNonAccessibleAccessorForLinkArticle") - void cantWriteLinkArticleByNonAccessibleAccessor(final Accessor accessor) { + @MethodSource("provideForbiddenAccessorForLinkArticle") + void cantWriteLinkArticleByForbiddenAccessor(final Accessor forbiddenAccessor) { // arrange - final Member owner = createMember(1L); - final StudyRoom studyRoom = createStudyRoom(1L, owner); + final Member owner = createMember(OWNER_ID); + final StudyRoom studyRoom = createStudyRoom(owner); // act & assert final LinkContent sut = new LinkContent("link", "설명"); // act & assert - assertThatThrownBy(() -> sut.createArticle(studyRoom, accessor)) + assertThatThrownBy(() -> sut.createArticle(studyRoom, forbiddenAccessor)) .isInstanceOf(UneditableArticleException.class); } - private static Stream provideNonAccessibleAccessorForLinkArticle() { + private static Stream provideForbiddenAccessorForLinkArticle() { + final long otherMemberId = Math.max(OWNER_ID, PARTICIPANT_ID) + 1; + final long otherStudyId = STUDY_ID + 1; + return Stream.of( - Arguments.of(new Accessor(1L, 2L)), // studyId가 잘못된 경우 - Arguments.of(new Accessor(2L, 1L)) // 스터디에 참여하지 않은 접근자 + Arguments.of(new Accessor(OWNER_ID, otherStudyId)), // studyId가 잘못된 경우 + Arguments.of(new Accessor(otherMemberId, STUDY_ID)) // 스터디에 참여하지 않은 접근자 ); } - private StudyRoom createStudyRoom(long studyId, Member owner, Member... participant) { + private StudyRoom createStudyRoom(Member owner, Member... participant) { final Set participants = Stream.of(participant) .map(Member::getId) .collect(Collectors.toSet()); - return new StudyRoom(studyId, owner.getId(), participants); + return new StudyRoom(STUDY_ID, owner.getId(), participants); } private Member createMember(final long id) { diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleServiceTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleServiceTest.java index d63095df9..0f0a1379f 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleServiceTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleServiceTest.java @@ -33,7 +33,7 @@ import org.springframework.beans.factory.annotation.Autowired; @RepositoryTest -public class CommunityArticleServiceTest { +class CommunityArticleServiceTest { @Autowired private MemberRepository memberRepository; @@ -108,9 +108,9 @@ void updateArticle() { // arrange final Member 짱구 = saveMember(짱구()); final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); - final CommunityArticleRequest articleRequest = new CommunityArticleRequest("제목", "설명"); + final CommunityArticle article = createArticle(짱구, 자바_스터디, new CommunityArticleRequest("제목", "설명")); + final ArticleRequest updatingArticleRequest = new CommunityArticleRequest("제목 수정", "설명 수정"); - final CommunityArticle article = sut.createArticle(짱구.getId(), 자바_스터디.getId(), articleRequest); // act sut.updateArticle(짱구.getId(), 자바_스터디.getId(), article.getId(), updatingArticleRequest); @@ -163,7 +163,7 @@ void deleteArticle() { assertThat(deletedArticle.isDeleted()).isTrue(); } - @DisplayName("존재하지 않는 링크 공유글을 삭제할 수 없다.") + @DisplayName("존재하지 않는 게시글을 삭제할 수 없다.") @Test void deleteByInvalidLinkId() { final Member 짱구 = saveMember(짱구()); @@ -173,7 +173,7 @@ void deleteByInvalidLinkId() { .isInstanceOf(ArticleNotFoundException.class); } - @DisplayName("스터디에 참여하지 않은 경우 링크 공유글을 삭제할 수 없다.") + @DisplayName("스터디에 참여하지 않은 경우 게시글을 삭제할 수 없다.") @Test void deleteByNotParticipatedMember() { final Member 짱구 = saveMember(짱구()); @@ -203,7 +203,7 @@ private Study createStudy(final Member owner, StudyRequest studyRequest) { } private CommunityArticle createArticle(final Member author, final Study study, - final ArticleRequest articleRequest) { + final ArticleRequest articleRequest) { final CommunityArticle article = sut.createArticle(author.getId(), study.getId(), articleRequest); entityManager.flush(); entityManager.clear(); diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/LinkArticleServiceTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/LinkArticleServiceTest.java index 206d53f0e..87b49fd43 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/LinkArticleServiceTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/LinkArticleServiceTest.java @@ -38,7 +38,7 @@ import org.springframework.transaction.annotation.Transactional; @RepositoryTest -public class LinkArticleServiceTest { +class LinkArticleServiceTest { @Autowired private MemberRepository memberRepository; diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleServiceTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleServiceTest.java index 0a828aad4..a0d79dc56 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleServiceTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleServiceTest.java @@ -33,7 +33,7 @@ import org.springframework.beans.factory.annotation.Autowired; @RepositoryTest -public class NoticeArticleServiceTest { +class NoticeArticleServiceTest { @Autowired private MemberRepository memberRepository; From 8a16f8776039be540940973516e37e7ce5f72aa5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=A7=84=ED=98=81?= Date: Thu, 29 Sep 2022 22:10:51 +0900 Subject: [PATCH 30/40] =?UTF-8?q?test:=20CommunityArticle=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EA=B0=80=EB=8F=85=EC=84=B1=20=EC=A0=95?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/article/CommunityArticleTest.java | 79 ++++++++++++------- .../domain/article/CommunityContentTest.java | 45 ++++++----- 2 files changed, 76 insertions(+), 48 deletions(-) diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticleTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticleTest.java index 713882ab9..3a7dd65b4 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticleTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticleTest.java @@ -13,22 +13,27 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.CsvSource; +import org.junit.jupiter.params.provider.MethodSource; class CommunityArticleTest { + private static final long OWNER_ID = 1L; + private static final long STUDY_ID = 1L; + @DisplayName("스터디에 참여한 작성자만 커뮤니티 게시글을 수정할 수 있다.") @Test void update() { // arrange - final Member owner = createMember(1L); - final StudyRoom studyRoom = createStudyRoom(1L, owner); - final Accessor accessor = new Accessor(owner.getId(), studyRoom.getId()); - final CommunityContent communityContent = new CommunityContent("제목", "내용"); - final CommunityArticle sut = communityContent.createArticle(studyRoom, new Accessor(owner.getId(), studyRoom.getId())); + final Member owner = createOwner(); + final StudyRoom studyRoom = createStudyRoom(owner); + final CommunityArticle sut = createCommunityArticle(owner, studyRoom); + + final Accessor authorAccessor = new Accessor(owner.getId(), studyRoom.getId()); // act - sut.update(accessor, new CommunityContent("수정된 제목", "수정된 내용")); + sut.update(authorAccessor, new CommunityContent("수정된 제목", "수정된 내용")); // assert assertThat(sut.getContent()).isEqualTo(new CommunityContent("수정된 제목", "수정된 내용")); @@ -36,51 +41,67 @@ void update() { @ParameterizedTest @DisplayName("스터디에 참여한 작성자 외에는 커뮤니티 게시글을 수정할 수 없다.") - @CsvSource({"2,1", "1,2"}) - void updateByNotAuthor(final long memberId, final long studyId) { - final Member owner = createMember(1L); - final StudyRoom studyRoom = createStudyRoom(1L, owner); - final CommunityContent communityContent = new CommunityContent("제목", "내용"); - final CommunityArticle sut = communityContent.createArticle(studyRoom, new Accessor(owner.getId(), studyRoom.getId())); + @MethodSource("provideForbiddenAccessor") + void updateByNotAuthor(final Accessor forbiddenAccessor) { + final Member owner = createOwner(); + final StudyRoom studyRoom = createStudyRoom(owner); + final CommunityArticle sut = createCommunityArticle(owner, studyRoom); - assertThatThrownBy(() -> sut.update(new Accessor(memberId, studyId), new CommunityContent("수정된 제목", "수정된 내용"))) + assertThatThrownBy(() -> sut.update(forbiddenAccessor, new CommunityContent("수정된 제목", "수정된 내용"))) .isInstanceOf(UneditableArticleException.class); } @DisplayName("스터디에 참여한 작성자만 커뮤니티 게시글을 삭제할 수 있다.") @Test void delete() { - final Member owner = createMember(1L); - final StudyRoom studyRoom = createStudyRoom(1L, owner); - final CommunityContent communityContent = new CommunityContent("제목", "내용"); - final CommunityArticle sut = communityContent.createArticle(studyRoom, new Accessor(owner.getId(), studyRoom.getId())); + final Member owner = createOwner(); + final StudyRoom studyRoom = createStudyRoom(owner); + final CommunityArticle sut = createCommunityArticle(owner, studyRoom); - sut.delete(new Accessor(1L, 1L)); + final Accessor authorAccessor = new Accessor(owner.getId(), studyRoom.getId()); + + sut.delete(authorAccessor); assertThat(sut.isDeleted()).isTrue(); } @ParameterizedTest @DisplayName("스터디에 참여한 작성자 외에는 커뮤니티 게시글을 삭제할 수 없다.") - @CsvSource({"2,1", "1,2"}) - void deleteByNotAuthor(final long memberId, final long studyId) { - final Member owner = createMember(1L); - final StudyRoom studyRoom = createStudyRoom(1L, owner); - final CommunityContent communityContent = new CommunityContent("제목", "내용"); - final CommunityArticle sut = communityContent.createArticle(studyRoom, new Accessor(owner.getId(), studyRoom.getId())); + @MethodSource("provideForbiddenAccessor") + void deleteByNotAuthor(final Accessor forbiddenAccessor) { + final Member owner = createOwner(); + final StudyRoom studyRoom = createStudyRoom(owner); + final CommunityArticle sut = createCommunityArticle(owner, studyRoom); - assertThatThrownBy(() -> sut.delete(new Accessor(memberId, studyId))) + assertThatThrownBy(() -> sut.delete(forbiddenAccessor)) .isInstanceOf(UneditableArticleException.class); } - private StudyRoom createStudyRoom(long studyId, Member owner, Member... participant) { + private Member createOwner() { + return new Member(OWNER_ID, OWNER_ID, "owner", "image", "profile"); + } + + private StudyRoom createStudyRoom(Member owner, Member... participant) { final Set participants = Stream.of(participant) .map(Member::getId) .collect(Collectors.toSet()); - return new StudyRoom(studyId, owner.getId(), participants); + return new StudyRoom(STUDY_ID, owner.getId(), participants); } - private Member createMember(final long id) { - return new Member(id, id, "username" + id, "image", "profile"); + private CommunityArticle createCommunityArticle(final Member owner, final StudyRoom studyRoom) { + final Accessor accessor = new Accessor(owner.getId(), studyRoom.getId()); + final CommunityContent communityContent = new CommunityContent("제목", "내용"); + return communityContent.createArticle(studyRoom, accessor); + } + + private static Stream provideForbiddenAccessor() { + final long otherMemberId = OWNER_ID + 1; + final long otherStudyId = STUDY_ID + 1; + + return Stream.of( + Arguments.of(new Accessor(otherMemberId, STUDY_ID)), + Arguments.of(new Accessor(OWNER_ID, otherStudyId)), + Arguments.of(new Accessor(otherMemberId, otherStudyId)) + ); } } diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityContentTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityContentTest.java index ef1e209b5..3ae32b45a 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityContentTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityContentTest.java @@ -17,52 +17,59 @@ class CommunityContentTest { + private static final long OWNER_ID = 1L; + private static final long PARTICIPANT_ID = 2L; + private static final long STUDY_ID = 1L; + @ParameterizedTest @DisplayName("스터디에 참여한 참가자는 커뮤니티 게시글을 작성할 수 있다.") - @MethodSource("provideAccessibleAccessorForCommunityArticle") - void writeCommunityArticleByParticipant(final Accessor accessor) { + @MethodSource("providePermittedAccessorForCommunityArticle") + void writeCommunityArticleByParticipant(final Accessor permittedAccessor) { // arrange - final Member owner = createMember(1L); - final Member participant = createMember(2L); - final StudyRoom studyRoom = createStudyRoom(1L, owner, participant); + final Member owner = createMember(OWNER_ID); + final Member participant = createMember(PARTICIPANT_ID); + final StudyRoom studyRoom = createStudyRoom(owner, participant); final CommunityContent sut = new CommunityContent("제목", "설명"); // act & assert - assertThatCode(() -> sut.createArticle(studyRoom, accessor)) + assertThatCode(() -> sut.createArticle(studyRoom, permittedAccessor)) .doesNotThrowAnyException(); } - private static Stream provideAccessibleAccessorForCommunityArticle() { + private static Stream providePermittedAccessorForCommunityArticle() { return Stream.of( - Arguments.of(new Accessor(1L, 1L)), // 방장 - Arguments.of(new Accessor(2L, 1L)) // 일반 참가자 + Arguments.of(new Accessor(OWNER_ID, STUDY_ID)), + Arguments.of(new Accessor(PARTICIPANT_ID, STUDY_ID)) ); } @ParameterizedTest @DisplayName("스터디에 참여하지 않은 참가자는 커뮤니티 게시글을 작성할 수 없다.") - @MethodSource("provideNonAccessibleAccessorForCommunityArticle") - void cantWriteCommunityArticleByNonParticipants(final Accessor accessor) { - final Member owner = createMember(1L); - final StudyRoom studyRoom = createStudyRoom(1L, owner); + @MethodSource("provideForbiddenAccessorForCommunityArticle") + void cantWriteCommunityArticleByNonParticipants(final Accessor forbiddenAccessor) { + final Member owner = createMember(OWNER_ID); + final StudyRoom studyRoom = createStudyRoom(owner); final CommunityContent sut = new CommunityContent("제목", "설명"); - assertThatThrownBy(() -> sut.createArticle(studyRoom, accessor)) + assertThatThrownBy(() -> sut.createArticle(studyRoom, forbiddenAccessor)) .isInstanceOf(UneditableArticleException.class); } - private static Stream provideNonAccessibleAccessorForCommunityArticle() { + private static Stream provideForbiddenAccessorForCommunityArticle() { + final long otherMemberId = Math.max(OWNER_ID, PARTICIPANT_ID) + 1; + final long otherStudyId = STUDY_ID + 1; + return Stream.of( - Arguments.of(new Accessor(2L, 1L)), // memberId가 잘못된 경우 - Arguments.of(new Accessor(1L, 2L)) // studyId가 잘못된 경우 + Arguments.of(new Accessor(otherMemberId, STUDY_ID)), // memberId가 잘못된 경우 + Arguments.of(new Accessor(OWNER_ID, otherStudyId)) // studyId가 잘못된 경우 ); } - private StudyRoom createStudyRoom(long studyId, Member owner, Member... participant) { + private StudyRoom createStudyRoom(Member owner, Member... participant) { final Set participants = Stream.of(participant) .map(Member::getId) .collect(Collectors.toSet()); - return new StudyRoom(studyId, owner.getId(), participants); + return new StudyRoom(STUDY_ID, owner.getId(), participants); } private Member createMember(final long id) { From 5e205cfdb9b0e84fca02ad805f726cacfbddf4f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=A7=84=ED=98=81?= Date: Thu, 29 Sep 2022 22:22:54 +0900 Subject: [PATCH 31/40] =?UTF-8?q?test:=20NoticeArticle=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EA=B0=80=EB=8F=85=EC=84=B1=20=EC=A0=95?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/article/NoticeArticleTest.java | 82 ++++++++++++------- .../domain/article/NoticeContentTest.java | 32 +++++--- .../service/NoticeArticleServiceTest.java | 4 +- 3 files changed, 73 insertions(+), 45 deletions(-) diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticleTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticleTest.java index bbe0b3d4b..dbf86d175 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticleTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticleTest.java @@ -14,22 +14,28 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.CsvSource; +import org.junit.jupiter.params.provider.MethodSource; class NoticeArticleTest { + private static final long OWNER_ID = 1L; + private static final long PARTICIPANT_ID = 2L; + private static final long STUDY_ID = 1L; + @DisplayName("공지 게시글은 방장만 수정할 수 있다.") @Test void update() { // arrange - final Member owner = createMember(1L); - final StudyRoom studyRoom = createStudyRoom(1L, owner); - final Accessor accessor = new Accessor(owner.getId(), studyRoom.getId()); - final NoticeContent noticeContent = new NoticeContent("제목", "내용"); - final NoticeArticle sut = noticeContent.createArticle(studyRoom, accessor); + final Member owner = createMember(OWNER_ID); + final StudyRoom studyRoom = createStudyRoom(owner); + final NoticeArticle sut = createNoticeArticle(owner, studyRoom); + + final Accessor authorAccessor = new Accessor(owner.getId(), studyRoom.getId()); // act - sut.update(accessor, new NoticeContent("수정된 제목", "수정된 내용")); + sut.update(authorAccessor, new NoticeContent("수정된 제목", "수정된 내용")); // assert assertThat(sut.getContent()).isEqualTo(new NoticeContent("수정된 제목", "수정된 내용")); @@ -37,53 +43,67 @@ void update() { @ParameterizedTest @DisplayName("스터디에 참여중인 방장 외에는 공지 게시글을 수정할 수 없다.") - @CsvSource({"2,1", "1,2"}) - void updateByNotAuthor(final long memberId, final long studyId) { - final Member owner = createMember(1L); - final Member participant = createMember(2L); - final StudyRoom studyRoom = createStudyRoom(1L, owner, participant); - final NoticeContent noticeContent = new NoticeContent("제목", "내용"); - final NoticeArticle sut = noticeContent.createArticle(studyRoom, new Accessor(owner.getId(), studyRoom.getId())); + @MethodSource("provideForbiddenAccessor") + void updateByNotAuthor(final Accessor forbiddenAccessor) { + final Member owner = createMember(OWNER_ID); + final Member participant = createMember(PARTICIPANT_ID); + final StudyRoom studyRoom = createStudyRoom(owner, participant); + final NoticeArticle sut = createNoticeArticle(owner, studyRoom); - assertThatThrownBy(() -> sut.update(new Accessor(memberId, studyId), new NoticeContent("수정된 제목", "수정된 설명"))) + assertThatThrownBy(() -> sut.update(forbiddenAccessor, new NoticeContent("수정된 제목", "수정된 설명"))) .isInstanceOf(UneditableArticleException.class); } @DisplayName("스터디에 참여한 방장만 공지 게시글을 삭제할 수 있다.") @Test void delete() { - final Member owner = createMember(1L); - final StudyRoom studyRoom = createStudyRoom(1L, owner); - final NoticeContent noticeContent = new NoticeContent("제목", "내용"); - final NoticeArticle sut = noticeContent.createArticle(studyRoom, new Accessor(owner.getId(), studyRoom.getId())); + final Member owner = createMember(OWNER_ID); + final StudyRoom studyRoom = createStudyRoom(owner); + final NoticeArticle sut = createNoticeArticle(owner, studyRoom); - sut.delete(new Accessor(1L, 1L)); + sut.delete(new Accessor(OWNER_ID, STUDY_ID)); assertThat(sut.isDeleted()).isTrue(); } @ParameterizedTest @DisplayName("스터디에 참여한 방장 외에는 공지 게시글을 삭제할 수 없다.") - @CsvSource({"2,1", "1,2"}) - void deleteByNotAuthor(final long memberId, final long studyId) { - final Member owner = createMember(1L); - final Member participant = createMember(2L); - final StudyRoom studyRoom = createStudyRoom(1L, owner, participant); - final NoticeContent noticeContent = new NoticeContent("제목", "내용"); - final NoticeArticle sut = noticeContent.createArticle(studyRoom, new Accessor(owner.getId(), studyRoom.getId())); + @MethodSource("provideForbiddenAccessor") + void deleteByNotAuthor(final Accessor forbiddenAccessor) { + final Member owner = createMember(OWNER_ID); + final Member participant = createMember(PARTICIPANT_ID); + final StudyRoom studyRoom = createStudyRoom(owner, participant); + final NoticeArticle sut = createNoticeArticle(owner, studyRoom); - assertThatThrownBy(() -> sut.delete(new Accessor(memberId, studyId))) + assertThatThrownBy(() -> sut.delete(forbiddenAccessor)) .isInstanceOf(UneditableArticleException.class); } - private StudyRoom createStudyRoom(long studyId, Member owner, Member... participant) { + private Member createMember(final long id) { + return new Member(id, id, "username" + id, "image", "profile"); + } + + private StudyRoom createStudyRoom(Member owner, Member... participant) { final Set participants = Stream.of(participant) .map(Member::getId) .collect(Collectors.toSet()); - return new StudyRoom(studyId, owner.getId(), participants); + return new StudyRoom(STUDY_ID, owner.getId(), participants); } - private Member createMember(final long id) { - return new Member(id, id, "username" + id, "image", "profile"); + private NoticeArticle createNoticeArticle(final Member owner, final StudyRoom studyRoom) { + final Accessor accessor = new Accessor(owner.getId(), studyRoom.getId()); + final NoticeContent noticeContent = new NoticeContent("제목", "내용"); + return noticeContent.createArticle(studyRoom, accessor); + } + + private static Stream provideForbiddenAccessor() { + final long otherMemberId = OWNER_ID + 1; + final long otherStudyId = STUDY_ID + 1; + + return Stream.of( + Arguments.of(new Accessor(otherMemberId, STUDY_ID)), + Arguments.of(new Accessor(OWNER_ID, otherStudyId)), + Arguments.of(new Accessor(otherMemberId, otherStudyId)) + ); } } diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeContentTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeContentTest.java index cbd20318d..3d4578f2b 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeContentTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeContentTest.java @@ -18,27 +18,31 @@ class NoticeContentTest { + private static final long OWNER_ID = 1L; + private static final long PARTICIPANT_ID = 2L; + private static final long STUDY_ID = 1L; + @DisplayName("방장은 공지글을 작성할 수 있다.") @Test void writeNoticeArticleByOwner() { // arrange - final Member owner = createMember(1L); - final StudyRoom studyRoom = createStudyRoom(1L, owner); + final Member owner = createMember(OWNER_ID); + final StudyRoom studyRoom = createStudyRoom(owner); final NoticeContent sut = new NoticeContent("제목", "내용"); // act & assert - assertThatCode(() -> sut.createArticle(studyRoom, new Accessor(1L, 1L))) + assertThatCode(() -> sut.createArticle(studyRoom, new Accessor(OWNER_ID, STUDY_ID))) .doesNotThrowAnyException(); } @ParameterizedTest @DisplayName("방장 외에는 공지글을 작성할 수 없다.") - @MethodSource("provideNonAccessibleAccessorForNoticeArticle") + @MethodSource("provideForbiddenAccessorForNoticeArticle") void cantWriteNoticeArticleByNonOwner(final Accessor accessor) { // arrange - final Member owner = createMember(1L); - final Member participant = createMember(2L); - final StudyRoom studyRoom = createStudyRoom(1L, owner, participant); + final Member owner = createMember(OWNER_ID); + final Member participant = createMember(PARTICIPANT_ID); + final StudyRoom studyRoom = createStudyRoom(owner, participant); final NoticeContent sut = new NoticeContent("제목", "내용"); // act && assert @@ -46,18 +50,22 @@ void cantWriteNoticeArticleByNonOwner(final Accessor accessor) { .isInstanceOf(UneditableArticleException.class); } - private static Stream provideNonAccessibleAccessorForNoticeArticle() { + private static Stream provideForbiddenAccessorForNoticeArticle() { + final long otherMemberId = Math.max(OWNER_ID, PARTICIPANT_ID) + 1; + final long otherStudyId = STUDY_ID + 1; + return Stream.of( - Arguments.of(new Accessor(1L, 2L)), // studyId가 잘못된 경우 - Arguments.of(new Accessor(2L, 1L)) // 방장 외에 참여자인 경우 + Arguments.of(new Accessor(OWNER_ID, otherStudyId)), // studyId가 잘못된 경우 + Arguments.of(new Accessor(PARTICIPANT_ID, STUDY_ID)), + Arguments.of(new Accessor(otherMemberId, STUDY_ID)) ); } - private StudyRoom createStudyRoom(long studyId, Member owner, Member... participant) { + private StudyRoom createStudyRoom(Member owner, Member... participant) { final Set participants = Stream.of(participant) .map(Member::getId) .collect(Collectors.toSet()); - return new StudyRoom(studyId, owner.getId(), participants); + return new StudyRoom(STUDY_ID, owner.getId(), participants); } private Member createMember(final long id) { diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleServiceTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleServiceTest.java index a0d79dc56..755fa7d89 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleServiceTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleServiceTest.java @@ -163,7 +163,7 @@ void deleteArticle() { assertThat(deletedArticle.isDeleted()).isTrue(); } - @DisplayName("존재하지 않는 링크 공유글을 삭제할 수 없다.") + @DisplayName("존재하지 않는 게시글을 삭제할 수 없다.") @Test void deleteByInvalidLinkId() { final Member 짱구 = saveMember(짱구()); @@ -173,7 +173,7 @@ void deleteByInvalidLinkId() { .isInstanceOf(ArticleNotFoundException.class); } - @DisplayName("스터디에 참여하지 않은 경우 링크 공유글을 삭제할 수 없다.") + @DisplayName("스터디에 참여하지 않은 경우 게시글을 삭제할 수 없다.") @Test void deleteByNotParticipatedMember() { final Member 짱구 = saveMember(짱구()); From aedff8988ff29add0f3bf2be097a8ddaf46b52a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=A7=84=ED=98=81?= Date: Thu, 29 Sep 2022 23:22:12 +0900 Subject: [PATCH 32/40] =?UTF-8?q?refactor:=20Article=20=EA=B5=AC=EC=A1=B0?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../studyroom/domain/article/Article.java | 22 +++++-------------- .../domain/article/CommunityArticle.java | 13 ++++++----- .../studyroom/domain/article/LinkArticle.java | 11 +++++++--- .../domain/article/NoticeArticle.java | 15 +++++++------ .../service/AbstractArticleService.java | 4 +--- .../service/request/ArticleRequest.java | 2 +- .../service/CommunityArticleServiceTest.java | 8 ++++--- .../service/LinkArticleServiceTest.java | 8 ++++--- .../service/NoticeArticleServiceTest.java | 8 ++++--- 9 files changed, 47 insertions(+), 44 deletions(-) diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java index d5d51e2f2..68c515ee3 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java @@ -40,33 +40,23 @@ protected Article(final Long id, final StudyRoom studyRoom, final Long authorId) this.deleted = false; } - public final void update(final Accessor accessor, final T content) { - if (!isEditableAccessor(accessor)) { - throw new UneditableArticleException(studyRoom.getId(), accessor, getClass()); - } - - updateContent(content); - } - public final void delete(final Accessor accessor) { - if (!isEditableAccessor(accessor)) { + if (isUneditableAccessor(accessor)) { throw new UneditableArticleException(studyRoom.getId(), accessor, getClass()); } deleted = true; } - public boolean isDeleted() { - return deleted; - } - public Long getId() { return id; } - protected abstract void updateContent(final T content); + boolean isDeleted() { + return deleted; + } - protected abstract boolean isEditableAccessor(final Accessor accessor); + public abstract void update(final Accessor accessor, final T content); - public abstract T getContent(); + protected abstract boolean isUneditableAccessor(final Accessor accessor); } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticle.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticle.java index 7ce0282a1..15ad2e34e 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticle.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticle.java @@ -2,11 +2,11 @@ import com.woowacourse.moamoa.studyroom.domain.Accessor; import com.woowacourse.moamoa.studyroom.domain.StudyRoom; +import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; import javax.persistence.Embedded; import javax.persistence.Entity; import javax.persistence.Table; import lombok.AccessLevel; -import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.annotations.Where; @@ -31,16 +31,19 @@ private CommunityArticle(final Long id, final Long authorId, final StudyRoom stu } @Override - protected void updateContent(final CommunityContent content) { + public void update(final Accessor accessor, final CommunityContent content) { + if (isUneditableAccessor(accessor)) { + throw new UneditableArticleException(studyRoom.getId(), accessor, getClass()); + } + this.content = content; } @Override - protected boolean isEditableAccessor(final Accessor accessor) { - return studyRoom.isPermittedAccessor(accessor) && authorId.equals(accessor.getMemberId()); + protected boolean isUneditableAccessor(final Accessor accessor) { + return !studyRoom.isPermittedAccessor(accessor) || !authorId.equals(accessor.getMemberId()); } - @Override public CommunityContent getContent() { return content; } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticle.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticle.java index 2bb8c9c0e..c4db7b4a3 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticle.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticle.java @@ -2,6 +2,7 @@ import com.woowacourse.moamoa.studyroom.domain.Accessor; import com.woowacourse.moamoa.studyroom.domain.StudyRoom; +import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; import javax.persistence.Embedded; import javax.persistence.Entity; import javax.persistence.Table; @@ -28,13 +29,17 @@ private LinkArticle(final Long id, final StudyRoom studyRoom, final Long authorI } @Override - protected void updateContent(final LinkContent content) { + public void update(final Accessor accessor, final LinkContent content) { + if (isUneditableAccessor(accessor)) { + throw new UneditableArticleException(studyRoom.getId(), accessor, getClass()); + } + this.content = content; } @Override - protected boolean isEditableAccessor(final Accessor accessor) { - return studyRoom.isPermittedAccessor(accessor) && authorId.equals(accessor.getMemberId()); + protected boolean isUneditableAccessor(final Accessor accessor) { + return !studyRoom.isPermittedAccessor(accessor) || !authorId.equals(accessor.getMemberId()); } public LinkContent getContent() { diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticle.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticle.java index 506f8ef26..bec0847c2 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticle.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticle.java @@ -2,11 +2,11 @@ import com.woowacourse.moamoa.studyroom.domain.Accessor; import com.woowacourse.moamoa.studyroom.domain.StudyRoom; +import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; import javax.persistence.Embedded; import javax.persistence.Entity; import javax.persistence.Table; import lombok.AccessLevel; -import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.annotations.Where; @@ -30,19 +30,20 @@ private NoticeArticle(final Long id, final Long authorId, } @Override - protected void updateContent(final NoticeContent content) { + public void update(final Accessor accessor, final NoticeContent content) { + if (isUneditableAccessor(accessor)) { + throw new UneditableArticleException(studyRoom.getId(), accessor, getClass()); + } + this.content = content; } @Override - protected boolean isEditableAccessor(final Accessor accessor) { - return studyRoom.isOwner(accessor); + protected boolean isUneditableAccessor(final Accessor accessor) { + return !studyRoom.isOwner(accessor); } - @Override public NoticeContent getContent() { return content; } - - } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/AbstractArticleService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/AbstractArticleService.java index a338c47e7..b640163ed 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/AbstractArticleService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/AbstractArticleService.java @@ -27,9 +27,7 @@ protected AbstractArticleService( this.articleType = articleType; } - public A createArticle( - final Long memberId, final Long studyId, final ArticleRequest articleRequest - ) { + public A createArticle(final Long memberId, final Long studyId, final ArticleRequest articleRequest) { final StudyRoom studyRoom = studyRoomRepository.findByStudyId(studyId) .orElseThrow(StudyNotFoundException::new); final C content = articleRequest.createContent(); diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/ArticleRequest.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/ArticleRequest.java index 656725a47..267e52fce 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/ArticleRequest.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/ArticleRequest.java @@ -3,7 +3,7 @@ import com.woowacourse.moamoa.studyroom.domain.article.Article; import com.woowacourse.moamoa.studyroom.domain.article.Content; -public interface ArticleRequest>> { +public interface ArticleRequest> { T createContent(); } diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleServiceTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleServiceTest.java index 0f0a1379f..563ba67c0 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleServiceTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleServiceTest.java @@ -116,7 +116,7 @@ void updateArticle() { sut.updateArticle(짱구.getId(), 자바_스터디.getId(), article.getId(), updatingArticleRequest); // assert - Article actualArticle = articleRepository.findById(article.getId()).orElseThrow(); + CommunityArticle actualArticle = articleRepository.findById(article.getId()).orElseThrow(); assertThat(actualArticle.getContent()).isEqualTo(new CommunityContent("제목 수정", "설명 수정")); } @@ -159,8 +159,10 @@ void deleteArticle() { sut.deleteArticle(짱구.getId(), 자바_스터디.getId(), 게시글.getId()); //assert - final Article deletedArticle = articleRepository.findById(게시글.getId()).orElseThrow(); - assertThat(deletedArticle.isDeleted()).isTrue(); + entityManager.flush(); + entityManager.clear(); + + assertThat(articleRepository.findById(게시글.getId())).isEmpty(); } @DisplayName("존재하지 않는 게시글을 삭제할 수 없다.") diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/LinkArticleServiceTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/LinkArticleServiceTest.java index 87b49fd43..fe79d3c0f 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/LinkArticleServiceTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/LinkArticleServiceTest.java @@ -121,7 +121,7 @@ void updateArticle() { sut.updateArticle(짱구.getId(), 자바_스터디.getId(), article.getId(), updatingArticleRequest); // assert - Article actualArticle = articleRepository.findById(article.getId()).orElseThrow(); + LinkArticle actualArticle = articleRepository.findById(article.getId()).orElseThrow(); assertThat(actualArticle.getContent()).isEqualTo(new LinkContent("링크 수정", "설명 수정")); } @@ -164,8 +164,10 @@ void deleteArticle() { sut.deleteArticle(짱구.getId(), 자바_스터디.getId(), 게시글.getId()); //assert - final Article deletedArticle = articleRepository.findById(게시글.getId()).orElseThrow(); - assertThat(deletedArticle.isDeleted()).isTrue(); + entityManager.flush(); + entityManager.clear(); + + assertThat(articleRepository.findById(게시글.getId())).isEmpty(); } @DisplayName("존재하지 않는 링크 공유글을 삭제할 수 없다.") diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleServiceTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleServiceTest.java index 755fa7d89..8f5bfbb6c 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleServiceTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleServiceTest.java @@ -116,7 +116,7 @@ void updateArticle() { sut.updateArticle(짱구.getId(), 자바_스터디.getId(), article.getId(), updatingArticleRequest); // assert - Article actualArticle = articleRepository.findById(article.getId()).orElseThrow(); + NoticeArticle actualArticle = articleRepository.findById(article.getId()).orElseThrow(); assertThat(actualArticle.getContent()).isEqualTo(new NoticeContent("제목 수정", "설명 수정")); } @@ -159,8 +159,10 @@ void deleteArticle() { sut.deleteArticle(짱구.getId(), 자바_스터디.getId(), 게시글.getId()); //assert - final Article deletedArticle = articleRepository.findById(게시글.getId()).orElseThrow(); - assertThat(deletedArticle.isDeleted()).isTrue(); + entityManager.flush(); + entityManager.clear(); + + assertThat(articleRepository.findById(게시글.getId())).isEmpty(); } @DisplayName("존재하지 않는 게시글을 삭제할 수 없다.") From 8d94025656bb5c4d9cf6f6a48b1b016b7f528372 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=A7=84=ED=98=81?= Date: Sat, 1 Oct 2022 23:37:12 +0900 Subject: [PATCH 33/40] =?UTF-8?q?refactor:=20LinkArticle=20=EC=83=81?= =?UTF-8?q?=EC=86=8D=20=EA=B5=AC=EC=A1=B0=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exception/StudyNotFoundException.java | 4 + .../controller/LinkArticleController.java | 4 +- .../moamoa/studyroom/domain/StudyRoom.java | 3 + .../studyroom/domain/article/LinkArticle.java | 60 ++++++++++++-- .../studyroom/domain/article/LinkContent.java | 11 +-- .../exception/ArticleNotFoundException.java | 3 +- .../exception/UneditableArticleException.java | 4 +- .../article/LinkArticleRepository.java | 2 +- .../studyroom/service/LinkArticleService.java | 46 +++++++++-- .../service/request/LinkArticleRequest.java | 3 +- .../domain/article/LinkArticleTest.java | 56 +++++++++++-- .../domain/article/LinkContentTest.java | 82 ------------------- .../service/LinkArticleServiceTest.java | 64 +++++++-------- 13 files changed, 186 insertions(+), 156 deletions(-) delete mode 100644 backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/LinkContentTest.java diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/service/exception/StudyNotFoundException.java b/backend/src/main/java/com/woowacourse/moamoa/study/service/exception/StudyNotFoundException.java index c0d758192..e1b727833 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/service/exception/StudyNotFoundException.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/service/exception/StudyNotFoundException.java @@ -7,4 +7,8 @@ public class StudyNotFoundException extends NotFoundException { public StudyNotFoundException() { super("스터디가 존재하지 않습니다."); } + + public StudyNotFoundException(final Long studyId) { + super(String.format("스터디[Id: %d]는 존재하지 않습니다.", studyId)); + } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleController.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleController.java index 170b46568..35b1d743b 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleController.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleController.java @@ -43,7 +43,7 @@ public ResponseEntity createLink( @PathVariable("study-id") final Long studyId, @Valid @RequestBody final LinkArticleRequest articleRequest ) { - final Long id = linkArticleService.createArticle(memberId, studyId, articleRequest).getId(); + final Long id = linkArticleService.createArticle(memberId, studyId, articleRequest.createContent()).getId(); return ResponseEntity.created(URI.create("/api/studies/" + studyId + "/reference-room/links/" + id)).build(); } @@ -54,7 +54,7 @@ public ResponseEntity updateLink( @PathVariable("link-id") final Long linkId, @Valid @RequestBody final LinkArticleRequest articleRequest ) { - linkArticleService.updateArticle(memberId, studyId, linkId, articleRequest); + linkArticleService.updateArticle(memberId, studyId, linkId, articleRequest.createContent()); return ResponseEntity.noContent().build(); } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/StudyRoom.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/StudyRoom.java index 25f703a70..ff25c296c 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/StudyRoom.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/StudyRoom.java @@ -1,5 +1,8 @@ package com.woowacourse.moamoa.studyroom.domain; +import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; +import com.woowacourse.moamoa.studyroom.domain.article.LinkContent; +import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; import java.util.Objects; import java.util.Set; import javax.persistence.Column; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticle.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticle.java index c4db7b4a3..e50705312 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticle.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticle.java @@ -1,10 +1,18 @@ package com.woowacourse.moamoa.studyroom.domain.article; +import com.woowacourse.moamoa.common.entity.BaseEntity; import com.woowacourse.moamoa.studyroom.domain.Accessor; import com.woowacourse.moamoa.studyroom.domain.StudyRoom; import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; +import javax.persistence.Column; import javax.persistence.Embedded; import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; import javax.persistence.Table; import lombok.AccessLevel; import lombok.NoArgsConstructor; @@ -14,34 +22,72 @@ @Table(name = "link") @NoArgsConstructor(access = AccessLevel.PROTECTED) @Where(clause = "deleted = false") -public class LinkArticle extends Article{ +public class LinkArticle extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "study_id") + protected StudyRoom studyRoom; + + @Column(name = "author_id", nullable = false) + protected Long authorId; + + @Column(nullable = false) + private boolean deleted; @Embedded private LinkContent content; - LinkArticle(final StudyRoom studyRoom, final Long authorId, final LinkContent content) { + public static LinkArticle create(final StudyRoom studyRoom, final Accessor accessor, final LinkContent content) { + if (studyRoom.isPermittedAccessor(accessor)) { + return new LinkArticle(studyRoom, accessor.getMemberId(), content); + } + + throw new UneditableArticleException(studyRoom.getId(), accessor, LinkArticle.class); + } + + private LinkArticle(final StudyRoom studyRoom, final Long authorId, final LinkContent content) { this(null, studyRoom, authorId, content); } private LinkArticle(final Long id, final StudyRoom studyRoom, final Long authorId, final LinkContent content) { - super(id, studyRoom, authorId); + this.id = id; + this.studyRoom = studyRoom; + this.authorId = authorId; this.content = content; } - @Override + public final void delete(final Accessor accessor) { + if (isUneditableAccessor(accessor)) { + throw new UneditableArticleException(studyRoom.getId(), accessor, LinkArticle.class); + } + + deleted = true; + } + public void update(final Accessor accessor, final LinkContent content) { if (isUneditableAccessor(accessor)) { - throw new UneditableArticleException(studyRoom.getId(), accessor, getClass()); + throw new UneditableArticleException(studyRoom.getId(), accessor, LinkArticle.class); } this.content = content; } - @Override - protected boolean isUneditableAccessor(final Accessor accessor) { + private boolean isUneditableAccessor(final Accessor accessor) { return !studyRoom.isPermittedAccessor(accessor) || !authorId.equals(accessor.getMemberId()); } + public Long getId() { + return id; + } + + boolean isDeleted() { + return deleted; + } + public LinkContent getContent() { return content; } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkContent.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkContent.java index b4cdcf2d3..ae2eae3b8 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkContent.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkContent.java @@ -11,7 +11,7 @@ @Embeddable @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class LinkContent implements Content { +public class LinkContent { @Column(nullable = false) private String linkUrl; @@ -23,15 +23,6 @@ public LinkContent(final String linkUrl, final String description) { this.description = description; } - @Override - public LinkArticle createArticle(final StudyRoom studyRoom, final Accessor accessor) { - if (studyRoom.isPermittedAccessor(accessor)) { - return new LinkArticle(studyRoom, accessor.getMemberId(), this); - } - - throw new UneditableArticleException(studyRoom.getId(), accessor, LinkArticle.class); - } - @Override public boolean equals(final Object o) { if (this == o) { diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/ArticleNotFoundException.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/ArticleNotFoundException.java index 9923dafd8..8edd6b1e7 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/ArticleNotFoundException.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/ArticleNotFoundException.java @@ -2,10 +2,11 @@ import com.woowacourse.moamoa.common.exception.NotFoundException; import com.woowacourse.moamoa.studyroom.domain.article.Article; +import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; public class ArticleNotFoundException extends NotFoundException { - public ArticleNotFoundException(final Long articleId, final Class> articleType) { + public ArticleNotFoundException(final Long articleId, final Class articleType) { super(String.format("%d의 식별자를 가진 %s 게시글이 존재하지 않습니다.", articleId, articleType.getSimpleName())); } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/UneditableArticleException.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/UneditableArticleException.java index 39cb97d23..b28b66871 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/UneditableArticleException.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/UneditableArticleException.java @@ -3,10 +3,12 @@ import com.woowacourse.moamoa.common.exception.BadRequestException; import com.woowacourse.moamoa.studyroom.domain.Accessor; import com.woowacourse.moamoa.studyroom.domain.article.Article; +import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; +import com.woowacourse.moamoa.studyroom.domain.article.LinkContent; public class UneditableArticleException extends BadRequestException { - public UneditableArticleException(final Long studyId, final Accessor accessor, final Class articleType) { + public UneditableArticleException(final Long studyId, final Accessor accessor, final Class articleType) { super(String.format("스터디[%d]에 접근자[%s]가 %s의 게시글을 수정/추가할 수 없습니다.", studyId, accessor, articleType.getSimpleName())); } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/LinkArticleRepository.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/LinkArticleRepository.java index a2e069742..135848849 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/LinkArticleRepository.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/LinkArticleRepository.java @@ -3,5 +3,5 @@ import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; import org.springframework.data.jpa.repository.JpaRepository; -interface LinkArticleRepository extends JpaRepository, ArticleRepository { +public interface LinkArticleRepository extends JpaRepository { } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java index cecf76d85..55fe91094 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java @@ -1,29 +1,35 @@ package com.woowacourse.moamoa.studyroom.service; +import com.woowacourse.moamoa.study.service.exception.StudyNotFoundException; +import com.woowacourse.moamoa.studyroom.domain.Accessor; +import com.woowacourse.moamoa.studyroom.domain.StudyRoom; import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; import com.woowacourse.moamoa.studyroom.domain.article.LinkContent; -import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepository; +import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; +import com.woowacourse.moamoa.studyroom.domain.repository.article.LinkArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.LinkArticleDao; import com.woowacourse.moamoa.studyroom.query.data.LinkArticleData; import com.woowacourse.moamoa.studyroom.service.response.LinksResponse; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Slice; -import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service -@Transactional -public class LinkArticleService extends AbstractArticleService { +@Transactional(readOnly = true) +public class LinkArticleService { + private final StudyRoomRepository studyRoomRepository; + private final LinkArticleRepository linkArticleRepository; private final LinkArticleDao linkArticleDao; public LinkArticleService(final StudyRoomRepository studyRoomRepository, - final ArticleRepository articleRepository, + final LinkArticleRepository linkArticleRepository, final LinkArticleDao linkArticleDao ) { - super(studyRoomRepository, articleRepository, LinkArticle.class); + this.studyRoomRepository = studyRoomRepository; + this.linkArticleRepository = linkArticleRepository; this.linkArticleDao = linkArticleDao; } @@ -31,4 +37,32 @@ public LinksResponse getLinks(final Long studyId, final Pageable pageable) { final Slice linkData = linkArticleDao.findAllByStudyId(studyId, pageable); return new LinksResponse(linkData.getContent(), linkData.hasNext()); } + + @Transactional + public LinkArticle createArticle(final Long memberId, final Long studyId, final LinkContent content) { + final StudyRoom studyRoom = studyRoomRepository.findByStudyId(studyId) + .orElseThrow(() -> new StudyNotFoundException(studyId)); + final LinkArticle article = LinkArticle.create(studyRoom, new Accessor(memberId, studyId), content); + + return linkArticleRepository.save(article); + } + + @Transactional + public void updateArticle( + final Long memberId, final Long studyId, final Long articleId, final LinkContent newContent + ) { + final LinkArticle article = linkArticleRepository.findById(articleId) + .orElseThrow(() -> new ArticleNotFoundException(articleId, LinkArticle.class)); + + article.update(new Accessor(memberId, studyId), newContent); + } + + @Transactional + public void deleteArticle(final Long memberId, final Long studyId, final Long articleId) { + final LinkArticle article = linkArticleRepository.findById(articleId) + .orElseThrow(() -> new ArticleNotFoundException(articleId, LinkArticle.class)); + final Accessor accessor = new Accessor(memberId, studyId); + + article.delete(accessor); + } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/LinkArticleRequest.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/LinkArticleRequest.java index 67bfcd810..d19eccff9 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/LinkArticleRequest.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/LinkArticleRequest.java @@ -10,7 +10,7 @@ @NoArgsConstructor @AllArgsConstructor @Getter -public class LinkArticleRequest implements ArticleRequest { +public class LinkArticleRequest { @NotBlank(message = "공유할 링크 URL을 입력해 주세요.") @Size(max = 500, message = "링크 URL은 500자를 초과할 수 없습니다.") @@ -19,7 +19,6 @@ public class LinkArticleRequest implements ArticleRequest { @Size(max = 40, message = "설명은 40자를 초과할 수 없습니다.") private String description; - @Override public LinkContent createContent() { return new LinkContent(linkUrl, description); } diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticleTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticleTest.java index b101e340a..c994b95de 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticleTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticleTest.java @@ -1,6 +1,7 @@ package com.woowacourse.moamoa.studyroom.domain.article; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatCode; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertAll; @@ -20,13 +21,45 @@ class LinkArticleTest { private static final long OWNER_ID = 1L; + private static final long PARTICIPANT_ID = 2L; private static final long STUDY_ID = 1L; + @ParameterizedTest + @DisplayName("링크 게시글을 스터디에 참여한 인원은 작성할 수 있다.") + @MethodSource("providePermittedAccessor") + void writeLinkArticleByAccessibleAccessor(final Accessor permittedAccessor) { + // arrange + final Member owner = createMember(OWNER_ID); + final Member participant = createMember(PARTICIPANT_ID); + final StudyRoom studyRoom = createStudyRoom(owner, participant); + final LinkContent sut = new LinkContent("link", "설명"); + + // act & assert + assertThatCode(() -> LinkArticle.create(studyRoom, permittedAccessor, sut)) + .doesNotThrowAnyException(); + } + + @ParameterizedTest + @DisplayName("링크글을 스터디 참여자만 작성할 수 있다.") + @MethodSource("provideForbiddenAccessor") + void cantWriteLinkArticleByForbiddenAccessor(final Accessor forbiddenAccessor) { + // arrange + final Member owner = createMember(OWNER_ID); + final StudyRoom studyRoom = createStudyRoom(owner); + + // act & assert + final LinkContent sut = new LinkContent("link", "설명"); + + // act & assert + assertThatThrownBy(() -> LinkArticle.create(studyRoom, forbiddenAccessor, sut)) + .isInstanceOf(UneditableArticleException.class); + } + @DisplayName("링크 게시글을 작성자가 수정한다.") @Test void update() { // arrange - final Member owner = createOwner(); + final Member owner = createMember(OWNER_ID); final StudyRoom studyRoom = createStudyRoom(owner); final LinkArticle sut = createLinkArticle(owner, studyRoom); final Accessor authorAccessor = new Accessor(owner.getId(), studyRoom.getId()); @@ -42,7 +75,7 @@ void update() { @DisplayName("스터디에 참여한 작성자 외에는 링크 게시글을 수정할 수 없다.") @MethodSource("provideForbiddenAccessor") void updateByNotAuthor(final Accessor forbiddenAccessor) { - final Member owner = createOwner(); + final Member owner = createMember(OWNER_ID); final StudyRoom studyRoom = createStudyRoom(owner); final LinkArticle sut = createLinkArticle(owner, studyRoom); @@ -53,7 +86,7 @@ void updateByNotAuthor(final Accessor forbiddenAccessor) { @DisplayName("스터디에 참여한 작성자만 링크 게시글을 삭제할 수 있다.") @Test void delete() { - final Member owner = createOwner(); + final Member owner = createMember(OWNER_ID); final StudyRoom studyRoom = createStudyRoom(owner); final LinkArticle sut = createLinkArticle(owner, studyRoom); @@ -66,7 +99,7 @@ void delete() { @DisplayName("스터디에 참여한 작성자 외에는 링크 게시글을 삭제할 수 없다.") @MethodSource("provideForbiddenAccessor") void deleteByNotAuthor(final Accessor forbiddenAccessor) { - final Member owner = createOwner(); + final Member owner = createMember(OWNER_ID); final StudyRoom studyRoom = createStudyRoom(owner); final LinkArticle sut = createLinkArticle(owner, studyRoom); @@ -74,8 +107,15 @@ void deleteByNotAuthor(final Accessor forbiddenAccessor) { .isInstanceOf(UneditableArticleException.class); } + private static Stream providePermittedAccessor() { + return Stream.of( + Arguments.of(new Accessor(OWNER_ID, STUDY_ID)), + Arguments.of(new Accessor(PARTICIPANT_ID, STUDY_ID)) + ); + } + private static Stream provideForbiddenAccessor() { - final long otherMemberId = OWNER_ID + 1; + final long otherMemberId = Math.max(OWNER_ID, PARTICIPANT_ID) + 1; final long otherStudyId = STUDY_ID + 1; return Stream.of( @@ -85,8 +125,8 @@ private static Stream provideForbiddenAccessor() { ); } - private Member createOwner() { - return new Member(OWNER_ID, OWNER_ID, "owner", "image", "profile"); + private Member createMember(final long id) { + return new Member(id, id, "username" + id, "image", "profile"); } private StudyRoom createStudyRoom(Member owner, Member... participant) { @@ -99,6 +139,6 @@ private StudyRoom createStudyRoom(Member owner, Member... participant) { private LinkArticle createLinkArticle(final Member owner, final StudyRoom studyRoom) { final Accessor accessor = new Accessor(owner.getId(), studyRoom.getId()); final LinkContent linkContent = new LinkContent("link", "설명"); - return linkContent.createArticle(studyRoom, accessor); + return LinkArticle.create(studyRoom, accessor, linkContent); } } diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/LinkContentTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/LinkContentTest.java deleted file mode 100644 index 358f24d10..000000000 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/LinkContentTest.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.woowacourse.moamoa.studyroom.domain.article; - -import static org.assertj.core.api.Assertions.assertThatCode; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -import com.woowacourse.moamoa.member.domain.Member; -import com.woowacourse.moamoa.studyroom.domain.Accessor; -import com.woowacourse.moamoa.studyroom.domain.StudyRoom; -import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; - -class LinkContentTest { - - private static final long OWNER_ID = 1L; - private static final long PARTICIPANT_ID = 2L; - private static final long STUDY_ID = 1L; - - @ParameterizedTest - @DisplayName("링크 게시글을 스터디에 참여한 인원은 작성할 수 있다.") - @MethodSource("providePermittedAccessorForLinkArticle") - void writeLinkArticleByAccessibleAccessor(final Accessor permittedAccessor) { - // arrange - final Member owner = createMember(OWNER_ID); - final Member participant = createMember(PARTICIPANT_ID); - final StudyRoom studyRoom = createStudyRoom(owner, participant); - final LinkContent sut = new LinkContent("link", "설명"); - - // act & assert - assertThatCode(() -> sut.createArticle(studyRoom, permittedAccessor)) - .doesNotThrowAnyException(); - } - - private static Stream providePermittedAccessorForLinkArticle() { - return Stream.of( - Arguments.of(new Accessor(OWNER_ID, STUDY_ID)), - Arguments.of(new Accessor(PARTICIPANT_ID, STUDY_ID)) - ); - } - - @ParameterizedTest - @DisplayName("링크글을 스터디 참여자만 작성할 수 있다.") - @MethodSource("provideForbiddenAccessorForLinkArticle") - void cantWriteLinkArticleByForbiddenAccessor(final Accessor forbiddenAccessor) { - // arrange - final Member owner = createMember(OWNER_ID); - final StudyRoom studyRoom = createStudyRoom(owner); - - // act & assert - final LinkContent sut = new LinkContent("link", "설명"); - - // act & assert - assertThatThrownBy(() -> sut.createArticle(studyRoom, forbiddenAccessor)) - .isInstanceOf(UneditableArticleException.class); - } - - private static Stream provideForbiddenAccessorForLinkArticle() { - final long otherMemberId = Math.max(OWNER_ID, PARTICIPANT_ID) + 1; - final long otherStudyId = STUDY_ID + 1; - - return Stream.of( - Arguments.of(new Accessor(OWNER_ID, otherStudyId)), // studyId가 잘못된 경우 - Arguments.of(new Accessor(otherMemberId, STUDY_ID)) // 스터디에 참여하지 않은 접근자 - ); - } - - private StudyRoom createStudyRoom(Member owner, Member... participant) { - final Set participants = Stream.of(participant) - .map(Member::getId) - .collect(Collectors.toSet()); - return new StudyRoom(STUDY_ID, owner.getId(), participants); - } - - private Member createMember(final long id) { - return new Member(id, id, "username" + id, "image", "profile"); - } -} diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/LinkArticleServiceTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/LinkArticleServiceTest.java index fe79d3c0f..3bf6291fa 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/LinkArticleServiceTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/LinkArticleServiceTest.java @@ -15,27 +15,20 @@ import com.woowacourse.moamoa.study.service.StudyService; import com.woowacourse.moamoa.study.service.exception.StudyNotFoundException; import com.woowacourse.moamoa.study.service.request.StudyRequest; -import com.woowacourse.moamoa.studyroom.controller.LinkArticleController; -import com.woowacourse.moamoa.studyroom.domain.article.Article; -import com.woowacourse.moamoa.studyroom.domain.article.Content; import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; import com.woowacourse.moamoa.studyroom.domain.article.LinkContent; import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; -import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepository; +import com.woowacourse.moamoa.studyroom.domain.repository.article.LinkArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.LinkArticleDao; -import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; import com.woowacourse.moamoa.studyroom.service.request.LinkArticleRequest; import java.time.LocalDate; -import java.util.function.Supplier; import javax.persistence.EntityManager; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; -import org.springframework.transaction.annotation.Transactional; @RepositoryTest class LinkArticleServiceTest { @@ -53,7 +46,7 @@ class LinkArticleServiceTest { private EntityManager entityManager; @Autowired - private ArticleRepository articleRepository; + private LinkArticleRepository articleRepository; @Autowired private LinkArticleDao linkArticleDao; @@ -71,15 +64,14 @@ void createArticle() { // arrange final Member 짱구 = saveMember(짱구()); final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); - final LinkArticleRequest articleRequest = new LinkArticleRequest("www.naver.com", "설명"); + final LinkContent linkContent = new LinkContent("www.naver.com", "설명"); // act - final LinkArticle article = sut.createArticle(짱구.getId(), 자바_스터디.getId(), articleRequest); + final LinkArticle article = sut.createArticle(짱구.getId(), 자바_스터디.getId(), linkContent); // assert - LinkArticle actualArticle = articleRepository.findById(article.getId()) - .orElseThrow(); - assertThat(actualArticle.getContent()).isEqualTo(articleRequest.createContent()); + LinkArticle actualArticle = articleRepository.findById(article.getId()).orElseThrow(); + assertThat(actualArticle.getContent()).isEqualTo(linkContent); } @DisplayName("스터디가 없는 경우 게시글 작성 시 예외가 발생한다.") @@ -87,10 +79,10 @@ void createArticle() { void throwExceptionWhenWriteToNotFoundStudy() { // arrange final Member 짱구 = saveMember(짱구()); - final LinkArticleRequest articleRequest = new LinkArticleRequest("www.naver.com", "설명"); + final LinkContent linkContent = new LinkContent("www.naver.com", "설명"); // act & assert - assertThatThrownBy(() -> sut.createArticle(짱구.getId(), 1L, articleRequest)) + assertThatThrownBy(() -> sut.createArticle(짱구.getId(), 1L, linkContent)) .isInstanceOf(StudyNotFoundException.class); } @@ -100,10 +92,9 @@ void createByNotParticipatedMember() { final Member 짱구 = saveMember(짱구()); final Member 디우 = saveMember(디우()); final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); + final LinkContent linkContent = new LinkContent("www.naver.com", "설명"); - final LinkArticleRequest articleRequest = new LinkArticleRequest("www.naver.com", "설명"); - - assertThatThrownBy(() -> sut.createArticle(디우.getId(), 자바_스터디.getId(), articleRequest)) + assertThatThrownBy(() -> sut.createArticle(디우.getId(), 자바_스터디.getId(), linkContent)) .isInstanceOf(UneditableArticleException.class); } @@ -113,12 +104,13 @@ void updateArticle() { // arrange final Member 짱구 = saveMember(짱구()); final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); - final LinkArticleRequest articleRequest = new LinkArticleRequest("www.naver.com", "설명"); - final ArticleRequest updatingArticleRequest = new LinkArticleRequest("링크 수정", "설명 수정"); - final LinkArticle article = sut.createArticle(짱구.getId(), 자바_스터디.getId(), articleRequest); + final LinkContent linkContent = new LinkContent("www.naver.com", "설명"); + final LinkArticle article = sut.createArticle(짱구.getId(), 자바_스터디.getId(), linkContent); + + final LinkContent newContent = new LinkContent("링크 수정", "설명 수정"); // act - sut.updateArticle(짱구.getId(), 자바_스터디.getId(), article.getId(), updatingArticleRequest); + sut.updateArticle(짱구.getId(), 자바_스터디.getId(), article.getId(), newContent); // assert LinkArticle actualArticle = articleRepository.findById(article.getId()).orElseThrow(); @@ -131,9 +123,9 @@ void updateByInvalidLinkId() { final Member 짱구 = saveMember(짱구()); final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); - final ArticleRequest articleRequest = new LinkArticleRequest("www.naver.com", "수정"); + final LinkContent linkContent = new LinkContent("www.naver.com", "설명"); - assertThatThrownBy(() -> sut.updateArticle(짱구.getId(), 자바_스터디.getId(), -1L, articleRequest)) + assertThatThrownBy(() -> sut.updateArticle(짱구.getId(), 자바_스터디.getId(), -1L, linkContent)) .isInstanceOf(ArticleNotFoundException.class); } @@ -144,10 +136,12 @@ void updateByNotParticipatedMember() { final Member 디우 = saveMember(디우()); final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); - final ArticleRequest articleRequest = new LinkArticleRequest("www.naver.com", "설명"); - final Article 링크_게시글 = createArticle(짱구, 자바_스터디, articleRequest); + final LinkContent linkContent = new LinkContent("www.naver.com", "설명"); - assertThatThrownBy(() -> sut.updateArticle(디우.getId(), 자바_스터디.getId(), 링크_게시글.getId(), articleRequest)) + final LinkArticle 링크_게시글 = createArticle(짱구, 자바_스터디, linkContent); + + assertThatThrownBy(() -> sut.updateArticle(디우.getId(), 자바_스터디.getId(), 링크_게시글.getId(), + linkContent)) .isInstanceOf(UneditableArticleException.class); } @@ -157,8 +151,8 @@ void deleteArticle() { // arrange final Member 짱구 = saveMember(짱구()); final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); - final ArticleRequest articleRequest = new LinkArticleRequest("www.naver.com", "설명"); - final Article 게시글 = createArticle(짱구, 자바_스터디, articleRequest); + final LinkContent linkContent = new LinkContent("www.naver.com", "설명"); + final LinkArticle 게시글 = createArticle(짱구, 자바_스터디, linkContent); //act sut.deleteArticle(짱구.getId(), 자바_스터디.getId(), 게시글.getId()); @@ -186,9 +180,8 @@ void deleteByNotParticipatedMember() { final Member 짱구 = saveMember(짱구()); final Member 디우 = saveMember(디우()); final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); - - final ArticleRequest articleRequest = new LinkArticleRequest("www.naver.com", "설명"); - final LinkArticle 링크_게시글 = sut.createArticle(짱구.getId(), 자바_스터디.getId(), articleRequest); + final LinkContent linkContent = new LinkContent("www.naver.com", "설명"); + final LinkArticle 링크_게시글 = sut.createArticle(짱구.getId(), 자바_스터디.getId(), linkContent); assertThatThrownBy(() -> sut.deleteArticle(디우.getId(), 자바_스터디.getId(), 링크_게시글.getId())) .isInstanceOf(UneditableArticleException.class); @@ -209,9 +202,8 @@ private Study createStudy(final Member owner, StudyRequest studyRequest) { return study; } - private LinkArticle createArticle(final Member author, final Study study, - final ArticleRequest articleRequest) { - final LinkArticle article = sut.createArticle(author.getId(), study.getId(), articleRequest); + private LinkArticle createArticle(final Member author, final Study study, final LinkContent content) { + final LinkArticle article = sut.createArticle(author.getId(), study.getId(), content); entityManager.flush(); entityManager.clear(); return article; From 870c6418e2c077cbc4771b39c933383bc0874945 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=A7=84=ED=98=81?= Date: Sun, 2 Oct 2022 00:29:48 +0900 Subject: [PATCH 34/40] =?UTF-8?q?refactor:=20NoticeArtice=20=EC=83=81?= =?UTF-8?q?=EC=86=8D=20=EA=B5=AC=EC=A1=B0=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/NoticeArticleController.java | 4 +- .../studyroom/domain/article/Article.java | 4 + .../studyroom/domain/article/ArticleType.java | 34 ++++++ .../domain/article/NoticeArticle.java | 55 +++++++++- .../domain/article/NoticeContent.java | 12 +-- .../article/NoticeArticleRepository.java | 2 +- .../service/NoticeArticleService.java | 43 +++++++- .../service/request/NoticeArticleRequest.java | 3 +- .../domain/article/NoticeArticleTest.java | 54 +++++++--- .../domain/article/NoticeContentTest.java | 74 ------------- .../service/NoticeArticleServiceTest.java | 56 +++++----- backend/src/test/resources/schema.sql | 101 ++++++++++-------- 12 files changed, 259 insertions(+), 183 deletions(-) create mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleType.java delete mode 100644 backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeContentTest.java diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/NoticeArticleController.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/NoticeArticleController.java index b8bd768e0..8850c7be2 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/NoticeArticleController.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/NoticeArticleController.java @@ -36,7 +36,7 @@ public ResponseEntity createArticle(@AuthenticatedMemberId final Long id, @PathVariable("study-id") final Long studyId, @Valid @RequestBody final NoticeArticleRequest request ) { - final NoticeArticle article = noticeArticleService.createArticle(id, studyId, request); + final NoticeArticle article = noticeArticleService.createArticle(id, studyId, request.createContent()); final URI location = URI.create("/api/studies/" + studyId + "/notice/articles/" + article.getId()); return ResponseEntity.created(location).header("Access-Control-Allow-Headers", HttpHeaders.LOCATION).build(); } @@ -72,7 +72,7 @@ public ResponseEntity updateArticle(@AuthenticatedMemberId final Long id, @PathVariable("article-id") final Long articleId, @Valid @RequestBody final NoticeArticleRequest request ) { - noticeArticleService.updateArticle(id, studyId, articleId, request); + noticeArticleService.updateArticle(id, studyId, articleId, request.createContent()); return ResponseEntity.noContent().build(); } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java index 68c515ee3..e3f8c56b8 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java @@ -12,6 +12,7 @@ import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.MappedSuperclass; +import javax.persistence.Transient; import lombok.AccessLevel; import lombok.NoArgsConstructor; @@ -33,6 +34,9 @@ public abstract class Article>> extends B @Column(nullable = false) private boolean deleted; + @Transient + private ArticleType type; + protected Article(final Long id, final StudyRoom studyRoom, final Long authorId) { this.id = id; this.studyRoom = studyRoom; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleType.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleType.java new file mode 100644 index 000000000..c64c5497d --- /dev/null +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleType.java @@ -0,0 +1,34 @@ +package com.woowacourse.moamoa.studyroom.domain.article; + +import com.woowacourse.moamoa.studyroom.domain.Accessor; +import com.woowacourse.moamoa.studyroom.domain.StudyRoom; + +public enum ArticleType { + + NOTICE{ + @Override + boolean isWritableAccessor(final StudyRoom studyRoom, final Accessor accessor) { + return studyRoom.isOwner(accessor); + } + + @Override + NoticeArticle createArticle(final StudyRoom studyRoom, final Accessor accessor, final NoticeContent content) { + return new NoticeArticle(accessor.getMemberId(), studyRoom, content); + } + }, + COMMUNITY{ + @Override + boolean isWritableAccessor(final StudyRoom studyRoom, final Accessor accessor) { + throw new UnsupportedOperationException("#isWritableAccessor not implemented yet !!"); + } + + @Override + NoticeArticle createArticle(final StudyRoom studyRoom, final Accessor accessor, final NoticeContent content) { + throw new UnsupportedOperationException("#createArticle not implemented yet !!"); + } + }; + + abstract boolean isWritableAccessor(final StudyRoom studyRoom, final Accessor accessor); + + abstract NoticeArticle createArticle(final StudyRoom studyRoom, final Accessor accessor, final NoticeContent content); +} diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticle.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticle.java index bec0847c2..0daca2706 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticle.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticle.java @@ -1,11 +1,20 @@ package com.woowacourse.moamoa.studyroom.domain.article; +import com.woowacourse.moamoa.common.entity.BaseEntity; import com.woowacourse.moamoa.studyroom.domain.Accessor; import com.woowacourse.moamoa.studyroom.domain.StudyRoom; import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; +import javax.persistence.Column; import javax.persistence.Embedded; import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; import javax.persistence.Table; +import javax.persistence.Transient; import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.hibernate.annotations.Where; @@ -14,22 +23,53 @@ @NoArgsConstructor(access = AccessLevel.PROTECTED) @Table(name = "notice") @Where(clause = "deleted = false") -public class NoticeArticle extends Article { +public class NoticeArticle extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "study_id") + protected StudyRoom studyRoom; + + @Column(name = "author_id", nullable = false) + protected Long authorId; + + @Column(nullable = false) + private boolean deleted; @Embedded private NoticeContent content; + public static NoticeArticle create(final StudyRoom studyRoom, final Accessor accessor, final NoticeContent content) { + if (studyRoom.isOwner(accessor)) { + return new NoticeArticle(accessor.getMemberId(), studyRoom, content); + } + + throw new UneditableArticleException(studyRoom.getId(), accessor, NoticeArticle.class); + } + NoticeArticle(final Long authorId, final StudyRoom studyRoom, final NoticeContent content) { this(null, authorId, studyRoom, content); } private NoticeArticle(final Long id, final Long authorId, final StudyRoom studyRoom, final NoticeContent content) { - super(id, studyRoom, authorId); + this.id = id; + this.studyRoom = studyRoom; + this.authorId = authorId; this.content = content; } - @Override + public final void delete(final Accessor accessor) { + if (isUneditableAccessor(accessor)) { + throw new UneditableArticleException(studyRoom.getId(), accessor, getClass()); + } + + deleted = true; + } + public void update(final Accessor accessor, final NoticeContent content) { if (isUneditableAccessor(accessor)) { throw new UneditableArticleException(studyRoom.getId(), accessor, getClass()); @@ -38,7 +78,14 @@ public void update(final Accessor accessor, final NoticeContent content) { this.content = content; } - @Override + public Long getId() { + return id; + } + + boolean isDeleted() { + return deleted; + } + protected boolean isUneditableAccessor(final Accessor accessor) { return !studyRoom.isOwner(accessor); } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeContent.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeContent.java index 81ceb048b..26a27973d 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeContent.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeContent.java @@ -2,7 +2,6 @@ import com.woowacourse.moamoa.studyroom.domain.Accessor; import com.woowacourse.moamoa.studyroom.domain.StudyRoom; -import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; import java.util.Objects; import javax.persistence.Column; import javax.persistence.Embeddable; @@ -11,7 +10,7 @@ @Embeddable @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class NoticeContent implements Content { +public class NoticeContent { @Column(nullable = false) private String title; @@ -24,15 +23,6 @@ public NoticeContent(final String title, final String content) { this.content = content; } - @Override - public NoticeArticle createArticle(final StudyRoom studyRoom, final Accessor accessor) { - if (studyRoom.isOwner(accessor)) { - return new NoticeArticle(accessor.getMemberId(), studyRoom, this); - } - - throw new UneditableArticleException(studyRoom.getId(), accessor, NoticeArticle.class); - } - public String getTitle() { return title; } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/NoticeArticleRepository.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/NoticeArticleRepository.java index 3748097ab..a74fd76fc 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/NoticeArticleRepository.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/NoticeArticleRepository.java @@ -3,5 +3,5 @@ import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; import org.springframework.data.jpa.repository.JpaRepository; -interface NoticeArticleRepository extends JpaRepository, ArticleRepository { +public interface NoticeArticleRepository extends JpaRepository { } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleService.java index 420c51ca1..ff79eff47 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleService.java @@ -1,9 +1,12 @@ package com.woowacourse.moamoa.studyroom.service; +import com.woowacourse.moamoa.study.service.exception.StudyNotFoundException; +import com.woowacourse.moamoa.studyroom.domain.Accessor; +import com.woowacourse.moamoa.studyroom.domain.StudyRoom; import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; import com.woowacourse.moamoa.studyroom.domain.article.NoticeContent; import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; -import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepository; +import com.woowacourse.moamoa.studyroom.domain.repository.article.NoticeArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.NoticeArticleDao; import com.woowacourse.moamoa.studyroom.query.data.ArticleData; @@ -20,15 +23,18 @@ @Service @Transactional(readOnly = true) -public class NoticeArticleService extends AbstractArticleService { +public class NoticeArticleService { + private final StudyRoomRepository studyRoomRepository; + private final NoticeArticleRepository articleRepository; private final NoticeArticleDao noticeArticleDao; @Autowired public NoticeArticleService(final StudyRoomRepository studyRoomRepository, - final ArticleRepository articleRepository, + final NoticeArticleRepository articleRepository, final NoticeArticleDao noticeArticleDao) { - super(studyRoomRepository, articleRepository, NoticeArticle.class); + this.studyRoomRepository = studyRoomRepository; + this.articleRepository = articleRepository; this.noticeArticleDao = noticeArticleDao; } @@ -48,4 +54,33 @@ public ArticleSummariesResponse getArticles(final Long studyId, final Pageable p return new ArticleSummariesResponse(articles, page.getNumber(), page.getTotalPages() - 1, page.getTotalElements()); } + + @Transactional + public NoticeArticle createArticle(final Long memberId, final Long studyId, final NoticeContent content) { + final StudyRoom studyRoom = studyRoomRepository.findByStudyId(studyId) + .orElseThrow(() -> new StudyNotFoundException(studyId)); + final NoticeArticle article = NoticeArticle.create(studyRoom, new Accessor(memberId, studyId), content); + + return articleRepository.save(article); + } + + @Transactional + public void updateArticle( + final Long memberId, final Long studyId, final Long articleId, final NoticeContent newContent + ) { + final NoticeArticle article = articleRepository.findById(articleId) + .orElseThrow(() -> new ArticleNotFoundException(articleId, NoticeArticle.class)); + + article.update(new Accessor(memberId, studyId), newContent); + } + + @Transactional + public void deleteArticle(final Long memberId, final Long studyId, final Long articleId) { + final NoticeArticle article = articleRepository.findById(articleId) + .orElseThrow(() -> new ArticleNotFoundException(articleId, NoticeArticle.class)); + final Accessor accessor = new Accessor(memberId, studyId); + + article.delete(accessor); + } + } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/NoticeArticleRequest.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/NoticeArticleRequest.java index d98d47e61..c4a026bf0 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/NoticeArticleRequest.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/NoticeArticleRequest.java @@ -8,7 +8,7 @@ @Getter @NoArgsConstructor -public class NoticeArticleRequest implements ArticleRequest { +public class NoticeArticleRequest { @NotBlank(message = "내용을 입력해 주세요.") @Length(max = 30) @@ -23,7 +23,6 @@ public NoticeArticleRequest(final String title, final String content) { this.content = content; } - @Override public NoticeContent createContent() { return new NoticeContent(title, content); } diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticleTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticleTest.java index dbf86d175..152e5138d 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticleTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticleTest.java @@ -1,6 +1,7 @@ package com.woowacourse.moamoa.studyroom.domain.article; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatCode; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertAll; @@ -15,7 +16,6 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.CsvSource; import org.junit.jupiter.params.provider.MethodSource; class NoticeArticleTest { @@ -24,6 +24,34 @@ class NoticeArticleTest { private static final long PARTICIPANT_ID = 2L; private static final long STUDY_ID = 1L; + @DisplayName("방장은 공지글을 작성할 수 있다.") + @Test + void writeNoticeArticleByOwner() { + // arrange + final Member owner = createMember(OWNER_ID); + final StudyRoom studyRoom = createStudyRoom(owner); + final NoticeContent sut = new NoticeContent("제목", "내용"); + + // act & assert + assertThatCode(() -> NoticeArticle.create(studyRoom, new Accessor(OWNER_ID, STUDY_ID), sut)) + .doesNotThrowAnyException(); + } + + @ParameterizedTest + @DisplayName("방장 외에는 공지글을 작성할 수 없다.") + @MethodSource("provideForbiddenAccessor") + void cantWriteNoticeArticleByNonOwner(final Accessor accessor) { + // arrange + final Member owner = createMember(OWNER_ID); + final Member participant = createMember(PARTICIPANT_ID); + final StudyRoom studyRoom = createStudyRoom(owner, participant); + final NoticeContent sut = new NoticeContent("제목", "내용"); + + // act && assert + assertThatThrownBy(() -> NoticeArticle.create(studyRoom, accessor, sut)) + .isInstanceOf(UneditableArticleException.class); + } + @DisplayName("공지 게시글은 방장만 수정할 수 있다.") @Test void update() { @@ -79,6 +107,17 @@ void deleteByNotAuthor(final Accessor forbiddenAccessor) { .isInstanceOf(UneditableArticleException.class); } + private static Stream provideForbiddenAccessor() { + final long otherMemberId = Math.max(OWNER_ID, PARTICIPANT_ID) + 1; + final long otherStudyId = STUDY_ID + 1; + + return Stream.of( + Arguments.of(new Accessor(PARTICIPANT_ID, STUDY_ID)), + Arguments.of(new Accessor(OWNER_ID, otherStudyId)), + Arguments.of(new Accessor(otherMemberId, otherStudyId)) + ); + } + private Member createMember(final long id) { return new Member(id, id, "username" + id, "image", "profile"); } @@ -93,17 +132,6 @@ private StudyRoom createStudyRoom(Member owner, Member... participant) { private NoticeArticle createNoticeArticle(final Member owner, final StudyRoom studyRoom) { final Accessor accessor = new Accessor(owner.getId(), studyRoom.getId()); final NoticeContent noticeContent = new NoticeContent("제목", "내용"); - return noticeContent.createArticle(studyRoom, accessor); - } - - private static Stream provideForbiddenAccessor() { - final long otherMemberId = OWNER_ID + 1; - final long otherStudyId = STUDY_ID + 1; - - return Stream.of( - Arguments.of(new Accessor(otherMemberId, STUDY_ID)), - Arguments.of(new Accessor(OWNER_ID, otherStudyId)), - Arguments.of(new Accessor(otherMemberId, otherStudyId)) - ); + return NoticeArticle.create(studyRoom, accessor, noticeContent); } } diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeContentTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeContentTest.java deleted file mode 100644 index 3d4578f2b..000000000 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeContentTest.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.woowacourse.moamoa.studyroom.domain.article; - -import static org.assertj.core.api.Assertions.assertThatCode; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -import com.woowacourse.moamoa.member.domain.Member; -import com.woowacourse.moamoa.studyroom.domain.Accessor; -import com.woowacourse.moamoa.studyroom.domain.StudyRoom; -import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; - -class NoticeContentTest { - - private static final long OWNER_ID = 1L; - private static final long PARTICIPANT_ID = 2L; - private static final long STUDY_ID = 1L; - - @DisplayName("방장은 공지글을 작성할 수 있다.") - @Test - void writeNoticeArticleByOwner() { - // arrange - final Member owner = createMember(OWNER_ID); - final StudyRoom studyRoom = createStudyRoom(owner); - final NoticeContent sut = new NoticeContent("제목", "내용"); - - // act & assert - assertThatCode(() -> sut.createArticle(studyRoom, new Accessor(OWNER_ID, STUDY_ID))) - .doesNotThrowAnyException(); - } - - @ParameterizedTest - @DisplayName("방장 외에는 공지글을 작성할 수 없다.") - @MethodSource("provideForbiddenAccessorForNoticeArticle") - void cantWriteNoticeArticleByNonOwner(final Accessor accessor) { - // arrange - final Member owner = createMember(OWNER_ID); - final Member participant = createMember(PARTICIPANT_ID); - final StudyRoom studyRoom = createStudyRoom(owner, participant); - final NoticeContent sut = new NoticeContent("제목", "내용"); - - // act && assert - assertThatThrownBy(() -> sut.createArticle(studyRoom, accessor)) - .isInstanceOf(UneditableArticleException.class); - } - - private static Stream provideForbiddenAccessorForNoticeArticle() { - final long otherMemberId = Math.max(OWNER_ID, PARTICIPANT_ID) + 1; - final long otherStudyId = STUDY_ID + 1; - - return Stream.of( - Arguments.of(new Accessor(OWNER_ID, otherStudyId)), // studyId가 잘못된 경우 - Arguments.of(new Accessor(PARTICIPANT_ID, STUDY_ID)), - Arguments.of(new Accessor(otherMemberId, STUDY_ID)) - ); - } - - private StudyRoom createStudyRoom(Member owner, Member... participant) { - final Set participants = Stream.of(participant) - .map(Member::getId) - .collect(Collectors.toSet()); - return new StudyRoom(STUDY_ID, owner.getId(), participants); - } - - private Member createMember(final long id) { - return new Member(id, id, "username" + id, "image", "profile"); - } -} diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleServiceTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleServiceTest.java index 8f5bfbb6c..13a6f4370 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleServiceTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleServiceTest.java @@ -15,15 +15,13 @@ import com.woowacourse.moamoa.study.service.StudyService; import com.woowacourse.moamoa.study.service.exception.StudyNotFoundException; import com.woowacourse.moamoa.study.service.request.StudyRequest; -import com.woowacourse.moamoa.studyroom.domain.article.Article; import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; import com.woowacourse.moamoa.studyroom.domain.article.NoticeContent; import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; -import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepository; +import com.woowacourse.moamoa.studyroom.domain.repository.article.NoticeArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.NoticeArticleDao; -import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; import com.woowacourse.moamoa.studyroom.service.request.NoticeArticleRequest; import java.time.LocalDate; import javax.persistence.EntityManager; @@ -48,7 +46,7 @@ class NoticeArticleServiceTest { private EntityManager entityManager; @Autowired - private ArticleRepository articleRepository; + private NoticeArticleRepository articleRepository; @Autowired private NoticeArticleDao articleDao; @@ -66,15 +64,15 @@ void createArticle() { // arrange final Member 짱구 = saveMember(짱구()); final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); - final ArticleRequest articleRequest = new NoticeArticleRequest("제목", "설명"); + final NoticeContent noticeContent = new NoticeContent("제목", "설명"); // act - final NoticeArticle article = sut.createArticle(짱구.getId(), 자바_스터디.getId(), articleRequest); + final NoticeArticle article = sut.createArticle(짱구.getId(), 자바_스터디.getId(), noticeContent); // assert NoticeArticle actualArticle = articleRepository.findById(article.getId()) .orElseThrow(); - assertThat(actualArticle.getContent()).isEqualTo(articleRequest.createContent()); + assertThat(actualArticle.getContent()).isEqualTo(noticeContent); } @DisplayName("스터디가 없는 경우 게시글 작성 시 예외가 발생한다.") @@ -82,10 +80,10 @@ void createArticle() { void throwExceptionWhenWriteToNotFoundStudy() { // arrange final Member 짱구 = saveMember(짱구()); - final NoticeArticleRequest articleRequest = new NoticeArticleRequest("제목", "설명"); + final NoticeContent noticeContent = new NoticeContent("제목", "설명"); // act & assert - assertThatThrownBy(() -> sut.createArticle(짱구.getId(), 1L, articleRequest)) + assertThatThrownBy(() -> sut.createArticle(짱구.getId(), 1L, noticeContent)) .isInstanceOf(StudyNotFoundException.class); } @@ -95,10 +93,9 @@ void createByNotParticipatedMember() { final Member 짱구 = saveMember(짱구()); final Member 디우 = saveMember(디우()); final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); + final NoticeContent noticeContent = new NoticeContent("제목", "설명"); - final NoticeArticleRequest articleRequest = new NoticeArticleRequest("제목", "설명"); - - assertThatThrownBy(() -> sut.createArticle(디우.getId(), 자바_스터디.getId(), articleRequest)) + assertThatThrownBy(() -> sut.createArticle(디우.getId(), 자바_스터디.getId(), noticeContent)) .isInstanceOf(UneditableArticleException.class); } @@ -108,16 +105,17 @@ void updateArticle() { // arrange final Member 짱구 = saveMember(짱구()); final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); - final NoticeArticleRequest articleRequest = new NoticeArticleRequest("제목", "설명"); - final ArticleRequest updatingArticleRequest = new NoticeArticleRequest("제목 수정", "설명 수정"); - final NoticeArticle article = sut.createArticle(짱구.getId(), 자바_스터디.getId(), articleRequest); + final NoticeContent noticeContent = new NoticeContent("제목", "설명"); + final NoticeArticle article = sut.createArticle(짱구.getId(), 자바_스터디.getId(), noticeContent); + + final NoticeContent newContent = new NoticeContent("제목 수정", "설명 수정"); // act - sut.updateArticle(짱구.getId(), 자바_스터디.getId(), article.getId(), updatingArticleRequest); + sut.updateArticle(짱구.getId(), 자바_스터디.getId(), article.getId(), newContent); // assert NoticeArticle actualArticle = articleRepository.findById(article.getId()).orElseThrow(); - assertThat(actualArticle.getContent()).isEqualTo(new NoticeContent("제목 수정", "설명 수정")); + assertThat(actualArticle.getContent()).isEqualTo(newContent); } @DisplayName("존재하지 않는 게시글을 수정할 수 없다.") @@ -125,10 +123,9 @@ void updateArticle() { void updateByInvalidLinkId() { final Member 짱구 = saveMember(짱구()); final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); + final NoticeContent noticeContent = new NoticeContent("제목", "수정"); - final ArticleRequest articleRequest = new NoticeArticleRequest("제목", "수정"); - - assertThatThrownBy(() -> sut.updateArticle(짱구.getId(), 자바_스터디.getId(), -1L, articleRequest)) + assertThatThrownBy(() -> sut.updateArticle(짱구.getId(), 자바_스터디.getId(), -1L, noticeContent)) .isInstanceOf(ArticleNotFoundException.class); } @@ -139,10 +136,11 @@ void updateByNotParticipatedMember() { final Member 디우 = saveMember(디우()); final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); - final ArticleRequest articleRequest = new NoticeArticleRequest("제목", "설명"); - final Article 링크_게시글 = createArticle(짱구, 자바_스터디, articleRequest); + final NoticeContent noticeContent = new NoticeContent("제목", "설명"); + final NoticeArticle 링크_게시글 = createArticle(짱구, 자바_스터디, noticeContent); - assertThatThrownBy(() -> sut.updateArticle(디우.getId(), 자바_스터디.getId(), 링크_게시글.getId(), articleRequest)) + assertThatThrownBy(() -> sut.updateArticle(디우.getId(), 자바_스터디.getId(), 링크_게시글.getId(), + noticeContent)) .isInstanceOf(UneditableArticleException.class); } @@ -152,8 +150,8 @@ void deleteArticle() { // arrange final Member 짱구 = saveMember(짱구()); final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); - final ArticleRequest articleRequest = new NoticeArticleRequest("제목", "설명"); - final Article 게시글 = createArticle(짱구, 자바_스터디, articleRequest); + final NoticeContent noticeContent = new NoticeContent("제목", "설명"); + final NoticeArticle 게시글 = createArticle(짱구, 자바_스터디, noticeContent); //act sut.deleteArticle(짱구.getId(), 자바_스터디.getId(), 게시글.getId()); @@ -182,8 +180,8 @@ void deleteByNotParticipatedMember() { final Member 디우 = saveMember(디우()); final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); - final ArticleRequest articleRequest = new NoticeArticleRequest("제목", "설명"); - final NoticeArticle 링크_게시글 = sut.createArticle(짱구.getId(), 자바_스터디.getId(), articleRequest); + final NoticeContent noticeContent = new NoticeContent("제목", "설명"); + final NoticeArticle 링크_게시글 = sut.createArticle(짱구.getId(), 자바_스터디.getId(), noticeContent); assertThatThrownBy(() -> sut.deleteArticle(디우.getId(), 자바_스터디.getId(), 링크_게시글.getId())) .isInstanceOf(UneditableArticleException.class); @@ -205,8 +203,8 @@ private Study createStudy(final Member owner, StudyRequest studyRequest) { } private NoticeArticle createArticle(final Member author, final Study study, - final ArticleRequest articleRequest) { - final NoticeArticle article = sut.createArticle(author.getId(), study.getId(), articleRequest); + final NoticeContent noticeContent) { + final NoticeArticle article = sut.createArticle(author.getId(), study.getId(), noticeContent); entityManager.flush(); entityManager.clear(); return article; diff --git a/backend/src/test/resources/schema.sql b/backend/src/test/resources/schema.sql index e0fe410e7..02e55b71f 100644 --- a/backend/src/test/resources/schema.sql +++ b/backend/src/test/resources/schema.sql @@ -11,88 +11,88 @@ DROP TABLE IF EXISTS token; CREATE TABLE member ( - id BIGINT PRIMARY KEY AUTO_INCREMENT, - github_id BIGINT NOT NULL UNIQUE, - username VARCHAR(255) NOT NULL UNIQUE, - image_url VARCHAR(255), + id BIGINT PRIMARY KEY AUTO_INCREMENT, + github_id BIGINT NOT NULL UNIQUE, + username VARCHAR(255) NOT NULL UNIQUE, + image_url VARCHAR(255), profile_url VARCHAR(255) ); CREATE TABLE study ( - id BIGINT PRIMARY KEY AUTO_INCREMENT, - title VARCHAR(30) NOT NULL, - excerpt VARCHAR(50) NOT NULL, - thumbnail VARCHAR(255) NOT NULL, - recruitment_status VARCHAR(255) NOT NULL, - study_status VARCHAR(255) NOT NULL, - description MEDIUMTEXT, + id BIGINT PRIMARY KEY AUTO_INCREMENT, + title VARCHAR(30) NOT NULL, + excerpt VARCHAR(50) NOT NULL, + thumbnail VARCHAR(255) NOT NULL, + recruitment_status VARCHAR(255) NOT NULL, + study_status VARCHAR(255) NOT NULL, + description MEDIUMTEXT, current_member_count INTEGER DEFAULT 1, - max_member_count INTEGER, - created_at DATETIME not null, - enrollment_end_date DATE, - start_date DATE not null, - end_date DATE, - owner_id BIGINT NOT NULL, + max_member_count INTEGER, + created_at DATETIME not null, + enrollment_end_date DATE, + start_date DATE not null, + end_date DATE, + owner_id BIGINT NOT NULL, FOREIGN KEY (owner_id) REFERENCES member (id) ); CREATE TABLE review ( - id BIGINT PRIMARY KEY AUTO_INCREMENT, - study_id BIGINT NOT NULL, - member_id BIGINT NOT NULL, - content MEDIUMTEXT, - created_date DATE not null, - last_modified_date DATE not null, - deleted boolean not null, + id BIGINT PRIMARY KEY AUTO_INCREMENT, + study_id BIGINT NOT NULL, + member_id BIGINT NOT NULL, + content MEDIUMTEXT, + created_date DATE not null, + last_modified_date DATE not null, + deleted boolean not null, FOREIGN KEY (study_id) REFERENCES study (id), FOREIGN KEY (member_id) REFERENCES member (id) ); CREATE TABLE link ( - id BIGINT PRIMARY KEY AUTO_INCREMENT, - study_id BIGINT NOT NULL, - author_id BIGINT NOT NULL, - link_url MEDIUMTEXT NOT NULL, - description MEDIUMTEXT, - created_date DATETIME NOT NULL, - last_modified_date DATETIME NOT NULL, - deleted boolean NOT NULL, + id BIGINT PRIMARY KEY AUTO_INCREMENT, + study_id BIGINT NOT NULL, + author_id BIGINT NOT NULL, + link_url MEDIUMTEXT NOT NULL, + description MEDIUMTEXT, + created_date DATETIME NOT NULL, + last_modified_date DATETIME NOT NULL, + deleted boolean NOT NULL, FOREIGN KEY (study_id) REFERENCES study (id), FOREIGN KEY (author_id) REFERENCES member (id) ); CREATE TABLE category ( - id BIGINT PRIMARY KEY, + id BIGINT PRIMARY KEY, name VARCHAR(255) NOT NULL ); CREATE TABLE tag ( - id BIGINT PRIMARY KEY AUTO_INCREMENT, - name VARCHAR(255) NOT NULL, + id BIGINT PRIMARY KEY AUTO_INCREMENT, + name VARCHAR(255) NOT NULL, description VARCHAR(255) NOT NULL, category_id BIGINT, - FOREIGN KEY (category_id) REFERENCES category(id) + FOREIGN KEY (category_id) REFERENCES category (id) ); CREATE TABLE study_tag ( - id BIGINT PRIMARY KEY AUTO_INCREMENT, + id BIGINT PRIMARY KEY AUTO_INCREMENT, study_id BIGINT, - tag_id BIGINT, + tag_id BIGINT, FOREIGN KEY (study_id) REFERENCES study (id), FOREIGN KEY (tag_id) REFERENCES tag (id) ); CREATE TABLE study_member ( - id BIGINT PRIMARY KEY AUTO_INCREMENT, - study_id BIGINT, - member_id BIGINT, + id BIGINT PRIMARY KEY AUTO_INCREMENT, + study_id BIGINT, + member_id BIGINT, participation_date DATE not null, FOREIGN KEY (study_id) REFERENCES study (id), FOREIGN KEY (member_id) REFERENCES member (id) @@ -107,7 +107,7 @@ CREATE TABLE community study_id BIGINT, created_date DATETIME not null, last_modified_date DATETIME not null, - deleted boolean NOT NULL, + deleted boolean NOT NULL, FOREIGN KEY (author_id) REFERENCES member (id), FOREIGN KEY (study_id) REFERENCES study (id) ); @@ -121,7 +121,22 @@ CREATE TABLE notice study_id BIGINT, created_date DATETIME not null, last_modified_date DATETIME not null, - deleted boolean NOT NULL, + deleted boolean NOT NULL, + FOREIGN KEY (author_id) REFERENCES member (id), + FOREIGN KEY (study_id) REFERENCES study (id) +); + +CREATE TABLE article +( + id BIGINT PRIMARY KEY AUTO_INCREMENT, + title VARCHAR(255) NOT NULL, + content MEDIUMTEXT NOT NULL, + author_id BIGINT, + study_id BIGINT, + created_date DATETIME not null, + last_modified_date DATETIME not null, + type VARCHAR(255) NOT NULL, + deleted boolean NOT NULL, FOREIGN KEY (author_id) REFERENCES member (id), FOREIGN KEY (study_id) REFERENCES study (id) ); From 0e4a4de9b9bc70c4b9c489209d511973e7804ac6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=A7=84=ED=98=81?= Date: Sun, 2 Oct 2022 00:39:41 +0900 Subject: [PATCH 35/40] =?UTF-8?q?refactor:=20CommunityArticle=20=EC=83=81?= =?UTF-8?q?=EC=86=8D=20=EA=B5=AC=EC=A1=B0=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../studyroom/domain/article/Article.java | 66 ------------------- .../domain/article/CommunityArticle.java | 55 ++++++++++++++-- .../domain/article/CommunityContent.java | 9 +-- .../studyroom/domain/article/Content.java | 9 --- .../exception/ArticleNotFoundException.java | 2 - .../exception/UneditableArticleException.java | 3 - .../repository/article/ArticleRepository.java | 12 ---- .../article/CommunityArticleRepository.java | 2 +- .../service/AbstractArticleService.java | 56 ---------------- .../service/CommunityArticleService.java | 45 +++++++++++-- .../service/request/ArticleRequest.java | 9 --- .../request/CommunityArticleRequest.java | 3 +- .../com/woowacourse/moamoa/WebMVCTest.java | 7 -- .../service/CommunityArticleServiceTest.java | 24 ++++--- 14 files changed, 107 insertions(+), 195 deletions(-) delete mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java delete mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Content.java delete mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/ArticleRepository.java delete mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/service/AbstractArticleService.java delete mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/ArticleRequest.java diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java deleted file mode 100644 index e3f8c56b8..000000000 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.woowacourse.moamoa.studyroom.domain.article; - -import com.woowacourse.moamoa.common.entity.BaseEntity; -import com.woowacourse.moamoa.studyroom.domain.Accessor; -import com.woowacourse.moamoa.studyroom.domain.StudyRoom; -import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; -import javax.persistence.Column; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.MappedSuperclass; -import javax.persistence.Transient; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; - -@MappedSuperclass -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public abstract class Article>> extends BaseEntity { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @ManyToOne(fetch = FetchType.EAGER) - @JoinColumn(name = "study_id") - protected StudyRoom studyRoom; - - @Column(name = "author_id", nullable = false) - protected Long authorId; - - @Column(nullable = false) - private boolean deleted; - - @Transient - private ArticleType type; - - protected Article(final Long id, final StudyRoom studyRoom, final Long authorId) { - this.id = id; - this.studyRoom = studyRoom; - this.authorId = authorId; - this.deleted = false; - } - - public final void delete(final Accessor accessor) { - if (isUneditableAccessor(accessor)) { - throw new UneditableArticleException(studyRoom.getId(), accessor, getClass()); - } - - deleted = true; - } - - public Long getId() { - return id; - } - - boolean isDeleted() { - return deleted; - } - - public abstract void update(final Accessor accessor, final T content); - - protected abstract boolean isUneditableAccessor(final Accessor accessor); -} diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticle.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticle.java index 15ad2e34e..8fc1b91f3 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticle.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticle.java @@ -1,10 +1,18 @@ package com.woowacourse.moamoa.studyroom.domain.article; +import com.woowacourse.moamoa.common.entity.BaseEntity; import com.woowacourse.moamoa.studyroom.domain.Accessor; import com.woowacourse.moamoa.studyroom.domain.StudyRoom; import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; +import javax.persistence.Column; import javax.persistence.Embedded; import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; import javax.persistence.Table; import lombok.AccessLevel; import lombok.NoArgsConstructor; @@ -14,11 +22,34 @@ @NoArgsConstructor(access = AccessLevel.PROTECTED) @Table(name = "community") @Where(clause = "deleted = false") -public class CommunityArticle extends Article { +public class CommunityArticle extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "study_id") + protected StudyRoom studyRoom; + + @Column(name = "author_id", nullable = false) + protected Long authorId; + + @Column(nullable = false) + private boolean deleted; + @Embedded private CommunityContent content; + public static CommunityArticle create(final StudyRoom studyRoom, final Accessor accessor, final CommunityContent content) { + if (!studyRoom.isPermittedAccessor(accessor)) { + throw new UneditableArticleException(studyRoom.getId(), accessor, CommunityArticle.class); + } + + return new CommunityArticle(studyRoom, accessor.getMemberId(), content); + } + CommunityArticle(final StudyRoom studyRoom, final Long authorId, final CommunityContent content) { this(null, authorId, studyRoom, content); } @@ -26,11 +57,12 @@ public class CommunityArticle extends Article { private CommunityArticle(final Long id, final Long authorId, final StudyRoom studyRoom, final CommunityContent content ) { - super(id, studyRoom, authorId); + this.id = id; + this.authorId = authorId; + this.studyRoom = studyRoom; this.content = content; } - @Override public void update(final Accessor accessor, final CommunityContent content) { if (isUneditableAccessor(accessor)) { throw new UneditableArticleException(studyRoom.getId(), accessor, getClass()); @@ -39,7 +71,22 @@ public void update(final Accessor accessor, final CommunityContent content) { this.content = content; } - @Override + public final void delete(final Accessor accessor) { + if (isUneditableAccessor(accessor)) { + throw new UneditableArticleException(studyRoom.getId(), accessor, getClass()); + } + + deleted = true; + } + + public Long getId() { + return id; + } + + boolean isDeleted() { + return deleted; + } + protected boolean isUneditableAccessor(final Accessor accessor) { return !studyRoom.isPermittedAccessor(accessor) || !authorId.equals(accessor.getMemberId()); } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityContent.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityContent.java index 0b33d89de..51896845f 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityContent.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityContent.java @@ -11,7 +11,7 @@ @Embeddable @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class CommunityContent implements Content { +public class CommunityContent { @Column(nullable = false) private String title; @@ -24,13 +24,8 @@ public CommunityContent(final String title, final String content) { this.content = content; } - @Override public CommunityArticle createArticle(final StudyRoom studyRoom, final Accessor accessor) { - if (!studyRoom.isPermittedAccessor(accessor)) { - throw new UneditableArticleException(studyRoom.getId(), accessor, CommunityArticle.class); - } - - return new CommunityArticle(studyRoom, accessor.getMemberId(), this); + return CommunityArticle.create(studyRoom, accessor, this); } public String getTitle() { diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Content.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Content.java deleted file mode 100644 index 306bd8cf4..000000000 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Content.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.woowacourse.moamoa.studyroom.domain.article; - -import com.woowacourse.moamoa.studyroom.domain.Accessor; -import com.woowacourse.moamoa.studyroom.domain.StudyRoom; - -public interface Content>> { - - A createArticle(StudyRoom studyRoom, Accessor accessor); -} diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/ArticleNotFoundException.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/ArticleNotFoundException.java index 8edd6b1e7..e8b542f79 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/ArticleNotFoundException.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/ArticleNotFoundException.java @@ -1,8 +1,6 @@ package com.woowacourse.moamoa.studyroom.domain.exception; import com.woowacourse.moamoa.common.exception.NotFoundException; -import com.woowacourse.moamoa.studyroom.domain.article.Article; -import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; public class ArticleNotFoundException extends NotFoundException { diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/UneditableArticleException.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/UneditableArticleException.java index b28b66871..dcd6725c3 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/UneditableArticleException.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/UneditableArticleException.java @@ -2,9 +2,6 @@ import com.woowacourse.moamoa.common.exception.BadRequestException; import com.woowacourse.moamoa.studyroom.domain.Accessor; -import com.woowacourse.moamoa.studyroom.domain.article.Article; -import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; -import com.woowacourse.moamoa.studyroom.domain.article.LinkContent; public class UneditableArticleException extends BadRequestException { diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/ArticleRepository.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/ArticleRepository.java deleted file mode 100644 index 0b8fd1efa..000000000 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/ArticleRepository.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.woowacourse.moamoa.studyroom.domain.repository.article; - -import com.woowacourse.moamoa.studyroom.domain.article.Article; -import com.woowacourse.moamoa.studyroom.domain.article.Content; -import java.util.Optional; - -public interface ArticleRepository>> { - - A save(A article); - - Optional findById(Long id); -} diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/CommunityArticleRepository.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/CommunityArticleRepository.java index 09bd6b9e7..c2ccad9e1 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/CommunityArticleRepository.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/CommunityArticleRepository.java @@ -3,5 +3,5 @@ import com.woowacourse.moamoa.studyroom.domain.article.CommunityArticle; import org.springframework.data.jpa.repository.JpaRepository; -interface CommunityArticleRepository extends JpaRepository, ArticleRepository { +public interface CommunityArticleRepository extends JpaRepository { } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/AbstractArticleService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/AbstractArticleService.java deleted file mode 100644 index b640163ed..000000000 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/AbstractArticleService.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.woowacourse.moamoa.studyroom.service; - -import com.woowacourse.moamoa.study.service.exception.StudyNotFoundException; -import com.woowacourse.moamoa.studyroom.domain.Accessor; -import com.woowacourse.moamoa.studyroom.domain.StudyRoom; -import com.woowacourse.moamoa.studyroom.domain.article.Article; -import com.woowacourse.moamoa.studyroom.domain.article.Content; -import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; -import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepository; -import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; -import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; -import org.springframework.transaction.annotation.Transactional; - -@Transactional -public abstract class AbstractArticleService, C extends Content> { - - private final StudyRoomRepository studyRoomRepository; - private final ArticleRepository articleRepository; - private final Class articleType; - - protected AbstractArticleService( - final StudyRoomRepository studyRoomRepository, final ArticleRepository articleRepository, - final Class articleType - ) { - this.studyRoomRepository = studyRoomRepository; - this.articleRepository = articleRepository; - this.articleType = articleType; - } - - public A createArticle(final Long memberId, final Long studyId, final ArticleRequest articleRequest) { - final StudyRoom studyRoom = studyRoomRepository.findByStudyId(studyId) - .orElseThrow(StudyNotFoundException::new); - final C content = articleRequest.createContent(); - final A article = content.createArticle(studyRoom, new Accessor(memberId, studyId)); - - return articleRepository.save(article); - } - - public void updateArticle( - final Long memberId, final Long studyId, final Long articleId, final ArticleRequest articleRequest - ) { - final A article = articleRepository.findById(articleId) - .orElseThrow(() -> new ArticleNotFoundException(articleId, articleType)); - final C newContent = articleRequest.createContent(); - - article.update(new Accessor(memberId, studyId), newContent); - } - - public void deleteArticle(final Long memberId, final Long studyId, final Long articleId) { - final A article = articleRepository.findById(articleId) - .orElseThrow(() -> new ArticleNotFoundException(articleId, articleType)); - final Accessor accessor = new Accessor(memberId, studyId); - - article.delete(accessor); - } -} diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleService.java index 916d13db4..f4ff1ec13 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleService.java @@ -1,12 +1,16 @@ package com.woowacourse.moamoa.studyroom.service; +import com.woowacourse.moamoa.study.service.exception.StudyNotFoundException; +import com.woowacourse.moamoa.studyroom.domain.Accessor; +import com.woowacourse.moamoa.studyroom.domain.StudyRoom; import com.woowacourse.moamoa.studyroom.domain.article.CommunityArticle; import com.woowacourse.moamoa.studyroom.domain.article.CommunityContent; import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; -import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepository; +import com.woowacourse.moamoa.studyroom.domain.repository.article.CommunityArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.CommunityArticleDao; import com.woowacourse.moamoa.studyroom.query.data.ArticleData; +import com.woowacourse.moamoa.studyroom.service.request.CommunityArticleRequest; import com.woowacourse.moamoa.studyroom.service.response.ArticleResponse; import com.woowacourse.moamoa.studyroom.service.response.ArticleSummariesResponse; import com.woowacourse.moamoa.studyroom.service.response.ArticleSummaryResponse; @@ -19,13 +23,16 @@ @Service @Transactional(readOnly = true) -public class CommunityArticleService extends AbstractArticleService { +public class CommunityArticleService { + private final StudyRoomRepository studyRoomRepository; + private final CommunityArticleRepository articleRepository; private final CommunityArticleDao communityArticleDao; - public CommunityArticleService(final StudyRoomRepository studyRoomRepository, ArticleRepository articleRepository, + public CommunityArticleService(final StudyRoomRepository studyRoomRepository, CommunityArticleRepository articleRepository, final CommunityArticleDao communityArticleDao) { - super(studyRoomRepository, articleRepository, CommunityArticle.class); + this.studyRoomRepository = studyRoomRepository; + this.articleRepository = articleRepository; this.communityArticleDao = communityArticleDao; } @@ -45,4 +52,34 @@ public ArticleSummariesResponse getArticles(final Long studyId, final Pageable p return new ArticleSummariesResponse(articles, page.getNumber(), page.getTotalPages() - 1, page.getTotalElements()); } + + @Transactional + public CommunityArticle createArticle(final Long memberId, final Long studyId, final CommunityArticleRequest articleRequest) { + final StudyRoom studyRoom = studyRoomRepository.findByStudyId(studyId) + .orElseThrow(StudyNotFoundException::new); + final CommunityContent content = articleRequest.createContent(); + final CommunityArticle article = content.createArticle(studyRoom, new Accessor(memberId, studyId)); + + return articleRepository.save(article); + } + + @Transactional + public void updateArticle( + final Long memberId, final Long studyId, final Long articleId, final CommunityArticleRequest articleRequest + ) { + final CommunityArticle article = articleRepository.findById(articleId) + .orElseThrow(() -> new ArticleNotFoundException(articleId, CommunityArticle.class)); + final CommunityContent newContent = articleRequest.createContent(); + + article.update(new Accessor(memberId, studyId), newContent); + } + + @Transactional + public void deleteArticle(final Long memberId, final Long studyId, final Long articleId) { + final CommunityArticle article = articleRepository.findById(articleId) + .orElseThrow(() -> new ArticleNotFoundException(articleId, CommunityArticle.class)); + final Accessor accessor = new Accessor(memberId, studyId); + + article.delete(accessor); + } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/ArticleRequest.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/ArticleRequest.java deleted file mode 100644 index 267e52fce..000000000 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/ArticleRequest.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.woowacourse.moamoa.studyroom.service.request; - -import com.woowacourse.moamoa.studyroom.domain.article.Article; -import com.woowacourse.moamoa.studyroom.domain.article.Content; - -public interface ArticleRequest> { - - T createContent(); -} diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/CommunityArticleRequest.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/CommunityArticleRequest.java index 16192d621..b43688595 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/CommunityArticleRequest.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/CommunityArticleRequest.java @@ -8,7 +8,7 @@ @Getter @NoArgsConstructor -public class CommunityArticleRequest implements ArticleRequest { +public class CommunityArticleRequest { @NotBlank(message = "내용을 입력해 주세요.") @Length(max = 30) @@ -23,7 +23,6 @@ public CommunityArticleRequest(final String title, final String content) { this.content = content; } - @Override public CommunityContent createContent() { return new CommunityContent(title, content); } diff --git a/backend/src/test/java/com/woowacourse/moamoa/WebMVCTest.java b/backend/src/test/java/com/woowacourse/moamoa/WebMVCTest.java index a8e4ad4e4..7db3df9f8 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/WebMVCTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/WebMVCTest.java @@ -11,13 +11,6 @@ import com.woowacourse.moamoa.common.MockedServiceObjectsBeanRegister; import com.woowacourse.moamoa.member.domain.Member; import com.woowacourse.moamoa.member.domain.repository.MemberRepository; -import com.woowacourse.moamoa.studyroom.domain.article.CommunityArticle; -import com.woowacourse.moamoa.studyroom.domain.article.CommunityContent; -import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; -import com.woowacourse.moamoa.studyroom.domain.article.LinkContent; -import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; -import com.woowacourse.moamoa.studyroom.domain.article.NoticeContent; -import com.woowacourse.moamoa.studyroom.service.AbstractArticleService; import java.util.Optional; import javax.servlet.http.HttpServletRequest; import org.junit.jupiter.api.BeforeEach; diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleServiceTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleServiceTest.java index 563ba67c0..2f8e319c7 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleServiceTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleServiceTest.java @@ -15,15 +15,13 @@ import com.woowacourse.moamoa.study.service.StudyService; import com.woowacourse.moamoa.study.service.exception.StudyNotFoundException; import com.woowacourse.moamoa.study.service.request.StudyRequest; -import com.woowacourse.moamoa.studyroom.domain.article.Article; import com.woowacourse.moamoa.studyroom.domain.article.CommunityArticle; import com.woowacourse.moamoa.studyroom.domain.article.CommunityContent; import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; -import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepository; +import com.woowacourse.moamoa.studyroom.domain.repository.article.CommunityArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.CommunityArticleDao; -import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; import com.woowacourse.moamoa.studyroom.service.request.CommunityArticleRequest; import java.time.LocalDate; import javax.persistence.EntityManager; @@ -48,7 +46,7 @@ class CommunityArticleServiceTest { private EntityManager entityManager; @Autowired - private ArticleRepository articleRepository; + private CommunityArticleRepository articleRepository; @Autowired private CommunityArticleDao articleDao; @@ -66,7 +64,7 @@ void createArticle() { // arrange final Member 짱구 = saveMember(짱구()); final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); - final ArticleRequest articleRequest = new CommunityArticleRequest("제목", "설명"); + final CommunityArticleRequest articleRequest = new CommunityArticleRequest("제목", "설명"); // act final CommunityArticle article = sut.createArticle(짱구.getId(), 자바_스터디.getId(), articleRequest); @@ -110,7 +108,7 @@ void updateArticle() { final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); final CommunityArticle article = createArticle(짱구, 자바_스터디, new CommunityArticleRequest("제목", "설명")); - final ArticleRequest updatingArticleRequest = new CommunityArticleRequest("제목 수정", "설명 수정"); + final CommunityArticleRequest updatingArticleRequest = new CommunityArticleRequest("제목 수정", "설명 수정"); // act sut.updateArticle(짱구.getId(), 자바_스터디.getId(), article.getId(), updatingArticleRequest); @@ -126,7 +124,7 @@ void updateByInvalidLinkId() { final Member 짱구 = saveMember(짱구()); final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); - final ArticleRequest articleRequest = new CommunityArticleRequest("제목", "수정"); + final CommunityArticleRequest articleRequest = new CommunityArticleRequest("제목", "수정"); assertThatThrownBy(() -> sut.updateArticle(짱구.getId(), 자바_스터디.getId(), -1L, articleRequest)) .isInstanceOf(ArticleNotFoundException.class); @@ -139,8 +137,8 @@ void updateByNotParticipatedMember() { final Member 디우 = saveMember(디우()); final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); - final ArticleRequest articleRequest = new CommunityArticleRequest("제목", "설명"); - final Article 링크_게시글 = createArticle(짱구, 자바_스터디, articleRequest); + final CommunityArticleRequest articleRequest = new CommunityArticleRequest("제목", "설명"); + final CommunityArticle 링크_게시글 = createArticle(짱구, 자바_스터디, articleRequest); assertThatThrownBy(() -> sut.updateArticle(디우.getId(), 자바_스터디.getId(), 링크_게시글.getId(), articleRequest)) .isInstanceOf(UneditableArticleException.class); @@ -152,8 +150,8 @@ void deleteArticle() { // arrange final Member 짱구 = saveMember(짱구()); final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); - final ArticleRequest articleRequest = new CommunityArticleRequest("제목", "설명"); - final Article 게시글 = createArticle(짱구, 자바_스터디, articleRequest); + final CommunityArticleRequest articleRequest = new CommunityArticleRequest("제목", "설명"); + final CommunityArticle 게시글 = createArticle(짱구, 자바_스터디, articleRequest); //act sut.deleteArticle(짱구.getId(), 자바_스터디.getId(), 게시글.getId()); @@ -182,7 +180,7 @@ void deleteByNotParticipatedMember() { final Member 디우 = saveMember(디우()); final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); - final ArticleRequest articleRequest = new CommunityArticleRequest("제목", "설명"); + final CommunityArticleRequest articleRequest = new CommunityArticleRequest("제목", "설명"); final CommunityArticle 링크_게시글 = sut.createArticle(짱구.getId(), 자바_스터디.getId(), articleRequest); assertThatThrownBy(() -> sut.deleteArticle(디우.getId(), 자바_스터디.getId(), 링크_게시글.getId())) @@ -205,7 +203,7 @@ private Study createStudy(final Member owner, StudyRequest studyRequest) { } private CommunityArticle createArticle(final Member author, final Study study, - final ArticleRequest articleRequest) { + final CommunityArticleRequest articleRequest) { final CommunityArticle article = sut.createArticle(author.getId(), study.getId(), articleRequest); entityManager.flush(); entityManager.clear(); From 547adcd0e10b18631e5158437e324f297dc247e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=A7=84=ED=98=81?= Date: Sun, 2 Oct 2022 03:33:02 +0900 Subject: [PATCH 36/40] =?UTF-8?q?refactor:=20ArticleType=EC=9D=84=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=ED=95=9C=20=EA=B5=AC=EB=B6=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...Controller.java => ArticleController.java} | 49 ++-- .../CommunityArticleController.java | 76 ------- .../{NoticeArticle.java => Article.java} | 68 +++--- .../studyroom/domain/article/ArticleType.java | 20 +- .../domain/article/CommunityArticle.java | 97 -------- .../domain/article/CommunityContent.java | 55 ----- .../{NoticeContent.java => Content.java} | 8 +- .../studyroom/domain/article/LinkContent.java | 3 - .../repository/article/ArticleRepository.java | 7 + .../article/CommunityArticleRepository.java | 7 - .../article/NoticeArticleRepository.java | 7 - ...mmunityArticleDao.java => ArticleDao.java} | 57 +++-- .../studyroom/query/NoticeArticleDao.java | 81 ------- ...rticleService.java => ArticleService.java} | 52 ++--- .../service/CommunityArticleService.java | 85 ------- ...rticleRequest.java => ArticleRequest.java} | 10 +- .../request/CommunityArticleRequest.java | 29 --- .../acceptance/AcceptanceTest.java | 3 +- .../acceptance/steps/StudyRelatedSteps.java | 7 +- .../CommunityArticleAcceptanceTest.java | 8 +- .../test/studyroom/NoticeAcceptanceTest.java | 6 +- ...unityArticleTest.java => ArticleTest.java} | 74 ++++-- .../domain/article/CommunityContentTest.java | 78 ------- .../domain/article/NoticeArticleTest.java | 29 +-- ...rviceTest.java => ArticleServiceTest.java} | 91 ++++---- .../service/CommunityArticleServiceTest.java | 212 ------------------ ...tingNoticeArticleControllerWebMvcTest.java | 20 +- ...tingNoticeArticleControllerWebMvcTest.java | 14 +- backend/src/test/resources/schema.sql | 28 --- 29 files changed, 306 insertions(+), 975 deletions(-) rename backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/{NoticeArticleController.java => ArticleController.java} (61%) delete mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/CommunityArticleController.java rename backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/{NoticeArticle.java => Article.java} (58%) delete mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticle.java delete mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityContent.java rename backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/{NoticeContent.java => Content.java} (78%) create mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/ArticleRepository.java delete mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/CommunityArticleRepository.java delete mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/NoticeArticleRepository.java rename backend/src/main/java/com/woowacourse/moamoa/studyroom/query/{CommunityArticleDao.java => ArticleDao.java} (55%) delete mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/query/NoticeArticleDao.java rename backend/src/main/java/com/woowacourse/moamoa/studyroom/service/{NoticeArticleService.java => ArticleService.java} (62%) delete mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleService.java rename backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/{NoticeArticleRequest.java => ArticleRequest.java} (65%) delete mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/CommunityArticleRequest.java rename backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/{CommunityArticleTest.java => ArticleTest.java} (52%) delete mode 100644 backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityContentTest.java rename backend/src/test/java/com/woowacourse/moamoa/studyroom/service/{NoticeArticleServiceTest.java => ArticleServiceTest.java} (70%) delete mode 100644 backend/src/test/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleServiceTest.java diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/NoticeArticleController.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/ArticleController.java similarity index 61% rename from backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/NoticeArticleController.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/ArticleController.java index 8850c7be2..3a73cb1fd 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/NoticeArticleController.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/ArticleController.java @@ -1,9 +1,10 @@ package com.woowacourse.moamoa.studyroom.controller; import com.woowacourse.moamoa.auth.config.AuthenticatedMemberId; -import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; -import com.woowacourse.moamoa.studyroom.service.NoticeArticleService; -import com.woowacourse.moamoa.studyroom.service.request.NoticeArticleRequest; +import com.woowacourse.moamoa.studyroom.domain.article.Article; +import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; +import com.woowacourse.moamoa.studyroom.service.ArticleService; +import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; import com.woowacourse.moamoa.studyroom.service.response.ArticleResponse; import com.woowacourse.moamoa.studyroom.service.response.ArticleSummariesResponse; import java.net.URI; @@ -22,47 +23,53 @@ import org.springframework.web.bind.annotation.RestController; @RestController -@RequestMapping("api/studies/{study-id}/notice/articles") -public class NoticeArticleController { +@RequestMapping("api/studies/{study-id}/{type}/articles") +public class ArticleController { - private final NoticeArticleService noticeArticleService; + private final ArticleService articleService; - public NoticeArticleController(final NoticeArticleService noticeArticleService) { - this.noticeArticleService = noticeArticleService; + public ArticleController(final ArticleService articleService) { + this.articleService = articleService; } @PostMapping public ResponseEntity createArticle(@AuthenticatedMemberId final Long id, @PathVariable("study-id") final Long studyId, - @Valid @RequestBody final NoticeArticleRequest request + @PathVariable("type") final String typeName, + @Valid @RequestBody final ArticleRequest request ) { - final NoticeArticle article = noticeArticleService.createArticle(id, studyId, request.createContent()); - final URI location = URI.create("/api/studies/" + studyId + "/notice/articles/" + article.getId()); + final ArticleType type = ArticleType.valueOf(typeName.toUpperCase()); + final Article article = articleService.createArticle(id, studyId, request.createContent(), type); + final URI location = URI.create("/api/studies/" + studyId + "/" + typeName + "/articles/" + article.getId()); return ResponseEntity.created(location).header("Access-Control-Allow-Headers", HttpHeaders.LOCATION).build(); } @GetMapping("/{article-id}") - public ResponseEntity getArticle(@PathVariable("study-id") final Long studyId, - @PathVariable("article-id") final Long articleId + public ResponseEntity getArticle(@PathVariable("article-id") final Long articleId, + @PathVariable("type") final String typeName ) { - ArticleResponse response = noticeArticleService.getArticle(articleId); + final ArticleType type = ArticleType.valueOf(typeName.toUpperCase()); + ArticleResponse response = articleService.getArticle(articleId, type); return ResponseEntity.ok().body(response); } - @DeleteMapping("{article-id}") + @DeleteMapping("/{article-id}") public ResponseEntity deleteArticle(@AuthenticatedMemberId final Long id, @PathVariable("study-id") final Long studyId, @PathVariable("article-id") final Long articleId ) { - noticeArticleService.deleteArticle(id, studyId, articleId); + articleService.deleteArticle(id, studyId, articleId); return ResponseEntity.noContent().build(); } @GetMapping - public ResponseEntity getArticles(@PathVariable("study-id") final Long studyId, - @PageableDefault final Pageable pageable + public ResponseEntity getArticles( + @PathVariable("study-id") final Long studyId, + @PathVariable("type") final String typeName, + @PageableDefault final Pageable pageable ) { - ArticleSummariesResponse response = noticeArticleService.getArticles(studyId, pageable); + final ArticleType type = ArticleType.valueOf(typeName.toUpperCase()); + ArticleSummariesResponse response = articleService.getArticles(studyId, pageable, type); return ResponseEntity.ok().body(response); } @@ -70,9 +77,9 @@ public ResponseEntity getArticles(@PathVariable("study public ResponseEntity updateArticle(@AuthenticatedMemberId final Long id, @PathVariable("study-id") final Long studyId, @PathVariable("article-id") final Long articleId, - @Valid @RequestBody final NoticeArticleRequest request + @Valid @RequestBody final ArticleRequest request ) { - noticeArticleService.updateArticle(id, studyId, articleId, request.createContent()); + articleService.updateArticle(id, studyId, articleId, request.createContent()); return ResponseEntity.noContent().build(); } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/CommunityArticleController.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/CommunityArticleController.java deleted file mode 100644 index 6efdc8560..000000000 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/CommunityArticleController.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.woowacourse.moamoa.studyroom.controller; - -import com.woowacourse.moamoa.auth.config.AuthenticatedMemberId; -import com.woowacourse.moamoa.studyroom.domain.article.CommunityArticle; -import com.woowacourse.moamoa.studyroom.service.CommunityArticleService; -import com.woowacourse.moamoa.studyroom.service.request.CommunityArticleRequest; -import com.woowacourse.moamoa.studyroom.service.response.ArticleResponse; -import com.woowacourse.moamoa.studyroom.service.response.ArticleSummariesResponse; -import java.net.URI; -import javax.validation.Valid; -import org.springframework.data.domain.Pageable; -import org.springframework.data.web.PageableDefault; -import org.springframework.http.HttpHeaders; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequestMapping("api/studies/{study-id}/community/articles") -public class CommunityArticleController { - - private final CommunityArticleService communityArticleService; - - public CommunityArticleController(final CommunityArticleService communityArticleService) { - this.communityArticleService = communityArticleService; - } - - @PostMapping - public ResponseEntity createArticle(@AuthenticatedMemberId final Long id, - @PathVariable("study-id") final Long studyId, - @Valid @RequestBody final CommunityArticleRequest request - ) { - final CommunityArticle article = communityArticleService.createArticle(id, studyId, request); - final URI location = URI.create("/api/studies/" + studyId + "/community/articles/" + article.getId()); - return ResponseEntity.created(location).header("Access-Control-Allow-Headers", HttpHeaders.LOCATION).build(); - } - - @GetMapping("/{article-id}") - public ResponseEntity getArticle(@PathVariable("article-id") final Long articleId) { - ArticleResponse response = communityArticleService.getArticle(articleId); - return ResponseEntity.ok().body(response); - } - - @DeleteMapping("/{article-id}") - public ResponseEntity deleteArticle(@AuthenticatedMemberId final Long id, - @PathVariable("study-id") final Long studyId, - @PathVariable("article-id") final Long articleId - ) { - communityArticleService.deleteArticle(id, studyId, articleId); - return ResponseEntity.noContent().build(); - } - - @GetMapping - public ResponseEntity getArticles( - @PathVariable("study-id") final Long studyId, @PageableDefault final Pageable pageable - ) { - ArticleSummariesResponse response = communityArticleService.getArticles(studyId, pageable); - return ResponseEntity.ok().body(response); - } - - @PutMapping("/{article-id}") - public ResponseEntity updateArticle(@AuthenticatedMemberId final Long id, - @PathVariable("study-id") final Long studyId, - @PathVariable("article-id") final Long articleId, - @Valid @RequestBody final CommunityArticleRequest request - ) { - communityArticleService.updateArticle(id, studyId, articleId, request); - return ResponseEntity.noContent().build(); - } -} diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticle.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java similarity index 58% rename from backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticle.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java index 0daca2706..f2aec0604 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticle.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java @@ -7,6 +7,8 @@ import javax.persistence.Column; import javax.persistence.Embedded; import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; @@ -14,16 +16,15 @@ import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table; -import javax.persistence.Transient; import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.hibernate.annotations.Where; @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) -@Table(name = "notice") +@Table(name = "article") @Where(clause = "deleted = false") -public class NoticeArticle extends BaseEntity { +public class Article extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -40,57 +41,72 @@ public class NoticeArticle extends BaseEntity { private boolean deleted; @Embedded - private NoticeContent content; + private Content content; - public static NoticeArticle create(final StudyRoom studyRoom, final Accessor accessor, final NoticeContent content) { - if (studyRoom.isOwner(accessor)) { - return new NoticeArticle(accessor.getMemberId(), studyRoom, content); + @Enumerated(EnumType.STRING) + private ArticleType type; + + public static Article create( + final StudyRoom studyRoom, final Accessor accessor, final Content content, final ArticleType type + ) { + if (type == ArticleType.COMMUNITY && studyRoom.isPermittedAccessor(accessor)) { + return new Article(null, studyRoom, accessor.getMemberId(), content, type); } - throw new UneditableArticleException(studyRoom.getId(), accessor, NoticeArticle.class); - } + if (type == ArticleType.NOTICE && studyRoom.isOwner(accessor)) { + return new Article(null, studyRoom, accessor.getMemberId(), content, type); + } - NoticeArticle(final Long authorId, final StudyRoom studyRoom, final NoticeContent content) { - this(null, authorId, studyRoom, content); + throw new UneditableArticleException(studyRoom.getId(), accessor, Article.class); } - private NoticeArticle(final Long id, final Long authorId, - final StudyRoom studyRoom, final NoticeContent content) { + private Article( + final Long id, final StudyRoom studyRoom, final Long authorId, final Content content, final ArticleType type + ) { this.id = id; - this.studyRoom = studyRoom; this.authorId = authorId; + this.studyRoom = studyRoom; this.content = content; + this.type = type; } - public final void delete(final Accessor accessor) { + public void update(final Accessor accessor, final Content content) { if (isUneditableAccessor(accessor)) { throw new UneditableArticleException(studyRoom.getId(), accessor, getClass()); } - deleted = true; + this.content = content; } - public void update(final Accessor accessor, final NoticeContent content) { + public final void delete(final Accessor accessor) { if (isUneditableAccessor(accessor)) { throw new UneditableArticleException(studyRoom.getId(), accessor, getClass()); } - this.content = content; + deleted = true; } - public Long getId() { - return id; - } + private boolean isUneditableAccessor(final Accessor accessor) { + if (type == ArticleType.COMMUNITY) { + return !studyRoom.isPermittedAccessor(accessor) || !authorId.equals(accessor.getMemberId()); + } - boolean isDeleted() { - return deleted; + if (type == ArticleType.NOTICE) { + return !studyRoom.isOwner(accessor); + } + + return false; } - protected boolean isUneditableAccessor(final Accessor accessor) { - return !studyRoom.isOwner(accessor); + public Long getId() { + return id; } - public NoticeContent getContent() { + public Content getContent() { return content; } + + boolean isDeleted() { + return deleted; + } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleType.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleType.java index c64c5497d..ffb47d443 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleType.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleType.java @@ -12,8 +12,13 @@ boolean isWritableAccessor(final StudyRoom studyRoom, final Accessor accessor) { } @Override - NoticeArticle createArticle(final StudyRoom studyRoom, final Accessor accessor, final NoticeContent content) { - return new NoticeArticle(accessor.getMemberId(), studyRoom, content); + boolean isEditableAccessor(final StudyRoom studyRoom, final Accessor accessor) { + throw new UnsupportedOperationException("#isEditableAccessor not implemented yet !!"); + } + + @Override + Article createArticle(final StudyRoom studyRoom, final Accessor accessor, final Content content) { + throw new UnsupportedOperationException("#isEditableAccessor not implemented yet !!"); } }, COMMUNITY{ @@ -23,12 +28,19 @@ boolean isWritableAccessor(final StudyRoom studyRoom, final Accessor accessor) { } @Override - NoticeArticle createArticle(final StudyRoom studyRoom, final Accessor accessor, final NoticeContent content) { + boolean isEditableAccessor(final StudyRoom studyRoom, final Accessor accessor) { + throw new UnsupportedOperationException("#isEditableAccessor not implemented yet !!"); + } + + @Override + Article createArticle(final StudyRoom studyRoom, final Accessor accessor, final Content content) { throw new UnsupportedOperationException("#createArticle not implemented yet !!"); } }; abstract boolean isWritableAccessor(final StudyRoom studyRoom, final Accessor accessor); - abstract NoticeArticle createArticle(final StudyRoom studyRoom, final Accessor accessor, final NoticeContent content); + abstract boolean isEditableAccessor(final StudyRoom studyRoom, final Accessor accessor); + + abstract Article createArticle(final StudyRoom studyRoom, final Accessor accessor, final Content content); } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticle.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticle.java deleted file mode 100644 index 8fc1b91f3..000000000 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticle.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.woowacourse.moamoa.studyroom.domain.article; - -import com.woowacourse.moamoa.common.entity.BaseEntity; -import com.woowacourse.moamoa.studyroom.domain.Accessor; -import com.woowacourse.moamoa.studyroom.domain.StudyRoom; -import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; -import javax.persistence.Column; -import javax.persistence.Embedded; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Table; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import org.hibernate.annotations.Where; - -@Entity -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@Table(name = "community") -@Where(clause = "deleted = false") -public class CommunityArticle extends BaseEntity { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @ManyToOne(fetch = FetchType.EAGER) - @JoinColumn(name = "study_id") - protected StudyRoom studyRoom; - - @Column(name = "author_id", nullable = false) - protected Long authorId; - - @Column(nullable = false) - private boolean deleted; - - - @Embedded - private CommunityContent content; - - public static CommunityArticle create(final StudyRoom studyRoom, final Accessor accessor, final CommunityContent content) { - if (!studyRoom.isPermittedAccessor(accessor)) { - throw new UneditableArticleException(studyRoom.getId(), accessor, CommunityArticle.class); - } - - return new CommunityArticle(studyRoom, accessor.getMemberId(), content); - } - - CommunityArticle(final StudyRoom studyRoom, final Long authorId, final CommunityContent content) { - this(null, authorId, studyRoom, content); - } - - private CommunityArticle(final Long id, final Long authorId, final StudyRoom studyRoom, - final CommunityContent content - ) { - this.id = id; - this.authorId = authorId; - this.studyRoom = studyRoom; - this.content = content; - } - - public void update(final Accessor accessor, final CommunityContent content) { - if (isUneditableAccessor(accessor)) { - throw new UneditableArticleException(studyRoom.getId(), accessor, getClass()); - } - - this.content = content; - } - - public final void delete(final Accessor accessor) { - if (isUneditableAccessor(accessor)) { - throw new UneditableArticleException(studyRoom.getId(), accessor, getClass()); - } - - deleted = true; - } - - public Long getId() { - return id; - } - - boolean isDeleted() { - return deleted; - } - - protected boolean isUneditableAccessor(final Accessor accessor) { - return !studyRoom.isPermittedAccessor(accessor) || !authorId.equals(accessor.getMemberId()); - } - - public CommunityContent getContent() { - return content; - } -} diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityContent.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityContent.java deleted file mode 100644 index 51896845f..000000000 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityContent.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.woowacourse.moamoa.studyroom.domain.article; - -import com.woowacourse.moamoa.studyroom.domain.Accessor; -import com.woowacourse.moamoa.studyroom.domain.StudyRoom; -import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; -import java.util.Objects; -import javax.persistence.Column; -import javax.persistence.Embeddable; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; - -@Embeddable -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public class CommunityContent { - - @Column(nullable = false) - private String title; - - @Column(nullable = false) - private String content; - - public CommunityContent(final String title, final String content) { - this.title = title; - this.content = content; - } - - public CommunityArticle createArticle(final StudyRoom studyRoom, final Accessor accessor) { - return CommunityArticle.create(studyRoom, accessor, this); - } - - public String getTitle() { - return title; - } - - public String getContent() { - return content; - } - - @Override - public boolean equals(final Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - final CommunityContent that = (CommunityContent) o; - return Objects.equals(title, that.title) && Objects.equals(content, that.content); - } - - @Override - public int hashCode() { - return Objects.hash(title, content); - } -} diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeContent.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Content.java similarity index 78% rename from backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeContent.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Content.java index 26a27973d..2fc17a431 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeContent.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Content.java @@ -1,7 +1,5 @@ package com.woowacourse.moamoa.studyroom.domain.article; -import com.woowacourse.moamoa.studyroom.domain.Accessor; -import com.woowacourse.moamoa.studyroom.domain.StudyRoom; import java.util.Objects; import javax.persistence.Column; import javax.persistence.Embeddable; @@ -10,7 +8,7 @@ @Embeddable @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class NoticeContent { +public class Content { @Column(nullable = false) private String title; @@ -18,7 +16,7 @@ public class NoticeContent { @Column(nullable = false) private String content; - public NoticeContent(final String title, final String content) { + public Content(final String title, final String content) { this.title = title; this.content = content; } @@ -39,7 +37,7 @@ public boolean equals(final Object o) { if (o == null || getClass() != o.getClass()) { return false; } - final NoticeContent that = (NoticeContent) o; + final Content that = (Content) o; return Objects.equals(title, that.title) && Objects.equals(content, that.content); } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkContent.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkContent.java index ae2eae3b8..0094f9b95 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkContent.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkContent.java @@ -1,8 +1,5 @@ package com.woowacourse.moamoa.studyroom.domain.article; -import com.woowacourse.moamoa.studyroom.domain.Accessor; -import com.woowacourse.moamoa.studyroom.domain.StudyRoom; -import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; import java.util.Objects; import javax.persistence.Column; import javax.persistence.Embeddable; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/ArticleRepository.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/ArticleRepository.java new file mode 100644 index 000000000..915784528 --- /dev/null +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/ArticleRepository.java @@ -0,0 +1,7 @@ +package com.woowacourse.moamoa.studyroom.domain.repository.article; + +import com.woowacourse.moamoa.studyroom.domain.article.Article; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ArticleRepository extends JpaRepository { +} diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/CommunityArticleRepository.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/CommunityArticleRepository.java deleted file mode 100644 index c2ccad9e1..000000000 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/CommunityArticleRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.woowacourse.moamoa.studyroom.domain.repository.article; - -import com.woowacourse.moamoa.studyroom.domain.article.CommunityArticle; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface CommunityArticleRepository extends JpaRepository { -} diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/NoticeArticleRepository.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/NoticeArticleRepository.java deleted file mode 100644 index a74fd76fc..000000000 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/NoticeArticleRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.woowacourse.moamoa.studyroom.domain.repository.article; - -import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface NoticeArticleRepository extends JpaRepository { -} diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/query/CommunityArticleDao.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/query/ArticleDao.java similarity index 55% rename from backend/src/main/java/com/woowacourse/moamoa/studyroom/query/CommunityArticleDao.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/query/ArticleDao.java index aa38f1934..23c666b56 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/query/CommunityArticleDao.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/query/ArticleDao.java @@ -1,6 +1,7 @@ package com.woowacourse.moamoa.studyroom.query; import com.woowacourse.moamoa.member.query.data.MemberData; +import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; import com.woowacourse.moamoa.studyroom.query.data.ArticleData; import java.time.LocalDate; import java.util.List; @@ -14,7 +15,7 @@ import org.springframework.stereotype.Repository; @Repository -public class CommunityArticleDao { +public class ArticleDao { public static final RowMapper ROW_MAPPER = (rs, rn) -> { final long id = rs.getLong("article_id"); @@ -34,49 +35,59 @@ public class CommunityArticleDao { private final NamedParameterJdbcTemplate namedParameterJdbcTemplate; - public CommunityArticleDao(final NamedParameterJdbcTemplate namedParameterJdbcTemplate) { + public ArticleDao(final NamedParameterJdbcTemplate namedParameterJdbcTemplate) { this.namedParameterJdbcTemplate = namedParameterJdbcTemplate; } - public Optional getById(final Long articleId) { - final String sql = "SELECT community.id as article_id, community.title as article_title, community.content as article_content, " - + "community.created_date as article_created_date, community.last_modified_date as article_last_modified_date, " + public Optional getById(final Long articleId, final ArticleType type) { + final String sql = "SELECT article.id as article_id, article.title as article_title, article.content as article_content, " + + "article.created_date as article_created_date, article.last_modified_date as article_last_modified_date, " + "member.id, member.username, member.image_url, member.profile_url " - + "FROM community JOIN member ON community.author_id = member.id " - + "WHERE community.id = :communityId and community.deleted = false "; + + "FROM article JOIN member ON article.author_id = member.id " + + "WHERE article.id = :articleId and article.deleted = false and article.type = :type "; - final Map params = Map.of("communityId", articleId); + final Map params = Map.of( + "articleId", articleId, + "type", type.name() + ); return namedParameterJdbcTemplate.query(sql, params, ROW_MAPPER).stream().findAny(); } - public Page getAllByStudyId(final Long studyId, final Pageable pageable) { - final List content = getContent(studyId, pageable); - final int totalCount = getTotalCount(studyId); + public Page getAllByStudyId(final Long studyId, final Pageable pageable, final ArticleType type) { + final List content = getContent(studyId, pageable, type); + final int totalCount = getTotalCount(studyId, type); return new PageImpl<>(content, pageable, totalCount); } - private List getContent(final Long studyId, final Pageable pageable) { - final String sql = "SELECT community.id as article_id, community.title as article_title, community.content as article_content, " - + "community.created_date as article_created_date, community.last_modified_date as article_last_modified_date, " + private List getContent(final Long studyId, final Pageable pageable, final ArticleType type) { + final String sql = "SELECT article.id as article_id, article.title as article_title, article.content as article_content, " + + "article.created_date as article_created_date, article.last_modified_date as article_last_modified_date, " + "member.id, member.username, member.image_url, member.profile_url " - + "FROM community JOIN member ON community.author_id = member.id " - + "WHERE community.study_id = :studyId and community.deleted = false " - + "ORDER BY created_date DESC, community.id DESC " + + "FROM article JOIN member ON article.author_id = member.id " + + "WHERE article.study_id = :studyId and article.deleted = false and article.type = :type " + + "ORDER BY created_date DESC, article.id DESC " + "LIMIT :size OFFSET :offset"; final Map params = Map.of( "studyId", studyId, "size", pageable.getPageSize(), - "offset", pageable.getOffset() + "offset", pageable.getOffset(), + "type", type.name() ); return namedParameterJdbcTemplate.query(sql, params, ROW_MAPPER); } - private Integer getTotalCount(final Long studyId) { - final String sql = "SELECT count(community.id) FROM community " - + "WHERE community.study_id = :studyId and community.deleted = false"; - final Map param = Map.of("studyId", studyId); - return namedParameterJdbcTemplate.queryForObject(sql, param, (rs, rn) -> rs.getInt(1)); + private Integer getTotalCount(final Long studyId, final ArticleType type) { + final String sql = "SELECT count(article.id) " + + "FROM article " + + "WHERE article.study_id = :studyId and article.deleted = false and article.type = :type "; + + final Map params = Map.of( + "studyId", studyId, + "type", type.name() + ); + + return namedParameterJdbcTemplate.queryForObject(sql, params, (rs, rn) -> rs.getInt(1)); } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/query/NoticeArticleDao.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/query/NoticeArticleDao.java deleted file mode 100644 index 323f41732..000000000 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/query/NoticeArticleDao.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.woowacourse.moamoa.studyroom.query; - -import com.woowacourse.moamoa.studyroom.query.data.ArticleData; -import com.woowacourse.moamoa.member.query.data.MemberData; -import java.time.LocalDate; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageImpl; -import org.springframework.data.domain.Pageable; -import org.springframework.jdbc.core.RowMapper; -import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; -import org.springframework.stereotype.Repository; - -@Repository -public class NoticeArticleDao { - - public static final RowMapper ROW_MAPPER = (rs, rn) -> { - final long id = rs.getLong("article_id"); - final String title = rs.getString("article_title"); - final String content = rs.getString("article_content"); - final LocalDate createdDate = rs.getObject("article_created_date", LocalDate.class); - final LocalDate lastModifiedDate = rs.getObject("article_last_modified_date", LocalDate.class); - - final long memberId = rs.getLong("member.id"); - final String username = rs.getString("member.username"); - final String imageUrl = rs.getString("member.image_url"); - final String profileUrl = rs.getString("member.profile_url"); - MemberData memberData = new MemberData(memberId, username, imageUrl, profileUrl); - - return new ArticleData(id, memberData, title, content, createdDate, lastModifiedDate); - }; - private final NamedParameterJdbcTemplate namedParameterJdbcTemplate; - - - public NoticeArticleDao(final NamedParameterJdbcTemplate namedParameterJdbcTemplate) { - this.namedParameterJdbcTemplate = namedParameterJdbcTemplate; - } - - public Optional getById(final Long articleId) { - final String sql = "SELECT notice.id as article_id, notice.title as article_title, notice.content as article_content, " - + "notice.created_date as article_created_date, notice.last_modified_date as article_last_modified_date, " - + "member.id, member.username, member.image_url, member.profile_url " - + "FROM notice JOIN member ON notice.author_id = member.id " - + "WHERE notice.id = :noticeId and notice.deleted = false"; - - final Map params = Map.of("noticeId", articleId); - return namedParameterJdbcTemplate.query(sql, params, ROW_MAPPER).stream().findAny(); - } - - public Page getAllByStudyId(final Long studyId, final Pageable pageable) { - final List content = getContent(studyId, pageable); - final int totalCount = getTotalCount(studyId); - return new PageImpl<>(content, pageable, totalCount); - } - - private List getContent(final Long studyId, final Pageable pageable) { - final String sql = "SELECT notice.id as article_id, notice.title as article_title, notice.content as article_content, " - + "notice.created_date as article_created_date, notice.last_modified_date as article_last_modified_date, " - + "member.id, member.username, member.image_url, member.profile_url " - + "FROM notice JOIN member ON notice.author_id = member.id " - + "WHERE notice.study_id = :studyId and notice.deleted = false " - + "ORDER BY created_date DESC, notice.id DESC " - + "LIMIT :size OFFSET :offset"; - - final Map params = Map.of( - "studyId", studyId, - "size", pageable.getPageSize(), - "offset", pageable.getOffset() - ); - - return namedParameterJdbcTemplate.query(sql, params, ROW_MAPPER); - } - - private Integer getTotalCount(final Long studyId) { - final String sql = "SELECT count(notice.id) FROM notice WHERE notice.study_id = :studyId and notice.deleted = false"; - final Map param = Map.of("studyId", studyId); - return namedParameterJdbcTemplate.queryForObject(sql, param, (rs, rn) -> rs.getInt(1)); - } -} diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ArticleService.java similarity index 62% rename from backend/src/main/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleService.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ArticleService.java index ff79eff47..53b25e21d 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ArticleService.java @@ -3,19 +3,19 @@ import com.woowacourse.moamoa.study.service.exception.StudyNotFoundException; import com.woowacourse.moamoa.studyroom.domain.Accessor; import com.woowacourse.moamoa.studyroom.domain.StudyRoom; -import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; -import com.woowacourse.moamoa.studyroom.domain.article.NoticeContent; +import com.woowacourse.moamoa.studyroom.domain.article.Article; +import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; +import com.woowacourse.moamoa.studyroom.domain.article.Content; import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; -import com.woowacourse.moamoa.studyroom.domain.repository.article.NoticeArticleRepository; +import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; -import com.woowacourse.moamoa.studyroom.query.NoticeArticleDao; +import com.woowacourse.moamoa.studyroom.query.ArticleDao; import com.woowacourse.moamoa.studyroom.query.data.ArticleData; import com.woowacourse.moamoa.studyroom.service.response.ArticleResponse; import com.woowacourse.moamoa.studyroom.service.response.ArticleSummariesResponse; import com.woowacourse.moamoa.studyroom.service.response.ArticleSummaryResponse; import java.util.List; import java.util.stream.Collectors; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; @@ -23,29 +23,28 @@ @Service @Transactional(readOnly = true) -public class NoticeArticleService { +public class ArticleService { private final StudyRoomRepository studyRoomRepository; - private final NoticeArticleRepository articleRepository; - private final NoticeArticleDao noticeArticleDao; + private final ArticleRepository articleRepository; + private final ArticleDao articleDao; - @Autowired - public NoticeArticleService(final StudyRoomRepository studyRoomRepository, - final NoticeArticleRepository articleRepository, - final NoticeArticleDao noticeArticleDao) { + public ArticleService(final StudyRoomRepository studyRoomRepository, + ArticleRepository articleRepository, + final ArticleDao articleDao) { this.studyRoomRepository = studyRoomRepository; this.articleRepository = articleRepository; - this.noticeArticleDao = noticeArticleDao; + this.articleDao = articleDao; } - public ArticleResponse getArticle(final Long articleId) { - final ArticleData data = noticeArticleDao.getById(articleId) - .orElseThrow(() -> new ArticleNotFoundException(articleId, NoticeArticle.class)); + public ArticleResponse getArticle(final Long articleId, final ArticleType type) { + final ArticleData data = articleDao.getById(articleId, type) + .orElseThrow(() -> new ArticleNotFoundException(articleId, Article.class)); return new ArticleResponse(data); } - public ArticleSummariesResponse getArticles(final Long studyId, final Pageable pageable) { - final Page page = noticeArticleDao.getAllByStudyId(studyId, pageable); + public ArticleSummariesResponse getArticles(final Long studyId, final Pageable pageable, final ArticleType type) { + final Page page = articleDao.getAllByStudyId(studyId, pageable, type); final List articles = page.getContent().stream() .map(ArticleSummaryResponse::new) @@ -56,31 +55,32 @@ public ArticleSummariesResponse getArticles(final Long studyId, final Pageable p } @Transactional - public NoticeArticle createArticle(final Long memberId, final Long studyId, final NoticeContent content) { + public Article createArticle( + final Long memberId, final Long studyId, final Content content, final ArticleType type + ) { final StudyRoom studyRoom = studyRoomRepository.findByStudyId(studyId) .orElseThrow(() -> new StudyNotFoundException(studyId)); - final NoticeArticle article = NoticeArticle.create(studyRoom, new Accessor(memberId, studyId), content); + final Article article = Article.create(studyRoom, new Accessor(memberId, studyId), content, type); return articleRepository.save(article); } @Transactional public void updateArticle( - final Long memberId, final Long studyId, final Long articleId, final NoticeContent newContent + final Long memberId, final Long studyId, final Long articleId, final Content newContent ) { - final NoticeArticle article = articleRepository.findById(articleId) - .orElseThrow(() -> new ArticleNotFoundException(articleId, NoticeArticle.class)); + final Article article = articleRepository.findById(articleId) + .orElseThrow(() -> new ArticleNotFoundException(articleId, Article.class)); article.update(new Accessor(memberId, studyId), newContent); } @Transactional public void deleteArticle(final Long memberId, final Long studyId, final Long articleId) { - final NoticeArticle article = articleRepository.findById(articleId) - .orElseThrow(() -> new ArticleNotFoundException(articleId, NoticeArticle.class)); + final Article article = articleRepository.findById(articleId) + .orElseThrow(() -> new ArticleNotFoundException(articleId, Article.class)); final Accessor accessor = new Accessor(memberId, studyId); article.delete(accessor); } - } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleService.java deleted file mode 100644 index f4ff1ec13..000000000 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleService.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.woowacourse.moamoa.studyroom.service; - -import com.woowacourse.moamoa.study.service.exception.StudyNotFoundException; -import com.woowacourse.moamoa.studyroom.domain.Accessor; -import com.woowacourse.moamoa.studyroom.domain.StudyRoom; -import com.woowacourse.moamoa.studyroom.domain.article.CommunityArticle; -import com.woowacourse.moamoa.studyroom.domain.article.CommunityContent; -import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; -import com.woowacourse.moamoa.studyroom.domain.repository.article.CommunityArticleRepository; -import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; -import com.woowacourse.moamoa.studyroom.query.CommunityArticleDao; -import com.woowacourse.moamoa.studyroom.query.data.ArticleData; -import com.woowacourse.moamoa.studyroom.service.request.CommunityArticleRequest; -import com.woowacourse.moamoa.studyroom.service.response.ArticleResponse; -import com.woowacourse.moamoa.studyroom.service.response.ArticleSummariesResponse; -import com.woowacourse.moamoa.studyroom.service.response.ArticleSummaryResponse; -import java.util.List; -import java.util.stream.Collectors; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -@Service -@Transactional(readOnly = true) -public class CommunityArticleService { - - private final StudyRoomRepository studyRoomRepository; - private final CommunityArticleRepository articleRepository; - private final CommunityArticleDao communityArticleDao; - - public CommunityArticleService(final StudyRoomRepository studyRoomRepository, CommunityArticleRepository articleRepository, - final CommunityArticleDao communityArticleDao) { - this.studyRoomRepository = studyRoomRepository; - this.articleRepository = articleRepository; - this.communityArticleDao = communityArticleDao; - } - - public ArticleResponse getArticle(final Long articleId) { - final ArticleData data = communityArticleDao.getById(articleId) - .orElseThrow(() -> new ArticleNotFoundException(articleId, CommunityArticle.class)); - return new ArticleResponse(data); - } - - public ArticleSummariesResponse getArticles(final Long studyId, final Pageable pageable) { - final Page page = communityArticleDao.getAllByStudyId(studyId, pageable); - - final List articles = page.getContent().stream() - .map(ArticleSummaryResponse::new) - .collect(Collectors.toList()); - - return new ArticleSummariesResponse(articles, page.getNumber(), page.getTotalPages() - 1, - page.getTotalElements()); - } - - @Transactional - public CommunityArticle createArticle(final Long memberId, final Long studyId, final CommunityArticleRequest articleRequest) { - final StudyRoom studyRoom = studyRoomRepository.findByStudyId(studyId) - .orElseThrow(StudyNotFoundException::new); - final CommunityContent content = articleRequest.createContent(); - final CommunityArticle article = content.createArticle(studyRoom, new Accessor(memberId, studyId)); - - return articleRepository.save(article); - } - - @Transactional - public void updateArticle( - final Long memberId, final Long studyId, final Long articleId, final CommunityArticleRequest articleRequest - ) { - final CommunityArticle article = articleRepository.findById(articleId) - .orElseThrow(() -> new ArticleNotFoundException(articleId, CommunityArticle.class)); - final CommunityContent newContent = articleRequest.createContent(); - - article.update(new Accessor(memberId, studyId), newContent); - } - - @Transactional - public void deleteArticle(final Long memberId, final Long studyId, final Long articleId) { - final CommunityArticle article = articleRepository.findById(articleId) - .orElseThrow(() -> new ArticleNotFoundException(articleId, CommunityArticle.class)); - final Accessor accessor = new Accessor(memberId, studyId); - - article.delete(accessor); - } -} diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/NoticeArticleRequest.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/ArticleRequest.java similarity index 65% rename from backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/NoticeArticleRequest.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/ArticleRequest.java index c4a026bf0..677b40d62 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/NoticeArticleRequest.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/ArticleRequest.java @@ -1,6 +1,6 @@ package com.woowacourse.moamoa.studyroom.service.request; -import com.woowacourse.moamoa.studyroom.domain.article.NoticeContent; +import com.woowacourse.moamoa.studyroom.domain.article.Content; import javax.validation.constraints.NotBlank; import lombok.Getter; import lombok.NoArgsConstructor; @@ -8,7 +8,7 @@ @Getter @NoArgsConstructor -public class NoticeArticleRequest { +public class ArticleRequest { @NotBlank(message = "내용을 입력해 주세요.") @Length(max = 30) @@ -18,12 +18,12 @@ public class NoticeArticleRequest { @Length(max = 5000) private String content; - public NoticeArticleRequest(final String title, final String content) { + public ArticleRequest(final String title, final String content) { this.title = title; this.content = content; } - public NoticeContent createContent() { - return new NoticeContent(title, content); + public Content createContent() { + return new Content(title, content); } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/CommunityArticleRequest.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/CommunityArticleRequest.java deleted file mode 100644 index b43688595..000000000 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/CommunityArticleRequest.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.woowacourse.moamoa.studyroom.service.request; - -import com.woowacourse.moamoa.studyroom.domain.article.CommunityContent; -import javax.validation.constraints.NotBlank; -import lombok.Getter; -import lombok.NoArgsConstructor; -import org.hibernate.validator.constraints.Length; - -@Getter -@NoArgsConstructor -public class CommunityArticleRequest { - - @NotBlank(message = "내용을 입력해 주세요.") - @Length(max = 30) - private String title; - - @NotBlank(message = "내용을 입력해 주세요.") - @Length(max = 5000) - private String content; - - public CommunityArticleRequest(final String title, final String content) { - this.title = title; - this.content = content; - } - - public CommunityContent createContent() { - return new CommunityContent(title, content); - } -} diff --git a/backend/src/test/java/com/woowacourse/acceptance/AcceptanceTest.java b/backend/src/test/java/com/woowacourse/acceptance/AcceptanceTest.java index e9800e538..f0ba43c79 100644 --- a/backend/src/test/java/com/woowacourse/acceptance/AcceptanceTest.java +++ b/backend/src/test/java/com/woowacourse/acceptance/AcceptanceTest.java @@ -96,14 +96,13 @@ void mockingGithubServer() { @AfterEach void tearDown() { jdbcTemplate.update("SET REFERENTIAL_INTEGRITY FALSE"); - jdbcTemplate.update("TRUNCATE TABLE notice"); - jdbcTemplate.update("TRUNCATE TABLE community"); jdbcTemplate.update("TRUNCATE TABLE member"); jdbcTemplate.update("TRUNCATE TABLE study_tag"); jdbcTemplate.update("TRUNCATE TABLE study_member"); jdbcTemplate.update("TRUNCATE TABLE review"); jdbcTemplate.update("TRUNCATE TABLE study"); jdbcTemplate.update("TRUNCATE TABLE link"); + jdbcTemplate.update("TRUNCATE TABLE article"); jdbcTemplate.update("SET REFERENTIAL_INTEGRITY TRUE"); jdbcTemplate.update("ALTER TABLE member AUTO_INCREMENT = 1"); jdbcTemplate.update("ALTER TABLE study AUTO_INCREMENT = 1"); diff --git a/backend/src/test/java/com/woowacourse/acceptance/steps/StudyRelatedSteps.java b/backend/src/test/java/com/woowacourse/acceptance/steps/StudyRelatedSteps.java index 61f58540f..a2a2e6cb6 100644 --- a/backend/src/test/java/com/woowacourse/acceptance/steps/StudyRelatedSteps.java +++ b/backend/src/test/java/com/woowacourse/acceptance/steps/StudyRelatedSteps.java @@ -5,9 +5,8 @@ import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; import com.woowacourse.moamoa.review.service.request.WriteReviewRequest; -import com.woowacourse.moamoa.studyroom.service.request.CommunityArticleRequest; +import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; import com.woowacourse.moamoa.studyroom.service.request.LinkArticleRequest; -import com.woowacourse.moamoa.studyroom.service.request.NoticeArticleRequest; import io.restassured.RestAssured; import org.junit.jupiter.api.Assertions; import org.springframework.http.HttpHeaders; @@ -75,7 +74,7 @@ public class StudyRelatedSteps extends Steps { final String location = RestAssured.given().log().all() .header(org.apache.http.HttpHeaders.AUTHORIZATION, token) .header(org.apache.http.HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) - .body(objectMapper.writeValueAsString(new NoticeArticleRequest(title, content))) + .body(objectMapper.writeValueAsString(new ArticleRequest(title, content))) .pathParam("study-id", studyId) .when().log().all() .post("/api/studies/{study-id}/notice/articles") @@ -94,7 +93,7 @@ public class StudyRelatedSteps extends Steps { final String location = RestAssured.given().log().all() .header(org.apache.http.HttpHeaders.AUTHORIZATION, token) .header(org.apache.http.HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) - .body(objectMapper.writeValueAsString(new CommunityArticleRequest(title, content))) + .body(objectMapper.writeValueAsString(new ArticleRequest(title, content))) .pathParam("study-id", studyId) .when().log().all() .post("/api/studies/{study-id}/community/articles") diff --git a/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/CommunityArticleAcceptanceTest.java b/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/CommunityArticleAcceptanceTest.java index 3af4a63b2..016a982e2 100644 --- a/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/CommunityArticleAcceptanceTest.java +++ b/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/CommunityArticleAcceptanceTest.java @@ -16,7 +16,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.woowacourse.acceptance.AcceptanceTest; -import com.woowacourse.moamoa.studyroom.service.request.CommunityArticleRequest; +import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; import com.woowacourse.moamoa.member.service.response.MemberResponse; import com.woowacourse.moamoa.studyroom.service.response.ArticleResponse; import com.woowacourse.moamoa.studyroom.service.response.ArticleSummariesResponse; @@ -40,7 +40,7 @@ void writeArticleToCommunity() throws Exception { // arrange long 스터디_ID = 그린론이().로그인하고().자바_스터디를().시작일자는(LocalDate.now()).생성한다(); String 토큰 = 그린론이().로그인한다(); - CommunityArticleRequest request = new CommunityArticleRequest("게시글 제목", "게시글 내용"); + ArticleRequest request = new ArticleRequest("게시글 제목", "게시글 내용"); // act final String location = RestAssured.given(spec).log().all() @@ -272,7 +272,7 @@ void updateArticleToCommunity() throws JsonProcessingException { long 게시글_ID = 그린론이().로그인하고().스터디에(스터디_ID).게시글을_작성한다("게시글 제목", "게시글 내용"); String 토큰 = 그린론이().로그인한다(); - final CommunityArticleRequest request = new CommunityArticleRequest("게시글 제목 수정", "게시글 내용 수정"); + final ArticleRequest request = new ArticleRequest("게시글 제목 수정", "게시글 내용 수정"); // act RestAssured.given(spec).log().all() @@ -314,7 +314,7 @@ void updateArticleToCommunity() throws JsonProcessingException { final MemberResponse 그린론_정보 = 그린론이().로그인하고().정보를_가져온다(); final AuthorResponse authorResponse = new AuthorResponse(그린론_정보.getId(), 그린론_정보.getUsername(), 그린론_정보.getImageUrl(), 그린론_정보.getProfileUrl()); - assertThat(response).isEqualTo(new ArticleResponse(스터디_ID, authorResponse, "게시글 제목 수정", + assertThat(response).isEqualTo(new ArticleResponse(게시글_ID, authorResponse, "게시글 제목 수정", "게시글 내용 수정", LocalDate.now(), LocalDate.now())); } } diff --git a/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/NoticeAcceptanceTest.java b/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/NoticeAcceptanceTest.java index 6bfcf0a20..936f080af 100644 --- a/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/NoticeAcceptanceTest.java +++ b/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/NoticeAcceptanceTest.java @@ -16,7 +16,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.woowacourse.acceptance.AcceptanceTest; -import com.woowacourse.moamoa.studyroom.service.request.CommunityArticleRequest; +import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; import com.woowacourse.moamoa.member.service.response.MemberResponse; import com.woowacourse.moamoa.studyroom.service.response.ArticleResponse; import com.woowacourse.moamoa.studyroom.service.response.ArticleSummariesResponse; @@ -40,7 +40,7 @@ void writeNotice() throws Exception { // arrange long 스터디_ID = 그린론이().로그인하고().자바_스터디를().시작일자는(LocalDate.now()).생성한다(); String 토큰 = 그린론이().로그인한다(); - CommunityArticleRequest request = new CommunityArticleRequest("공지사항 제목", "공지사항 내용"); + ArticleRequest request = new ArticleRequest("공지사항 제목", "공지사항 내용"); // act final String location = RestAssured.given(spec).log().all() @@ -269,7 +269,7 @@ void updateArticleToCommunity() throws JsonProcessingException { long 공지글_ID = 그린론이().로그인하고().스터디에(스터디_ID).공지사항을_작성한다("게시글 제목", "게시글 내용"); String 토큰 = 그린론이().로그인한다(); - final CommunityArticleRequest request = new CommunityArticleRequest("게시글 제목 수정", "게시글 내용 수정"); + final ArticleRequest request = new ArticleRequest("게시글 제목 수정", "게시글 내용 수정"); // act RestAssured.given(spec).log().all() diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticleTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleTest.java similarity index 52% rename from backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticleTest.java rename to backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleTest.java index 3a7dd65b4..a30e4e203 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticleTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleTest.java @@ -1,6 +1,8 @@ package com.woowacourse.moamoa.studyroom.domain.article; +import static com.woowacourse.moamoa.studyroom.domain.article.ArticleType.COMMUNITY; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatCode; import static org.assertj.core.api.Assertions.assertThatThrownBy; import com.woowacourse.moamoa.member.domain.Member; @@ -14,49 +16,76 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.CsvSource; import org.junit.jupiter.params.provider.MethodSource; -class CommunityArticleTest { +class ArticleTest { private static final long OWNER_ID = 1L; + private static final long PARTICIPANT_ID = 2L; private static final long STUDY_ID = 1L; + @ParameterizedTest + @DisplayName("스터디에 참여한 참가자는 커뮤니티 게시글을 작성할 수 있다.") + @MethodSource("providePermittedAccessor") + void writeCommunityArticleByParticipant(final Accessor permittedAccessor) { + // arrange + final Member owner = createMember(OWNER_ID); + final Member participant = createMember(PARTICIPANT_ID); + final StudyRoom studyRoom = createStudyRoom(owner, participant); + final Content sut = new Content("제목", "설명"); + + // act & assert + assertThatCode(() -> Article.create(studyRoom, permittedAccessor, sut, COMMUNITY)) + .doesNotThrowAnyException(); + } + + @ParameterizedTest + @DisplayName("스터디에 참여하지 않은 참가자는 커뮤니티 게시글을 작성할 수 없다.") + @MethodSource("provideForbiddenAccessor") + void cantWriteCommunityArticleByNonParticipants(final Accessor forbiddenAccessor) { + final Member owner = createMember(OWNER_ID); + final StudyRoom studyRoom = createStudyRoom(owner); + final Content sut = new Content("제목", "설명"); + + assertThatThrownBy(() -> Article.create(studyRoom, forbiddenAccessor, sut, COMMUNITY)) + .isInstanceOf(UneditableArticleException.class); + } + @DisplayName("스터디에 참여한 작성자만 커뮤니티 게시글을 수정할 수 있다.") @Test void update() { // arrange - final Member owner = createOwner(); + final Member owner = createMember(OWNER_ID); final StudyRoom studyRoom = createStudyRoom(owner); - final CommunityArticle sut = createCommunityArticle(owner, studyRoom); + final Article sut = createCommunityArticle(owner, studyRoom); final Accessor authorAccessor = new Accessor(owner.getId(), studyRoom.getId()); // act - sut.update(authorAccessor, new CommunityContent("수정된 제목", "수정된 내용")); + sut.update(authorAccessor, new Content("수정된 제목", "수정된 내용")); // assert - assertThat(sut.getContent()).isEqualTo(new CommunityContent("수정된 제목", "수정된 내용")); + assertThat(sut.getContent()).isEqualTo(new Content("수정된 제목", "수정된 내용")); } @ParameterizedTest @DisplayName("스터디에 참여한 작성자 외에는 커뮤니티 게시글을 수정할 수 없다.") @MethodSource("provideForbiddenAccessor") void updateByNotAuthor(final Accessor forbiddenAccessor) { - final Member owner = createOwner(); + final Member owner = createMember(OWNER_ID); final StudyRoom studyRoom = createStudyRoom(owner); - final CommunityArticle sut = createCommunityArticle(owner, studyRoom); + final Article sut = createCommunityArticle(owner, studyRoom); - assertThatThrownBy(() -> sut.update(forbiddenAccessor, new CommunityContent("수정된 제목", "수정된 내용"))) + assertThatThrownBy(() -> sut.update(forbiddenAccessor, new Content("수정된 제목", "수정된 내용"))) .isInstanceOf(UneditableArticleException.class); } @DisplayName("스터디에 참여한 작성자만 커뮤니티 게시글을 삭제할 수 있다.") @Test void delete() { - final Member owner = createOwner(); + final Member owner = createMember(OWNER_ID); final StudyRoom studyRoom = createStudyRoom(owner); - final CommunityArticle sut = createCommunityArticle(owner, studyRoom); + final Article sut = createCommunityArticle(owner, studyRoom); final Accessor authorAccessor = new Accessor(owner.getId(), studyRoom.getId()); @@ -69,16 +98,16 @@ void delete() { @DisplayName("스터디에 참여한 작성자 외에는 커뮤니티 게시글을 삭제할 수 없다.") @MethodSource("provideForbiddenAccessor") void deleteByNotAuthor(final Accessor forbiddenAccessor) { - final Member owner = createOwner(); + final Member owner = createMember(OWNER_ID); final StudyRoom studyRoom = createStudyRoom(owner); - final CommunityArticle sut = createCommunityArticle(owner, studyRoom); + final Article sut = createCommunityArticle(owner, studyRoom); assertThatThrownBy(() -> sut.delete(forbiddenAccessor)) .isInstanceOf(UneditableArticleException.class); } - private Member createOwner() { - return new Member(OWNER_ID, OWNER_ID, "owner", "image", "profile"); + private Member createMember(final long id) { + return new Member(id, id, "username" + id, "image", "profile"); } private StudyRoom createStudyRoom(Member owner, Member... participant) { @@ -88,14 +117,21 @@ private StudyRoom createStudyRoom(Member owner, Member... participant) { return new StudyRoom(STUDY_ID, owner.getId(), participants); } - private CommunityArticle createCommunityArticle(final Member owner, final StudyRoom studyRoom) { + private Article createCommunityArticle(final Member owner, final StudyRoom studyRoom) { final Accessor accessor = new Accessor(owner.getId(), studyRoom.getId()); - final CommunityContent communityContent = new CommunityContent("제목", "내용"); - return communityContent.createArticle(studyRoom, accessor); + final Content content = new Content("제목", "내용"); + return Article.create(studyRoom, accessor, content, COMMUNITY); + } + + private static Stream providePermittedAccessor() { + return Stream.of( + Arguments.of(new Accessor(OWNER_ID, STUDY_ID)), + Arguments.of(new Accessor(PARTICIPANT_ID, STUDY_ID)) + ); } private static Stream provideForbiddenAccessor() { - final long otherMemberId = OWNER_ID + 1; + final long otherMemberId = Math.max(OWNER_ID, PARTICIPANT_ID) + 1; final long otherStudyId = STUDY_ID + 1; return Stream.of( diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityContentTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityContentTest.java deleted file mode 100644 index 3ae32b45a..000000000 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityContentTest.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.woowacourse.moamoa.studyroom.domain.article; - -import static org.assertj.core.api.Assertions.assertThatCode; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -import com.woowacourse.moamoa.member.domain.Member; -import com.woowacourse.moamoa.studyroom.domain.Accessor; -import com.woowacourse.moamoa.studyroom.domain.StudyRoom; -import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; - -class CommunityContentTest { - - private static final long OWNER_ID = 1L; - private static final long PARTICIPANT_ID = 2L; - private static final long STUDY_ID = 1L; - - @ParameterizedTest - @DisplayName("스터디에 참여한 참가자는 커뮤니티 게시글을 작성할 수 있다.") - @MethodSource("providePermittedAccessorForCommunityArticle") - void writeCommunityArticleByParticipant(final Accessor permittedAccessor) { - // arrange - final Member owner = createMember(OWNER_ID); - final Member participant = createMember(PARTICIPANT_ID); - final StudyRoom studyRoom = createStudyRoom(owner, participant); - final CommunityContent sut = new CommunityContent("제목", "설명"); - - // act & assert - assertThatCode(() -> sut.createArticle(studyRoom, permittedAccessor)) - .doesNotThrowAnyException(); - } - - private static Stream providePermittedAccessorForCommunityArticle() { - return Stream.of( - Arguments.of(new Accessor(OWNER_ID, STUDY_ID)), - Arguments.of(new Accessor(PARTICIPANT_ID, STUDY_ID)) - ); - } - - @ParameterizedTest - @DisplayName("스터디에 참여하지 않은 참가자는 커뮤니티 게시글을 작성할 수 없다.") - @MethodSource("provideForbiddenAccessorForCommunityArticle") - void cantWriteCommunityArticleByNonParticipants(final Accessor forbiddenAccessor) { - final Member owner = createMember(OWNER_ID); - final StudyRoom studyRoom = createStudyRoom(owner); - final CommunityContent sut = new CommunityContent("제목", "설명"); - - assertThatThrownBy(() -> sut.createArticle(studyRoom, forbiddenAccessor)) - .isInstanceOf(UneditableArticleException.class); - } - - private static Stream provideForbiddenAccessorForCommunityArticle() { - final long otherMemberId = Math.max(OWNER_ID, PARTICIPANT_ID) + 1; - final long otherStudyId = STUDY_ID + 1; - - return Stream.of( - Arguments.of(new Accessor(otherMemberId, STUDY_ID)), // memberId가 잘못된 경우 - Arguments.of(new Accessor(OWNER_ID, otherStudyId)) // studyId가 잘못된 경우 - ); - } - - private StudyRoom createStudyRoom(Member owner, Member... participant) { - final Set participants = Stream.of(participant) - .map(Member::getId) - .collect(Collectors.toSet()); - return new StudyRoom(STUDY_ID, owner.getId(), participants); - } - - private Member createMember(final long id) { - return new Member(id, id, "username" + id, "image", "profile"); - } -} diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticleTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticleTest.java index 152e5138d..3d69bd853 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticleTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticleTest.java @@ -1,5 +1,6 @@ package com.woowacourse.moamoa.studyroom.domain.article; +import static com.woowacourse.moamoa.studyroom.domain.article.ArticleType.NOTICE; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatCode; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -30,10 +31,10 @@ void writeNoticeArticleByOwner() { // arrange final Member owner = createMember(OWNER_ID); final StudyRoom studyRoom = createStudyRoom(owner); - final NoticeContent sut = new NoticeContent("제목", "내용"); + final Content content = new Content("제목", "내용"); // act & assert - assertThatCode(() -> NoticeArticle.create(studyRoom, new Accessor(OWNER_ID, STUDY_ID), sut)) + assertThatCode(() -> Article.create(studyRoom, new Accessor(OWNER_ID, STUDY_ID), content, NOTICE)) .doesNotThrowAnyException(); } @@ -45,10 +46,10 @@ void cantWriteNoticeArticleByNonOwner(final Accessor accessor) { final Member owner = createMember(OWNER_ID); final Member participant = createMember(PARTICIPANT_ID); final StudyRoom studyRoom = createStudyRoom(owner, participant); - final NoticeContent sut = new NoticeContent("제목", "내용"); + final Content content = new Content("제목", "내용"); // act && assert - assertThatThrownBy(() -> NoticeArticle.create(studyRoom, accessor, sut)) + assertThatThrownBy(() -> Article.create(studyRoom, accessor, content, NOTICE)) .isInstanceOf(UneditableArticleException.class); } @@ -58,15 +59,15 @@ void update() { // arrange final Member owner = createMember(OWNER_ID); final StudyRoom studyRoom = createStudyRoom(owner); - final NoticeArticle sut = createNoticeArticle(owner, studyRoom); + final Article sut = createNoticeArticle(owner, studyRoom); final Accessor authorAccessor = new Accessor(owner.getId(), studyRoom.getId()); // act - sut.update(authorAccessor, new NoticeContent("수정된 제목", "수정된 내용")); + sut.update(authorAccessor, new Content("수정된 제목", "수정된 내용")); // assert - assertThat(sut.getContent()).isEqualTo(new NoticeContent("수정된 제목", "수정된 내용")); + assertThat(sut.getContent()).isEqualTo(new Content("수정된 제목", "수정된 내용")); } @ParameterizedTest @@ -76,9 +77,9 @@ void updateByNotAuthor(final Accessor forbiddenAccessor) { final Member owner = createMember(OWNER_ID); final Member participant = createMember(PARTICIPANT_ID); final StudyRoom studyRoom = createStudyRoom(owner, participant); - final NoticeArticle sut = createNoticeArticle(owner, studyRoom); + final Article sut = createNoticeArticle(owner, studyRoom); - assertThatThrownBy(() -> sut.update(forbiddenAccessor, new NoticeContent("수정된 제목", "수정된 설명"))) + assertThatThrownBy(() -> sut.update(forbiddenAccessor, new Content("수정된 제목", "수정된 설명"))) .isInstanceOf(UneditableArticleException.class); } @@ -87,7 +88,7 @@ void updateByNotAuthor(final Accessor forbiddenAccessor) { void delete() { final Member owner = createMember(OWNER_ID); final StudyRoom studyRoom = createStudyRoom(owner); - final NoticeArticle sut = createNoticeArticle(owner, studyRoom); + final Article sut = createNoticeArticle(owner, studyRoom); sut.delete(new Accessor(OWNER_ID, STUDY_ID)); @@ -101,7 +102,7 @@ void deleteByNotAuthor(final Accessor forbiddenAccessor) { final Member owner = createMember(OWNER_ID); final Member participant = createMember(PARTICIPANT_ID); final StudyRoom studyRoom = createStudyRoom(owner, participant); - final NoticeArticle sut = createNoticeArticle(owner, studyRoom); + final Article sut = createNoticeArticle(owner, studyRoom); assertThatThrownBy(() -> sut.delete(forbiddenAccessor)) .isInstanceOf(UneditableArticleException.class); @@ -129,9 +130,9 @@ private StudyRoom createStudyRoom(Member owner, Member... participant) { return new StudyRoom(STUDY_ID, owner.getId(), participants); } - private NoticeArticle createNoticeArticle(final Member owner, final StudyRoom studyRoom) { + private Article createNoticeArticle(final Member owner, final StudyRoom studyRoom) { final Accessor accessor = new Accessor(owner.getId(), studyRoom.getId()); - final NoticeContent noticeContent = new NoticeContent("제목", "내용"); - return NoticeArticle.create(studyRoom, accessor, noticeContent); + final Content content = new Content("제목", "내용"); + return Article.create(studyRoom, accessor, content, NOTICE); } } diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleServiceTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/ArticleServiceTest.java similarity index 70% rename from backend/src/test/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleServiceTest.java rename to backend/src/test/java/com/woowacourse/moamoa/studyroom/service/ArticleServiceTest.java index 13a6f4370..5693190e7 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/NoticeArticleServiceTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/ArticleServiceTest.java @@ -15,23 +15,25 @@ import com.woowacourse.moamoa.study.service.StudyService; import com.woowacourse.moamoa.study.service.exception.StudyNotFoundException; import com.woowacourse.moamoa.study.service.request.StudyRequest; -import com.woowacourse.moamoa.studyroom.domain.article.NoticeArticle; -import com.woowacourse.moamoa.studyroom.domain.article.NoticeContent; +import com.woowacourse.moamoa.studyroom.domain.article.Article; +import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; +import com.woowacourse.moamoa.studyroom.domain.article.Content; import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; -import com.woowacourse.moamoa.studyroom.domain.repository.article.NoticeArticleRepository; +import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepository; import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; -import com.woowacourse.moamoa.studyroom.query.NoticeArticleDao; -import com.woowacourse.moamoa.studyroom.service.request.NoticeArticleRequest; +import com.woowacourse.moamoa.studyroom.query.ArticleDao; import java.time.LocalDate; import javax.persistence.EntityManager; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; import org.springframework.beans.factory.annotation.Autowired; @RepositoryTest -class NoticeArticleServiceTest { +class ArticleServiceTest { @Autowired private MemberRepository memberRepository; @@ -46,56 +48,60 @@ class NoticeArticleServiceTest { private EntityManager entityManager; @Autowired - private NoticeArticleRepository articleRepository; + private ArticleRepository articleRepository; @Autowired - private NoticeArticleDao articleDao; + private ArticleDao articleDao; - private NoticeArticleService sut; + private ArticleService sut; @BeforeEach void setUp() { - sut = new NoticeArticleService(studyRoomRepository, articleRepository, articleDao); + sut = new ArticleService(studyRoomRepository, articleRepository, articleDao); } @DisplayName("게시글을 작성한다.") - @Test - void createArticle() { + @ParameterizedTest + @EnumSource(ArticleType.class) + void createArticle(ArticleType type) { // arrange final Member 짱구 = saveMember(짱구()); final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); - final NoticeContent noticeContent = new NoticeContent("제목", "설명"); + final Content content = new Content("제목", "설명"); // act - final NoticeArticle article = sut.createArticle(짱구.getId(), 자바_스터디.getId(), noticeContent); + final Article article = sut.createArticle(짱구.getId(), 자바_스터디.getId(), content, type); // assert - NoticeArticle actualArticle = articleRepository.findById(article.getId()) + Article actualArticle = articleRepository.findById(article.getId()) .orElseThrow(); - assertThat(actualArticle.getContent()).isEqualTo(noticeContent); + assertThat(actualArticle.getContent()).isEqualTo(content); } @DisplayName("스터디가 없는 경우 게시글 작성 시 예외가 발생한다.") - @Test - void throwExceptionWhenWriteToNotFoundStudy() { + @ParameterizedTest + @EnumSource(ArticleType.class) + void throwExceptionWhenWriteToNotFoundStudy(ArticleType type) { // arrange final Member 짱구 = saveMember(짱구()); - final NoticeContent noticeContent = new NoticeContent("제목", "설명"); + final Content content = new Content("제목", "설명"); // act & assert - assertThatThrownBy(() -> sut.createArticle(짱구.getId(), 1L, noticeContent)) + assertThatThrownBy(() -> sut.createArticle(짱구.getId(), 1L, content, type)) .isInstanceOf(StudyNotFoundException.class); } @DisplayName("스터디에 참여하지 않은 회원은 게시글을 작성할 수 없다.") - @Test - void createByNotParticipatedMember() { + @ParameterizedTest + @EnumSource(ArticleType.class) + void createByNotParticipatedMember(ArticleType type) { final Member 짱구 = saveMember(짱구()); final Member 디우 = saveMember(디우()); final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); - final NoticeContent noticeContent = new NoticeContent("제목", "설명"); - assertThatThrownBy(() -> sut.createArticle(디우.getId(), 자바_스터디.getId(), noticeContent)) + final Content content = new Content("제목", "설명"); + + assertThatThrownBy(() -> sut.createArticle(디우.getId(), 자바_스터디.getId(), content, type)) .isInstanceOf(UneditableArticleException.class); } @@ -105,17 +111,16 @@ void updateArticle() { // arrange final Member 짱구 = saveMember(짱구()); final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); - final NoticeContent noticeContent = new NoticeContent("제목", "설명"); - final NoticeArticle article = sut.createArticle(짱구.getId(), 자바_스터디.getId(), noticeContent); + final Article article = createArticle(짱구, 자바_스터디, new Content("제목", "설명")); - final NoticeContent newContent = new NoticeContent("제목 수정", "설명 수정"); + final Content newContent = new Content("제목 수정", "설명 수정"); // act sut.updateArticle(짱구.getId(), 자바_스터디.getId(), article.getId(), newContent); // assert - NoticeArticle actualArticle = articleRepository.findById(article.getId()).orElseThrow(); - assertThat(actualArticle.getContent()).isEqualTo(newContent); + Article actualArticle = articleRepository.findById(article.getId()).orElseThrow(); + assertThat(actualArticle.getContent()).isEqualTo(new Content("제목 수정", "설명 수정")); } @DisplayName("존재하지 않는 게시글을 수정할 수 없다.") @@ -123,9 +128,10 @@ void updateArticle() { void updateByInvalidLinkId() { final Member 짱구 = saveMember(짱구()); final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); - final NoticeContent noticeContent = new NoticeContent("제목", "수정"); - assertThatThrownBy(() -> sut.updateArticle(짱구.getId(), 자바_스터디.getId(), -1L, noticeContent)) + final Content content = new Content("제목", "수정"); + + assertThatThrownBy(() -> sut.updateArticle(짱구.getId(), 자바_스터디.getId(), -1L, content)) .isInstanceOf(ArticleNotFoundException.class); } @@ -136,11 +142,11 @@ void updateByNotParticipatedMember() { final Member 디우 = saveMember(디우()); final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); - final NoticeContent noticeContent = new NoticeContent("제목", "설명"); - final NoticeArticle 링크_게시글 = createArticle(짱구, 자바_스터디, noticeContent); + final Content content = new Content("제목", "설명"); + final Article 링크_게시글 = createArticle(짱구, 자바_스터디, content); assertThatThrownBy(() -> sut.updateArticle(디우.getId(), 자바_스터디.getId(), 링크_게시글.getId(), - noticeContent)) + content)) .isInstanceOf(UneditableArticleException.class); } @@ -150,8 +156,8 @@ void deleteArticle() { // arrange final Member 짱구 = saveMember(짱구()); final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); - final NoticeContent noticeContent = new NoticeContent("제목", "설명"); - final NoticeArticle 게시글 = createArticle(짱구, 자바_스터디, noticeContent); + final Content content = new Content("제목", "설명"); + final Article 게시글 = createArticle(짱구, 자바_스터디, content); //act sut.deleteArticle(짱구.getId(), 자바_스터디.getId(), 게시글.getId()); @@ -180,8 +186,9 @@ void deleteByNotParticipatedMember() { final Member 디우 = saveMember(디우()); final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); - final NoticeContent noticeContent = new NoticeContent("제목", "설명"); - final NoticeArticle 링크_게시글 = sut.createArticle(짱구.getId(), 자바_스터디.getId(), noticeContent); + final Content content = new Content("제목", "설명"); + final Article 링크_게시글 = sut.createArticle(짱구.getId(), 자바_스터디.getId(), content, ArticleType.COMMUNITY + ); assertThatThrownBy(() -> sut.deleteArticle(디우.getId(), 자바_스터디.getId(), 링크_게시글.getId())) .isInstanceOf(UneditableArticleException.class); @@ -202,9 +209,11 @@ private Study createStudy(final Member owner, StudyRequest studyRequest) { return study; } - private NoticeArticle createArticle(final Member author, final Study study, - final NoticeContent noticeContent) { - final NoticeArticle article = sut.createArticle(author.getId(), study.getId(), noticeContent); + private Article createArticle(final Member author, final Study study, + final Content content) { + final Article article = sut.createArticle(author.getId(), study.getId(), content, + ArticleType.COMMUNITY + ); entityManager.flush(); entityManager.clear(); return article; diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleServiceTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleServiceTest.java deleted file mode 100644 index 2f8e319c7..000000000 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/CommunityArticleServiceTest.java +++ /dev/null @@ -1,212 +0,0 @@ -package com.woowacourse.moamoa.studyroom.service; - -import static com.woowacourse.moamoa.fixtures.MemberFixtures.디우; -import static com.woowacourse.moamoa.fixtures.MemberFixtures.짱구; -import static com.woowacourse.moamoa.fixtures.StudyFixtures.자바_스터디_신청서; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -import com.woowacourse.moamoa.common.RepositoryTest; -import com.woowacourse.moamoa.common.utils.DateTimeSystem; -import com.woowacourse.moamoa.member.domain.Member; -import com.woowacourse.moamoa.member.domain.repository.MemberRepository; -import com.woowacourse.moamoa.study.domain.Study; -import com.woowacourse.moamoa.study.domain.repository.StudyRepository; -import com.woowacourse.moamoa.study.service.StudyService; -import com.woowacourse.moamoa.study.service.exception.StudyNotFoundException; -import com.woowacourse.moamoa.study.service.request.StudyRequest; -import com.woowacourse.moamoa.studyroom.domain.article.CommunityArticle; -import com.woowacourse.moamoa.studyroom.domain.article.CommunityContent; -import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; -import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; -import com.woowacourse.moamoa.studyroom.domain.repository.article.CommunityArticleRepository; -import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; -import com.woowacourse.moamoa.studyroom.query.CommunityArticleDao; -import com.woowacourse.moamoa.studyroom.service.request.CommunityArticleRequest; -import java.time.LocalDate; -import javax.persistence.EntityManager; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; - -@RepositoryTest -class CommunityArticleServiceTest { - - @Autowired - private MemberRepository memberRepository; - - @Autowired - private StudyRepository studyRepository; - - @Autowired - private StudyRoomRepository studyRoomRepository; - - @Autowired - private EntityManager entityManager; - - @Autowired - private CommunityArticleRepository articleRepository; - - @Autowired - private CommunityArticleDao articleDao; - - private CommunityArticleService sut; - - @BeforeEach - void setUp() { - sut = new CommunityArticleService(studyRoomRepository, articleRepository, articleDao); - } - - @DisplayName("게시글을 작성한다.") - @Test - void createArticle() { - // arrange - final Member 짱구 = saveMember(짱구()); - final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); - final CommunityArticleRequest articleRequest = new CommunityArticleRequest("제목", "설명"); - - // act - final CommunityArticle article = sut.createArticle(짱구.getId(), 자바_스터디.getId(), articleRequest); - - // assert - CommunityArticle actualArticle = articleRepository.findById(article.getId()) - .orElseThrow(); - assertThat(actualArticle.getContent()).isEqualTo(articleRequest.createContent()); - } - - @DisplayName("스터디가 없는 경우 게시글 작성 시 예외가 발생한다.") - @Test - void throwExceptionWhenWriteToNotFoundStudy() { - // arrange - final Member 짱구 = saveMember(짱구()); - final CommunityArticleRequest articleRequest = new CommunityArticleRequest("제목", "설명"); - - // act & assert - assertThatThrownBy(() -> sut.createArticle(짱구.getId(), 1L, articleRequest)) - .isInstanceOf(StudyNotFoundException.class); - } - - @DisplayName("스터디에 참여하지 않은 회원은 게시글을 작성할 수 없다.") - @Test - void createByNotParticipatedMember() { - final Member 짱구 = saveMember(짱구()); - final Member 디우 = saveMember(디우()); - final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); - - final CommunityArticleRequest articleRequest = new CommunityArticleRequest("제목", "설명"); - - assertThatThrownBy(() -> sut.createArticle(디우.getId(), 자바_스터디.getId(), articleRequest)) - .isInstanceOf(UneditableArticleException.class); - } - - @DisplayName("게시글을 수정한다.") - @Test - void updateArticle() { - // arrange - final Member 짱구 = saveMember(짱구()); - final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); - final CommunityArticle article = createArticle(짱구, 자바_스터디, new CommunityArticleRequest("제목", "설명")); - - final CommunityArticleRequest updatingArticleRequest = new CommunityArticleRequest("제목 수정", "설명 수정"); - - // act - sut.updateArticle(짱구.getId(), 자바_스터디.getId(), article.getId(), updatingArticleRequest); - - // assert - CommunityArticle actualArticle = articleRepository.findById(article.getId()).orElseThrow(); - assertThat(actualArticle.getContent()).isEqualTo(new CommunityContent("제목 수정", "설명 수정")); - } - - @DisplayName("존재하지 않는 게시글을 수정할 수 없다.") - @Test - void updateByInvalidLinkId() { - final Member 짱구 = saveMember(짱구()); - final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); - - final CommunityArticleRequest articleRequest = new CommunityArticleRequest("제목", "수정"); - - assertThatThrownBy(() -> sut.updateArticle(짱구.getId(), 자바_스터디.getId(), -1L, articleRequest)) - .isInstanceOf(ArticleNotFoundException.class); - } - - @DisplayName("스터디에 참여하지 않은 경우 게시글을 수정할 수 없다.") - @Test - void updateByNotParticipatedMember() { - final Member 짱구 = saveMember(짱구()); - final Member 디우 = saveMember(디우()); - final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); - - final CommunityArticleRequest articleRequest = new CommunityArticleRequest("제목", "설명"); - final CommunityArticle 링크_게시글 = createArticle(짱구, 자바_스터디, articleRequest); - - assertThatThrownBy(() -> sut.updateArticle(디우.getId(), 자바_스터디.getId(), 링크_게시글.getId(), articleRequest)) - .isInstanceOf(UneditableArticleException.class); - } - - @DisplayName("게시글을 삭제한다.") - @Test - void deleteArticle() { - // arrange - final Member 짱구 = saveMember(짱구()); - final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); - final CommunityArticleRequest articleRequest = new CommunityArticleRequest("제목", "설명"); - final CommunityArticle 게시글 = createArticle(짱구, 자바_스터디, articleRequest); - - //act - sut.deleteArticle(짱구.getId(), 자바_스터디.getId(), 게시글.getId()); - - //assert - entityManager.flush(); - entityManager.clear(); - - assertThat(articleRepository.findById(게시글.getId())).isEmpty(); - } - - @DisplayName("존재하지 않는 게시글을 삭제할 수 없다.") - @Test - void deleteByInvalidLinkId() { - final Member 짱구 = saveMember(짱구()); - final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); - - assertThatThrownBy(() -> sut.deleteArticle(짱구.getId(), 자바_스터디.getId(), -1L)) - .isInstanceOf(ArticleNotFoundException.class); - } - - @DisplayName("스터디에 참여하지 않은 경우 게시글을 삭제할 수 없다.") - @Test - void deleteByNotParticipatedMember() { - final Member 짱구 = saveMember(짱구()); - final Member 디우 = saveMember(디우()); - final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); - - final CommunityArticleRequest articleRequest = new CommunityArticleRequest("제목", "설명"); - final CommunityArticle 링크_게시글 = sut.createArticle(짱구.getId(), 자바_스터디.getId(), articleRequest); - - assertThatThrownBy(() -> sut.deleteArticle(디우.getId(), 자바_스터디.getId(), 링크_게시글.getId())) - .isInstanceOf(UneditableArticleException.class); - } - - private Member saveMember(final Member member) { - final Member savedMember = memberRepository.save(member); - entityManager.flush(); - entityManager.clear(); - return savedMember; - } - - private Study createStudy(final Member owner, StudyRequest studyRequest) { - final StudyService studyService = new StudyService(studyRepository, memberRepository, new DateTimeSystem()); - final Study study = studyService.createStudy(owner.getId(), studyRequest); - entityManager.flush(); - entityManager.clear(); - return study; - } - - private CommunityArticle createArticle(final Member author, final Study study, - final CommunityArticleRequest articleRequest) { - final CommunityArticle article = sut.createArticle(author.getId(), study.getId(), articleRequest); - entityManager.flush(); - entityManager.clear(); - return article; - } -} diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/CreatingNoticeArticleControllerWebMvcTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/CreatingNoticeArticleControllerWebMvcTest.java index 1986b9779..f240219ff 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/CreatingNoticeArticleControllerWebMvcTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/CreatingNoticeArticleControllerWebMvcTest.java @@ -1,27 +1,21 @@ package com.woowacourse.moamoa.studyroom.webmvc; -import static org.mockito.ArgumentMatchers.any; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import com.woowacourse.moamoa.WebMVCTest; -import com.woowacourse.moamoa.studyroom.service.NoticeArticleService; -import com.woowacourse.moamoa.studyroom.service.request.CommunityArticleRequest; +import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.NullAndEmptySource; import org.junit.jupiter.params.provider.ValueSource; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; class CreatingNoticeArticleControllerWebMvcTest extends WebMVCTest { - @MockBean - private NoticeArticleService noticeArticleService; - @DisplayName("잘못된 토큰으로 커뮤니티 글을 생성할 경우 401을 반환한다.") @ParameterizedTest @ValueSource(strings = {"", "Bearer InvalidToken", "Invalid"}) @@ -57,7 +51,7 @@ void badRequestByNullOrEmptyTitle(String title) throws Exception { post("/api/studies/{study-id}/community/articles", "1") .header(HttpHeaders.AUTHORIZATION, token) .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(new CommunityArticleRequest(title, "content"))) + .content(objectMapper.writeValueAsString(new ArticleRequest(title, "content"))) ) .andExpect(status().isBadRequest()) .andDo(print()); @@ -73,7 +67,7 @@ void badRequestByNullOrEmptyContent(String content) throws Exception { post("/api/studies/{study-id}/community/articles", "1") .header(HttpHeaders.AUTHORIZATION, token) .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(new CommunityArticleRequest("title", content))) + .content(objectMapper.writeValueAsString(new ArticleRequest("title", content))) ) .andExpect(status().isBadRequest()) .andDo(print()); @@ -89,7 +83,7 @@ void badRequestByBlankTitle(String title) throws Exception { post("/api/studies/{study-id}/community/articles", "1") .header(HttpHeaders.AUTHORIZATION, token) .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(new CommunityArticleRequest(title, "content"))) + .content(objectMapper.writeValueAsString(new ArticleRequest(title, "content"))) ) .andExpect(status().isBadRequest()) .andDo(print()); @@ -105,7 +99,7 @@ void badRequestByBlankContent(String content) throws Exception { post("/api/studies/{study-id}/community/articles", "1") .header(HttpHeaders.AUTHORIZATION, token) .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(new CommunityArticleRequest("title", content))) + .content(objectMapper.writeValueAsString(new ArticleRequest("title", content))) ) .andExpect(status().isBadRequest()) .andDo(print()); @@ -120,7 +114,7 @@ void badRequestByInvalidLengthTitle() throws Exception { post("/api/studies/{study-id}/community/articles", "1") .header(HttpHeaders.AUTHORIZATION, token) .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(new CommunityArticleRequest("a".repeat(31), "cotent"))) + .content(objectMapper.writeValueAsString(new ArticleRequest("a".repeat(31), "cotent"))) ) .andExpect(status().isBadRequest()) .andDo(print()); @@ -135,7 +129,7 @@ void badRequestByInvalidLengthContent() throws Exception { post("/api/studies/{study-id}/community/articles", "1") .header(HttpHeaders.AUTHORIZATION, token) .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(new CommunityArticleRequest("a".repeat(5001), "cotent"))) + .content(objectMapper.writeValueAsString(new ArticleRequest("a".repeat(5001), "cotent"))) ) .andExpect(status().isBadRequest()) .andDo(print()); diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/UpdatingNoticeArticleControllerWebMvcTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/UpdatingNoticeArticleControllerWebMvcTest.java index 3d4d2b7f0..b1b6b18e1 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/UpdatingNoticeArticleControllerWebMvcTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/UpdatingNoticeArticleControllerWebMvcTest.java @@ -5,7 +5,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import com.woowacourse.moamoa.WebMVCTest; -import com.woowacourse.moamoa.studyroom.service.request.CommunityArticleRequest; +import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -53,7 +53,7 @@ void badRequestByNullOrEmptyTitle(String title) throws Exception { put("/api/studies/{study-id}/community/articles/{article-id}", "1", "1") .header(HttpHeaders.AUTHORIZATION, token) .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(new CommunityArticleRequest(title, "content"))) + .content(objectMapper.writeValueAsString(new ArticleRequest(title, "content"))) ) .andExpect(status().isBadRequest()) .andDo(print()); @@ -69,7 +69,7 @@ void badRequestByNullOrEmptyContent(String content) throws Exception { put("/api/studies/{study-id}/community/articles/{article-id}", "1", "1") .header(HttpHeaders.AUTHORIZATION, token) .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(new CommunityArticleRequest("title", content))) + .content(objectMapper.writeValueAsString(new ArticleRequest("title", content))) ) .andExpect(status().isBadRequest()) .andDo(print()); @@ -85,7 +85,7 @@ void badRequestByBlankTitle(String title) throws Exception { put("/api/studies/{study-id}/community/articles/{article-id}", "1", "1") .header(HttpHeaders.AUTHORIZATION, token) .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(new CommunityArticleRequest(title, "content"))) + .content(objectMapper.writeValueAsString(new ArticleRequest(title, "content"))) ) .andExpect(status().isBadRequest()) .andDo(print()); @@ -101,7 +101,7 @@ void badRequestByBlankContent(String content) throws Exception { put("/api/studies/{study-id}/community/articles/{article-id}", "1", "1") .header(HttpHeaders.AUTHORIZATION, token) .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(new CommunityArticleRequest("title", content))) + .content(objectMapper.writeValueAsString(new ArticleRequest("title", content))) ) .andExpect(status().isBadRequest()) .andDo(print()); @@ -116,7 +116,7 @@ void badRequestByInvalidLengthTitle() throws Exception { put("/api/studies/{study-id}/community/articles/{article-id}", "1", "1") .header(HttpHeaders.AUTHORIZATION, token) .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(new CommunityArticleRequest("a".repeat(31), "cotent"))) + .content(objectMapper.writeValueAsString(new ArticleRequest("a".repeat(31), "cotent"))) ) .andExpect(status().isBadRequest()) .andDo(print()); @@ -131,7 +131,7 @@ void badRequestByInvalidLengthContent() throws Exception { put("/api/studies/{study-id}/community/articles/{article-id}", "1", "1") .header(HttpHeaders.AUTHORIZATION, token) .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(new CommunityArticleRequest("a".repeat(5001), "cotent"))) + .content(objectMapper.writeValueAsString(new ArticleRequest("a".repeat(5001), "cotent"))) ) .andExpect(status().isBadRequest()) .andDo(print()); diff --git a/backend/src/test/resources/schema.sql b/backend/src/test/resources/schema.sql index 02e55b71f..58a9939c6 100644 --- a/backend/src/test/resources/schema.sql +++ b/backend/src/test/resources/schema.sql @@ -98,34 +98,6 @@ CREATE TABLE study_member FOREIGN KEY (member_id) REFERENCES member (id) ); -CREATE TABLE community -( - id BIGINT PRIMARY KEY AUTO_INCREMENT, - title VARCHAR(255) NOT NULL, - content MEDIUMTEXT NOT NULL, - author_id BIGINT, - study_id BIGINT, - created_date DATETIME not null, - last_modified_date DATETIME not null, - deleted boolean NOT NULL, - FOREIGN KEY (author_id) REFERENCES member (id), - FOREIGN KEY (study_id) REFERENCES study (id) -); - -CREATE TABLE notice -( - id BIGINT PRIMARY KEY AUTO_INCREMENT, - title VARCHAR(255) NOT NULL, - content MEDIUMTEXT NOT NULL, - author_id BIGINT, - study_id BIGINT, - created_date DATETIME not null, - last_modified_date DATETIME not null, - deleted boolean NOT NULL, - FOREIGN KEY (author_id) REFERENCES member (id), - FOREIGN KEY (study_id) REFERENCES study (id) -); - CREATE TABLE article ( id BIGINT PRIMARY KEY AUTO_INCREMENT, From 3f4e9f5fab653a73a35ae21f02ce4a7082ea5d86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=A7=84=ED=98=81?= Date: Tue, 4 Oct 2022 16:44:35 +0900 Subject: [PATCH 37/40] =?UTF-8?q?refactor:=20ArticleType=20Enum=20?= =?UTF-8?q?=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../studyroom/domain/article/Article.java | 26 +++------------ .../studyroom/domain/article/ArticleType.java | 32 ++++++------------- 2 files changed, 15 insertions(+), 43 deletions(-) diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java index f2aec0604..2d38d1629 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java @@ -49,15 +49,11 @@ public class Article extends BaseEntity { public static Article create( final StudyRoom studyRoom, final Accessor accessor, final Content content, final ArticleType type ) { - if (type == ArticleType.COMMUNITY && studyRoom.isPermittedAccessor(accessor)) { - return new Article(null, studyRoom, accessor.getMemberId(), content, type); + if (type.isUnwritableAccessor(studyRoom, accessor)) { + throw new UneditableArticleException(studyRoom.getId(), accessor, Article.class); } - if (type == ArticleType.NOTICE && studyRoom.isOwner(accessor)) { - return new Article(null, studyRoom, accessor.getMemberId(), content, type); - } - - throw new UneditableArticleException(studyRoom.getId(), accessor, Article.class); + return new Article(null, studyRoom, accessor.getMemberId(), content, type); } private Article( @@ -71,7 +67,7 @@ private Article( } public void update(final Accessor accessor, final Content content) { - if (isUneditableAccessor(accessor)) { + if (type.isUneditableAccessor(studyRoom, authorId, accessor)) { throw new UneditableArticleException(studyRoom.getId(), accessor, getClass()); } @@ -79,25 +75,13 @@ public void update(final Accessor accessor, final Content content) { } public final void delete(final Accessor accessor) { - if (isUneditableAccessor(accessor)) { + if (type.isUneditableAccessor(studyRoom, authorId, accessor)) { throw new UneditableArticleException(studyRoom.getId(), accessor, getClass()); } deleted = true; } - private boolean isUneditableAccessor(final Accessor accessor) { - if (type == ArticleType.COMMUNITY) { - return !studyRoom.isPermittedAccessor(accessor) || !authorId.equals(accessor.getMemberId()); - } - - if (type == ArticleType.NOTICE) { - return !studyRoom.isOwner(accessor); - } - - return false; - } - public Long getId() { return id; } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleType.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleType.java index ffb47d443..38d0b1a39 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleType.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleType.java @@ -7,40 +7,28 @@ public enum ArticleType { NOTICE{ @Override - boolean isWritableAccessor(final StudyRoom studyRoom, final Accessor accessor) { - return studyRoom.isOwner(accessor); + boolean isUnwritableAccessor(final StudyRoom studyRoom, final Accessor accessor) { + return !studyRoom.isOwner(accessor); } @Override - boolean isEditableAccessor(final StudyRoom studyRoom, final Accessor accessor) { - throw new UnsupportedOperationException("#isEditableAccessor not implemented yet !!"); - } - - @Override - Article createArticle(final StudyRoom studyRoom, final Accessor accessor, final Content content) { - throw new UnsupportedOperationException("#isEditableAccessor not implemented yet !!"); + boolean isUneditableAccessor(final StudyRoom studyRoom, final Long authorId, final Accessor accessor) { + return !studyRoom.isOwner(accessor); } }, COMMUNITY{ @Override - boolean isWritableAccessor(final StudyRoom studyRoom, final Accessor accessor) { - throw new UnsupportedOperationException("#isWritableAccessor not implemented yet !!"); + boolean isUnwritableAccessor(final StudyRoom studyRoom, final Accessor accessor) { + return !studyRoom.isPermittedAccessor(accessor); } @Override - boolean isEditableAccessor(final StudyRoom studyRoom, final Accessor accessor) { - throw new UnsupportedOperationException("#isEditableAccessor not implemented yet !!"); - } - - @Override - Article createArticle(final StudyRoom studyRoom, final Accessor accessor, final Content content) { - throw new UnsupportedOperationException("#createArticle not implemented yet !!"); + boolean isUneditableAccessor(final StudyRoom studyRoom, final Long authorId, final Accessor accessor) { + return !(studyRoom.isPermittedAccessor(accessor) && authorId.equals(accessor.getMemberId())); } }; - abstract boolean isWritableAccessor(final StudyRoom studyRoom, final Accessor accessor); - - abstract boolean isEditableAccessor(final StudyRoom studyRoom, final Accessor accessor); + abstract boolean isUnwritableAccessor(final StudyRoom studyRoom, final Accessor accessor); - abstract Article createArticle(final StudyRoom studyRoom, final Accessor accessor, final Content content); + abstract boolean isUneditableAccessor(final StudyRoom studyRoom, final Long authorId, final Accessor accessor); } From ee2e85066f0bb56ce66d5a2507385f234cfbc066 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=A7=84=ED=98=81?= Date: Tue, 4 Oct 2022 16:49:37 +0900 Subject: [PATCH 38/40] =?UTF-8?q?refactor:=20=EB=8F=84=EB=A9=94=EC=9D=B8?= =?UTF-8?q?=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../moamoa/studyroom/domain/article/Article.java | 2 +- .../moamoa/studyroom/domain/article/ArticleType.java | 2 +- .../repository}/ArticleRepository.java | 2 +- .../domain/{article => link}/LinkArticle.java | 4 ++-- .../domain/{article => link}/LinkContent.java | 2 +- .../repository}/LinkArticleRepository.java | 4 ++-- .../repository/studyroom/StudyRoomRepository.java | 9 --------- .../domain/{ => studyroom}/PermittedParticipants.java | 2 +- .../studyroom/domain/{ => studyroom}/StudyRoom.java | 6 ++---- .../repository}/JpaStudyRoomRepository.java | 4 ++-- .../studyroom/repository/StudyRoomRepository.java | 9 +++++++++ .../moamoa/studyroom/service/ArticleService.java | 6 +++--- .../moamoa/studyroom/service/LinkArticleService.java | 10 +++++----- .../studyroom/service/request/LinkArticleRequest.java | 2 +- .../moamoa/studyroom/domain/article/ArticleTest.java | 2 +- .../studyroom/domain/article/NoticeArticleTest.java | 2 +- .../domain/{article => link}/LinkArticleTest.java | 4 ++-- .../moamoa/studyroom/service/ArticleServiceTest.java | 4 ++-- .../studyroom/service/LinkArticleServiceTest.java | 9 ++++----- 19 files changed, 41 insertions(+), 44 deletions(-) rename backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/{repository/article => article/repository}/ArticleRepository.java (75%) rename backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/{article => link}/LinkArticle.java (95%) rename backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/{article => link}/LinkContent.java (94%) rename backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/{repository/article => link/repository}/LinkArticleRepository.java (52%) delete mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/studyroom/StudyRoomRepository.java rename backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/{ => studyroom}/PermittedParticipants.java (96%) rename backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/{ => studyroom}/StudyRoom.java (85%) rename backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/{repository/studyroom => studyroom/repository}/JpaStudyRoomRepository.java (53%) create mode 100644 backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/studyroom/repository/StudyRoomRepository.java rename backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/{article => link}/LinkArticleTest.java (97%) diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java index 2d38d1629..32fd0a884 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java @@ -2,7 +2,7 @@ import com.woowacourse.moamoa.common.entity.BaseEntity; import com.woowacourse.moamoa.studyroom.domain.Accessor; -import com.woowacourse.moamoa.studyroom.domain.StudyRoom; +import com.woowacourse.moamoa.studyroom.domain.studyroom.StudyRoom; import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; import javax.persistence.Column; import javax.persistence.Embedded; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleType.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleType.java index 38d0b1a39..44d935d64 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleType.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleType.java @@ -1,7 +1,7 @@ package com.woowacourse.moamoa.studyroom.domain.article; import com.woowacourse.moamoa.studyroom.domain.Accessor; -import com.woowacourse.moamoa.studyroom.domain.StudyRoom; +import com.woowacourse.moamoa.studyroom.domain.studyroom.StudyRoom; public enum ArticleType { diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/ArticleRepository.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/repository/ArticleRepository.java similarity index 75% rename from backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/ArticleRepository.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/repository/ArticleRepository.java index 915784528..634456b60 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/ArticleRepository.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/repository/ArticleRepository.java @@ -1,4 +1,4 @@ -package com.woowacourse.moamoa.studyroom.domain.repository.article; +package com.woowacourse.moamoa.studyroom.domain.article.repository; import com.woowacourse.moamoa.studyroom.domain.article.Article; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticle.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/link/LinkArticle.java similarity index 95% rename from backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticle.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/link/LinkArticle.java index e50705312..7eb6f7dc0 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticle.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/link/LinkArticle.java @@ -1,8 +1,8 @@ -package com.woowacourse.moamoa.studyroom.domain.article; +package com.woowacourse.moamoa.studyroom.domain.link; import com.woowacourse.moamoa.common.entity.BaseEntity; import com.woowacourse.moamoa.studyroom.domain.Accessor; -import com.woowacourse.moamoa.studyroom.domain.StudyRoom; +import com.woowacourse.moamoa.studyroom.domain.studyroom.StudyRoom; import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; import javax.persistence.Column; import javax.persistence.Embedded; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkContent.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/link/LinkContent.java similarity index 94% rename from backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkContent.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/link/LinkContent.java index 0094f9b95..6b3a2e2b5 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/LinkContent.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/link/LinkContent.java @@ -1,4 +1,4 @@ -package com.woowacourse.moamoa.studyroom.domain.article; +package com.woowacourse.moamoa.studyroom.domain.link; import java.util.Objects; import javax.persistence.Column; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/LinkArticleRepository.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/link/repository/LinkArticleRepository.java similarity index 52% rename from backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/LinkArticleRepository.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/link/repository/LinkArticleRepository.java index 135848849..aa7249c5e 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/article/LinkArticleRepository.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/link/repository/LinkArticleRepository.java @@ -1,6 +1,6 @@ -package com.woowacourse.moamoa.studyroom.domain.repository.article; +package com.woowacourse.moamoa.studyroom.domain.link.repository; -import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; +import com.woowacourse.moamoa.studyroom.domain.link.LinkArticle; import org.springframework.data.jpa.repository.JpaRepository; public interface LinkArticleRepository extends JpaRepository { diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/studyroom/StudyRoomRepository.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/studyroom/StudyRoomRepository.java deleted file mode 100644 index b9901962b..000000000 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/studyroom/StudyRoomRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.woowacourse.moamoa.studyroom.domain.repository.studyroom; - -import com.woowacourse.moamoa.studyroom.domain.StudyRoom; -import java.util.Optional; - -public interface StudyRoomRepository { - - Optional findByStudyId(Long studyId); -} diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/PermittedParticipants.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/studyroom/PermittedParticipants.java similarity index 96% rename from backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/PermittedParticipants.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/studyroom/PermittedParticipants.java index f928c1703..ca81c9193 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/PermittedParticipants.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/studyroom/PermittedParticipants.java @@ -1,4 +1,4 @@ -package com.woowacourse.moamoa.studyroom.domain; +package com.woowacourse.moamoa.studyroom.domain.studyroom; import com.woowacourse.moamoa.common.entity.ReadOnlyCollectionPersister; import com.woowacourse.moamoa.studyroom.domain.Accessor; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/StudyRoom.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/studyroom/StudyRoom.java similarity index 85% rename from backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/StudyRoom.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/studyroom/StudyRoom.java index ff25c296c..55af7ee8e 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/StudyRoom.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/studyroom/StudyRoom.java @@ -1,8 +1,6 @@ -package com.woowacourse.moamoa.studyroom.domain; +package com.woowacourse.moamoa.studyroom.domain.studyroom; -import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; -import com.woowacourse.moamoa.studyroom.domain.article.LinkContent; -import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; +import com.woowacourse.moamoa.studyroom.domain.Accessor; import java.util.Objects; import java.util.Set; import javax.persistence.Column; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/studyroom/JpaStudyRoomRepository.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/studyroom/repository/JpaStudyRoomRepository.java similarity index 53% rename from backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/studyroom/JpaStudyRoomRepository.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/studyroom/repository/JpaStudyRoomRepository.java index 055093d81..4a47f4a5a 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/studyroom/JpaStudyRoomRepository.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/studyroom/repository/JpaStudyRoomRepository.java @@ -1,6 +1,6 @@ -package com.woowacourse.moamoa.studyroom.domain.repository.studyroom; +package com.woowacourse.moamoa.studyroom.domain.studyroom.repository; -import com.woowacourse.moamoa.studyroom.domain.StudyRoom; +import com.woowacourse.moamoa.studyroom.domain.studyroom.StudyRoom; import org.springframework.data.jpa.repository.JpaRepository; interface JpaStudyRoomRepository extends JpaRepository, StudyRoomRepository { diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/studyroom/repository/StudyRoomRepository.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/studyroom/repository/StudyRoomRepository.java new file mode 100644 index 000000000..53632aa5b --- /dev/null +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/studyroom/repository/StudyRoomRepository.java @@ -0,0 +1,9 @@ +package com.woowacourse.moamoa.studyroom.domain.studyroom.repository; + +import com.woowacourse.moamoa.studyroom.domain.studyroom.StudyRoom; +import java.util.Optional; + +public interface StudyRoomRepository { + + Optional findByStudyId(Long studyId); +} diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ArticleService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ArticleService.java index 53b25e21d..c2c3cf812 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ArticleService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ArticleService.java @@ -2,13 +2,13 @@ import com.woowacourse.moamoa.study.service.exception.StudyNotFoundException; import com.woowacourse.moamoa.studyroom.domain.Accessor; -import com.woowacourse.moamoa.studyroom.domain.StudyRoom; +import com.woowacourse.moamoa.studyroom.domain.studyroom.StudyRoom; import com.woowacourse.moamoa.studyroom.domain.article.Article; import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; import com.woowacourse.moamoa.studyroom.domain.article.Content; import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; -import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepository; -import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; +import com.woowacourse.moamoa.studyroom.domain.article.repository.ArticleRepository; +import com.woowacourse.moamoa.studyroom.domain.studyroom.repository.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.ArticleDao; import com.woowacourse.moamoa.studyroom.query.data.ArticleData; import com.woowacourse.moamoa.studyroom.service.response.ArticleResponse; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java index 55fe91094..2104f5b7d 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java @@ -2,12 +2,12 @@ import com.woowacourse.moamoa.study.service.exception.StudyNotFoundException; import com.woowacourse.moamoa.studyroom.domain.Accessor; -import com.woowacourse.moamoa.studyroom.domain.StudyRoom; -import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; -import com.woowacourse.moamoa.studyroom.domain.article.LinkContent; +import com.woowacourse.moamoa.studyroom.domain.studyroom.StudyRoom; +import com.woowacourse.moamoa.studyroom.domain.link.LinkArticle; +import com.woowacourse.moamoa.studyroom.domain.link.LinkContent; import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; -import com.woowacourse.moamoa.studyroom.domain.repository.article.LinkArticleRepository; -import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; +import com.woowacourse.moamoa.studyroom.domain.link.repository.LinkArticleRepository; +import com.woowacourse.moamoa.studyroom.domain.studyroom.repository.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.LinkArticleDao; import com.woowacourse.moamoa.studyroom.query.data.LinkArticleData; import com.woowacourse.moamoa.studyroom.service.response.LinksResponse; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/LinkArticleRequest.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/LinkArticleRequest.java index d19eccff9..ff2607df6 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/LinkArticleRequest.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/LinkArticleRequest.java @@ -1,6 +1,6 @@ package com.woowacourse.moamoa.studyroom.service.request; -import com.woowacourse.moamoa.studyroom.domain.article.LinkContent; +import com.woowacourse.moamoa.studyroom.domain.link.LinkContent; import javax.validation.constraints.NotBlank; import javax.validation.constraints.Size; import lombok.AllArgsConstructor; diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleTest.java index a30e4e203..dc35ad457 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleTest.java @@ -7,7 +7,7 @@ import com.woowacourse.moamoa.member.domain.Member; import com.woowacourse.moamoa.studyroom.domain.Accessor; -import com.woowacourse.moamoa.studyroom.domain.StudyRoom; +import com.woowacourse.moamoa.studyroom.domain.studyroom.StudyRoom; import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; import java.util.Set; import java.util.stream.Collectors; diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticleTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticleTest.java index 3d69bd853..299ef64a0 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticleTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/NoticeArticleTest.java @@ -8,7 +8,7 @@ import com.woowacourse.moamoa.member.domain.Member; import com.woowacourse.moamoa.studyroom.domain.Accessor; -import com.woowacourse.moamoa.studyroom.domain.StudyRoom; +import com.woowacourse.moamoa.studyroom.domain.studyroom.StudyRoom; import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; import java.util.Set; import java.util.stream.Collectors; diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticleTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/link/LinkArticleTest.java similarity index 97% rename from backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticleTest.java rename to backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/link/LinkArticleTest.java index c994b95de..963b8a611 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/LinkArticleTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/link/LinkArticleTest.java @@ -1,4 +1,4 @@ -package com.woowacourse.moamoa.studyroom.domain.article; +package com.woowacourse.moamoa.studyroom.domain.link; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatCode; @@ -7,7 +7,7 @@ import com.woowacourse.moamoa.member.domain.Member; import com.woowacourse.moamoa.studyroom.domain.Accessor; -import com.woowacourse.moamoa.studyroom.domain.StudyRoom; +import com.woowacourse.moamoa.studyroom.domain.studyroom.StudyRoom; import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; import java.util.Set; import java.util.stream.Collectors; diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/ArticleServiceTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/ArticleServiceTest.java index 5693190e7..178dfa5d8 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/ArticleServiceTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/ArticleServiceTest.java @@ -20,8 +20,8 @@ import com.woowacourse.moamoa.studyroom.domain.article.Content; import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; -import com.woowacourse.moamoa.studyroom.domain.repository.article.ArticleRepository; -import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; +import com.woowacourse.moamoa.studyroom.domain.article.repository.ArticleRepository; +import com.woowacourse.moamoa.studyroom.domain.studyroom.repository.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.ArticleDao; import java.time.LocalDate; import javax.persistence.EntityManager; diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/LinkArticleServiceTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/LinkArticleServiceTest.java index 3bf6291fa..aa20b8e98 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/LinkArticleServiceTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/LinkArticleServiceTest.java @@ -15,14 +15,13 @@ import com.woowacourse.moamoa.study.service.StudyService; import com.woowacourse.moamoa.study.service.exception.StudyNotFoundException; import com.woowacourse.moamoa.study.service.request.StudyRequest; -import com.woowacourse.moamoa.studyroom.domain.article.LinkArticle; -import com.woowacourse.moamoa.studyroom.domain.article.LinkContent; +import com.woowacourse.moamoa.studyroom.domain.link.LinkArticle; +import com.woowacourse.moamoa.studyroom.domain.link.LinkContent; import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; -import com.woowacourse.moamoa.studyroom.domain.repository.article.LinkArticleRepository; -import com.woowacourse.moamoa.studyroom.domain.repository.studyroom.StudyRoomRepository; +import com.woowacourse.moamoa.studyroom.domain.link.repository.LinkArticleRepository; +import com.woowacourse.moamoa.studyroom.domain.studyroom.repository.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.LinkArticleDao; -import com.woowacourse.moamoa.studyroom.service.request.LinkArticleRequest; import java.time.LocalDate; import javax.persistence.EntityManager; import org.junit.jupiter.api.BeforeEach; From 81aa17059ad9f5ba3e948f185b7a7c46b2f2f646 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=A7=84=ED=98=81?= Date: Thu, 6 Oct 2022 11:50:49 +0900 Subject: [PATCH 39/40] =?UTF-8?q?refactor:=20=ED=94=BC=EB=93=9C=EB=B0=B1?= =?UTF-8?q?=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ArticleController.java | 15 ++-- .../controller/LinkArticleController.java | 2 +- .../studyroom/domain/article/Article.java | 6 +- .../exception/UneditableArticleException.java | 4 +- .../studyroom/domain/link/LinkArticle.java | 6 +- .../studyroom/service/ArticleService.java | 17 ++--- .../studyroom/service/LinkArticleService.java | 10 +-- .../exception/ArticleNotFoundException.java | 6 +- ...cleTest.java => CommunityArticleTest.java} | 2 +- .../studyroom/service/ArticleServiceTest.java | 72 ++++++++++--------- .../service/LinkArticleServiceTest.java | 32 ++++----- 11 files changed, 90 insertions(+), 82 deletions(-) rename backend/src/main/java/com/woowacourse/moamoa/studyroom/{domain => service}/exception/ArticleNotFoundException.java (62%) rename backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/{ArticleTest.java => CommunityArticleTest.java} (99%) diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/ArticleController.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/ArticleController.java index 3a73cb1fd..57dec54c8 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/ArticleController.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/ArticleController.java @@ -1,7 +1,6 @@ package com.woowacourse.moamoa.studyroom.controller; import com.woowacourse.moamoa.auth.config.AuthenticatedMemberId; -import com.woowacourse.moamoa.studyroom.domain.article.Article; import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; import com.woowacourse.moamoa.studyroom.service.ArticleService; import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; @@ -39,8 +38,8 @@ public ResponseEntity createArticle(@AuthenticatedMemberId final Long id, @Valid @RequestBody final ArticleRequest request ) { final ArticleType type = ArticleType.valueOf(typeName.toUpperCase()); - final Article article = articleService.createArticle(id, studyId, request.createContent(), type); - final URI location = URI.create("/api/studies/" + studyId + "/" + typeName + "/articles/" + article.getId()); + final Long articleId = articleService.createArticle(id, studyId, request.createContent(), type); + final URI location = URI.create("/api/studies/" + studyId + "/" + typeName + "/articles/" + articleId); return ResponseEntity.created(location).header("Access-Control-Allow-Headers", HttpHeaders.LOCATION).build(); } @@ -56,9 +55,11 @@ public ResponseEntity getArticle(@PathVariable("article-id") fi @DeleteMapping("/{article-id}") public ResponseEntity deleteArticle(@AuthenticatedMemberId final Long id, @PathVariable("study-id") final Long studyId, - @PathVariable("article-id") final Long articleId + @PathVariable("article-id") final Long articleId, + @PathVariable("type") final String typeName ) { - articleService.deleteArticle(id, studyId, articleId); + final ArticleType type = ArticleType.valueOf(typeName.toUpperCase()); + articleService.deleteArticle(id, studyId, articleId, type); return ResponseEntity.noContent().build(); } @@ -77,9 +78,11 @@ public ResponseEntity getArticles( public ResponseEntity updateArticle(@AuthenticatedMemberId final Long id, @PathVariable("study-id") final Long studyId, @PathVariable("article-id") final Long articleId, + @PathVariable("type") final String typeName, @Valid @RequestBody final ArticleRequest request ) { - articleService.updateArticle(id, studyId, articleId, request.createContent()); + final ArticleType type = ArticleType.valueOf(typeName.toUpperCase()); + articleService.updateArticle(id, studyId, articleId, request.createContent(), type); return ResponseEntity.noContent().build(); } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleController.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleController.java index 35b1d743b..439e7b761 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleController.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/LinkArticleController.java @@ -43,7 +43,7 @@ public ResponseEntity createLink( @PathVariable("study-id") final Long studyId, @Valid @RequestBody final LinkArticleRequest articleRequest ) { - final Long id = linkArticleService.createArticle(memberId, studyId, articleRequest.createContent()).getId(); + final Long id = linkArticleService.createArticle(memberId, studyId, articleRequest.createContent()); return ResponseEntity.created(URI.create("/api/studies/" + studyId + "/reference-room/links/" + id)).build(); } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java index 32fd0a884..ac5cd3be4 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/Article.java @@ -50,7 +50,7 @@ public static Article create( final StudyRoom studyRoom, final Accessor accessor, final Content content, final ArticleType type ) { if (type.isUnwritableAccessor(studyRoom, accessor)) { - throw new UneditableArticleException(studyRoom.getId(), accessor, Article.class); + throw new UneditableArticleException(studyRoom.getId(), accessor, type.name()); } return new Article(null, studyRoom, accessor.getMemberId(), content, type); @@ -68,7 +68,7 @@ private Article( public void update(final Accessor accessor, final Content content) { if (type.isUneditableAccessor(studyRoom, authorId, accessor)) { - throw new UneditableArticleException(studyRoom.getId(), accessor, getClass()); + throw new UneditableArticleException(studyRoom.getId(), accessor, type.name()); } this.content = content; @@ -76,7 +76,7 @@ public void update(final Accessor accessor, final Content content) { public final void delete(final Accessor accessor) { if (type.isUneditableAccessor(studyRoom, authorId, accessor)) { - throw new UneditableArticleException(studyRoom.getId(), accessor, getClass()); + throw new UneditableArticleException(studyRoom.getId(), accessor, type.name()); } deleted = true; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/UneditableArticleException.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/UneditableArticleException.java index dcd6725c3..8765abdc4 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/UneditableArticleException.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/UneditableArticleException.java @@ -5,7 +5,7 @@ public class UneditableArticleException extends BadRequestException { - public UneditableArticleException(final Long studyId, final Accessor accessor, final Class articleType) { - super(String.format("스터디[%d]에 접근자[%s]가 %s의 게시글을 수정/추가할 수 없습니다.", studyId, accessor, articleType.getSimpleName())); + public UneditableArticleException(final Long studyId, final Accessor accessor, final String typeName) { + super(String.format("스터디[%d]에 접근자[%s]가 %s의 게시글을 수정/추가할 수 없습니다.", studyId, accessor, typeName)); } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/link/LinkArticle.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/link/LinkArticle.java index 7eb6f7dc0..35dd7f1f4 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/link/LinkArticle.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/link/LinkArticle.java @@ -46,7 +46,7 @@ public static LinkArticle create(final StudyRoom studyRoom, final Accessor acces return new LinkArticle(studyRoom, accessor.getMemberId(), content); } - throw new UneditableArticleException(studyRoom.getId(), accessor, LinkArticle.class); + throw new UneditableArticleException(studyRoom.getId(), accessor, "LINK"); } private LinkArticle(final StudyRoom studyRoom, final Long authorId, final LinkContent content) { @@ -62,7 +62,7 @@ private LinkArticle(final Long id, final StudyRoom studyRoom, final Long authorI public final void delete(final Accessor accessor) { if (isUneditableAccessor(accessor)) { - throw new UneditableArticleException(studyRoom.getId(), accessor, LinkArticle.class); + throw new UneditableArticleException(studyRoom.getId(), accessor, "LINK"); } deleted = true; @@ -70,7 +70,7 @@ public final void delete(final Accessor accessor) { public void update(final Accessor accessor, final LinkContent content) { if (isUneditableAccessor(accessor)) { - throw new UneditableArticleException(studyRoom.getId(), accessor, LinkArticle.class); + throw new UneditableArticleException(studyRoom.getId(), accessor, "LINK"); } this.content = content; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ArticleService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ArticleService.java index c2c3cf812..2732ce662 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ArticleService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ArticleService.java @@ -6,7 +6,7 @@ import com.woowacourse.moamoa.studyroom.domain.article.Article; import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; import com.woowacourse.moamoa.studyroom.domain.article.Content; -import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; +import com.woowacourse.moamoa.studyroom.service.exception.ArticleNotFoundException; import com.woowacourse.moamoa.studyroom.domain.article.repository.ArticleRepository; import com.woowacourse.moamoa.studyroom.domain.studyroom.repository.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.ArticleDao; @@ -39,7 +39,7 @@ public ArticleService(final StudyRoomRepository studyRoomRepository, public ArticleResponse getArticle(final Long articleId, final ArticleType type) { final ArticleData data = articleDao.getById(articleId, type) - .orElseThrow(() -> new ArticleNotFoundException(articleId, Article.class)); + .orElseThrow(() -> new ArticleNotFoundException(articleId, type.name())); return new ArticleResponse(data); } @@ -55,30 +55,31 @@ public ArticleSummariesResponse getArticles(final Long studyId, final Pageable p } @Transactional - public Article createArticle( + public Long createArticle( final Long memberId, final Long studyId, final Content content, final ArticleType type ) { final StudyRoom studyRoom = studyRoomRepository.findByStudyId(studyId) .orElseThrow(() -> new StudyNotFoundException(studyId)); final Article article = Article.create(studyRoom, new Accessor(memberId, studyId), content, type); - return articleRepository.save(article); + return articleRepository.save(article).getId(); } @Transactional public void updateArticle( - final Long memberId, final Long studyId, final Long articleId, final Content newContent + final Long memberId, final Long studyId, final Long articleId, final Content newContent, + final ArticleType type ) { final Article article = articleRepository.findById(articleId) - .orElseThrow(() -> new ArticleNotFoundException(articleId, Article.class)); + .orElseThrow(() -> new ArticleNotFoundException(articleId, type.name())); article.update(new Accessor(memberId, studyId), newContent); } @Transactional - public void deleteArticle(final Long memberId, final Long studyId, final Long articleId) { + public void deleteArticle(final Long memberId, final Long studyId, final Long articleId, final ArticleType type) { final Article article = articleRepository.findById(articleId) - .orElseThrow(() -> new ArticleNotFoundException(articleId, Article.class)); + .orElseThrow(() -> new ArticleNotFoundException(articleId, type.name())); final Accessor accessor = new Accessor(memberId, studyId); article.delete(accessor); diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java index 2104f5b7d..0a4356d33 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/LinkArticleService.java @@ -5,7 +5,7 @@ import com.woowacourse.moamoa.studyroom.domain.studyroom.StudyRoom; import com.woowacourse.moamoa.studyroom.domain.link.LinkArticle; import com.woowacourse.moamoa.studyroom.domain.link.LinkContent; -import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; +import com.woowacourse.moamoa.studyroom.service.exception.ArticleNotFoundException; import com.woowacourse.moamoa.studyroom.domain.link.repository.LinkArticleRepository; import com.woowacourse.moamoa.studyroom.domain.studyroom.repository.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.LinkArticleDao; @@ -39,12 +39,12 @@ public LinksResponse getLinks(final Long studyId, final Pageable pageable) { } @Transactional - public LinkArticle createArticle(final Long memberId, final Long studyId, final LinkContent content) { + public Long createArticle(final Long memberId, final Long studyId, final LinkContent content) { final StudyRoom studyRoom = studyRoomRepository.findByStudyId(studyId) .orElseThrow(() -> new StudyNotFoundException(studyId)); final LinkArticle article = LinkArticle.create(studyRoom, new Accessor(memberId, studyId), content); - return linkArticleRepository.save(article); + return linkArticleRepository.save(article).getId(); } @Transactional @@ -52,7 +52,7 @@ public void updateArticle( final Long memberId, final Long studyId, final Long articleId, final LinkContent newContent ) { final LinkArticle article = linkArticleRepository.findById(articleId) - .orElseThrow(() -> new ArticleNotFoundException(articleId, LinkArticle.class)); + .orElseThrow(() -> new ArticleNotFoundException(articleId, "LINK")); article.update(new Accessor(memberId, studyId), newContent); } @@ -60,7 +60,7 @@ public void updateArticle( @Transactional public void deleteArticle(final Long memberId, final Long studyId, final Long articleId) { final LinkArticle article = linkArticleRepository.findById(articleId) - .orElseThrow(() -> new ArticleNotFoundException(articleId, LinkArticle.class)); + .orElseThrow(() -> new ArticleNotFoundException(articleId, "LINK")); final Accessor accessor = new Accessor(memberId, studyId); article.delete(accessor); diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/ArticleNotFoundException.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/ArticleNotFoundException.java similarity index 62% rename from backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/ArticleNotFoundException.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/ArticleNotFoundException.java index e8b542f79..bcd5a52b8 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/exception/ArticleNotFoundException.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/ArticleNotFoundException.java @@ -1,10 +1,10 @@ -package com.woowacourse.moamoa.studyroom.domain.exception; +package com.woowacourse.moamoa.studyroom.service.exception; import com.woowacourse.moamoa.common.exception.NotFoundException; public class ArticleNotFoundException extends NotFoundException { - public ArticleNotFoundException(final Long articleId, final Class articleType) { - super(String.format("%d의 식별자를 가진 %s 게시글이 존재하지 않습니다.", articleId, articleType.getSimpleName())); + public ArticleNotFoundException(final Long articleId, final String typeName) { + super(String.format("%d의 식별자를 가진 %s 게시글이 존재하지 않습니다.", articleId, typeName)); } } diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticleTest.java similarity index 99% rename from backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleTest.java rename to backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticleTest.java index dc35ad457..4e04ad943 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/ArticleTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/domain/article/CommunityArticleTest.java @@ -18,7 +18,7 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -class ArticleTest { +class CommunityArticleTest { private static final long OWNER_ID = 1L; private static final long PARTICIPANT_ID = 2L; diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/ArticleServiceTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/ArticleServiceTest.java index 178dfa5d8..6cf0da0fd 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/ArticleServiceTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/ArticleServiceTest.java @@ -18,7 +18,7 @@ import com.woowacourse.moamoa.studyroom.domain.article.Article; import com.woowacourse.moamoa.studyroom.domain.article.ArticleType; import com.woowacourse.moamoa.studyroom.domain.article.Content; -import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; +import com.woowacourse.moamoa.studyroom.service.exception.ArticleNotFoundException; import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; import com.woowacourse.moamoa.studyroom.domain.article.repository.ArticleRepository; import com.woowacourse.moamoa.studyroom.domain.studyroom.repository.StudyRoomRepository; @@ -27,7 +27,6 @@ import javax.persistence.EntityManager; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; import org.springframework.beans.factory.annotation.Autowired; @@ -70,10 +69,10 @@ void createArticle(ArticleType type) { final Content content = new Content("제목", "설명"); // act - final Article article = sut.createArticle(짱구.getId(), 자바_스터디.getId(), content, type); + final Long articleId = sut.createArticle(짱구.getId(), 자바_스터디.getId(), content, type); // assert - Article actualArticle = articleRepository.findById(article.getId()) + Article actualArticle = articleRepository.findById(articleId) .orElseThrow(); assertThat(actualArticle.getContent()).isEqualTo(content); } @@ -106,91 +105,96 @@ void createByNotParticipatedMember(ArticleType type) { } @DisplayName("게시글을 수정한다.") - @Test - void updateArticle() { + @ParameterizedTest + @EnumSource(ArticleType.class) + void updateArticle(ArticleType type) { // arrange - final Member 짱구 = saveMember(짱구()); - final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); - final Article article = createArticle(짱구, 자바_스터디, new Content("제목", "설명")); + final Member 방장 = saveMember(짱구()); + final Study 자바_스터디 = createStudy(방장, 자바_스터디_신청서(LocalDate.now())); + final Long articleId = createArticle(방장, 자바_스터디, new Content("제목", "설명")); final Content newContent = new Content("제목 수정", "설명 수정"); // act - sut.updateArticle(짱구.getId(), 자바_스터디.getId(), article.getId(), newContent); + sut.updateArticle(방장.getId(), 자바_스터디.getId(), articleId, newContent, type); // assert - Article actualArticle = articleRepository.findById(article.getId()).orElseThrow(); + Article actualArticle = articleRepository.findById(articleId).orElseThrow(); assertThat(actualArticle.getContent()).isEqualTo(new Content("제목 수정", "설명 수정")); } @DisplayName("존재하지 않는 게시글을 수정할 수 없다.") - @Test - void updateByInvalidLinkId() { + @ParameterizedTest + @EnumSource(ArticleType.class) + void updateByInvalidLinkId(ArticleType type) { final Member 짱구 = saveMember(짱구()); final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); final Content content = new Content("제목", "수정"); - assertThatThrownBy(() -> sut.updateArticle(짱구.getId(), 자바_스터디.getId(), -1L, content)) + assertThatThrownBy(() -> sut.updateArticle(짱구.getId(), 자바_스터디.getId(), -1L, content, type)) .isInstanceOf(ArticleNotFoundException.class); } @DisplayName("스터디에 참여하지 않은 경우 게시글을 수정할 수 없다.") - @Test - void updateByNotParticipatedMember() { + @ParameterizedTest + @EnumSource(ArticleType.class) + void updateByNotParticipatedMember(ArticleType type) { final Member 짱구 = saveMember(짱구()); final Member 디우 = saveMember(디우()); final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); final Content content = new Content("제목", "설명"); - final Article 링크_게시글 = createArticle(짱구, 자바_스터디, content); + final Long 링크_ID = createArticle(짱구, 자바_스터디, content); - assertThatThrownBy(() -> sut.updateArticle(디우.getId(), 자바_스터디.getId(), 링크_게시글.getId(), - content)) + assertThatThrownBy(() -> sut.updateArticle(디우.getId(), 자바_스터디.getId(), 링크_ID, content, type)) .isInstanceOf(UneditableArticleException.class); } @DisplayName("게시글을 삭제한다.") - @Test - void deleteArticle() { + @ParameterizedTest + @EnumSource(ArticleType.class) + void deleteArticle(ArticleType type) { // arrange final Member 짱구 = saveMember(짱구()); final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); final Content content = new Content("제목", "설명"); - final Article 게시글 = createArticle(짱구, 자바_스터디, content); + final Long 게시글_ID = createArticle(짱구, 자바_스터디, content); //act - sut.deleteArticle(짱구.getId(), 자바_스터디.getId(), 게시글.getId()); + sut.deleteArticle(짱구.getId(), 자바_스터디.getId(), 게시글_ID, type); //assert entityManager.flush(); entityManager.clear(); - assertThat(articleRepository.findById(게시글.getId())).isEmpty(); + assertThat(articleRepository.findById(게시글_ID)).isEmpty(); } @DisplayName("존재하지 않는 게시글을 삭제할 수 없다.") - @Test - void deleteByInvalidLinkId() { + @ParameterizedTest + @EnumSource(ArticleType.class) + void deleteByInvalidLinkId(ArticleType type) { final Member 짱구 = saveMember(짱구()); final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); - assertThatThrownBy(() -> sut.deleteArticle(짱구.getId(), 자바_스터디.getId(), -1L)) + assertThatThrownBy(() -> sut.deleteArticle(짱구.getId(), 자바_스터디.getId(), -1L, type)) .isInstanceOf(ArticleNotFoundException.class); } @DisplayName("스터디에 참여하지 않은 경우 게시글을 삭제할 수 없다.") - @Test - void deleteByNotParticipatedMember() { + @ParameterizedTest + @EnumSource(ArticleType.class) + void deleteByNotParticipatedMember(ArticleType type) { final Member 짱구 = saveMember(짱구()); final Member 디우 = saveMember(디우()); final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); final Content content = new Content("제목", "설명"); - final Article 링크_게시글 = sut.createArticle(짱구.getId(), 자바_스터디.getId(), content, ArticleType.COMMUNITY + final Long 게시글_ID = sut.createArticle(짱구.getId(), 자바_스터디.getId(), content, type ); - assertThatThrownBy(() -> sut.deleteArticle(디우.getId(), 자바_스터디.getId(), 링크_게시글.getId())) + assertThatThrownBy(() -> sut.deleteArticle(디우.getId(), 자바_스터디.getId(), 게시글_ID, ArticleType.COMMUNITY)) .isInstanceOf(UneditableArticleException.class); } @@ -209,13 +213,13 @@ private Study createStudy(final Member owner, StudyRequest studyRequest) { return study; } - private Article createArticle(final Member author, final Study study, + private Long createArticle(final Member author, final Study study, final Content content) { - final Article article = sut.createArticle(author.getId(), study.getId(), content, + final Long articleId = sut.createArticle(author.getId(), study.getId(), content, ArticleType.COMMUNITY ); entityManager.flush(); entityManager.clear(); - return article; + return articleId; } } diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/LinkArticleServiceTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/LinkArticleServiceTest.java index aa20b8e98..90ece53b3 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/LinkArticleServiceTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/service/LinkArticleServiceTest.java @@ -17,7 +17,7 @@ import com.woowacourse.moamoa.study.service.request.StudyRequest; import com.woowacourse.moamoa.studyroom.domain.link.LinkArticle; import com.woowacourse.moamoa.studyroom.domain.link.LinkContent; -import com.woowacourse.moamoa.studyroom.domain.exception.ArticleNotFoundException; +import com.woowacourse.moamoa.studyroom.service.exception.ArticleNotFoundException; import com.woowacourse.moamoa.studyroom.domain.exception.UneditableArticleException; import com.woowacourse.moamoa.studyroom.domain.link.repository.LinkArticleRepository; import com.woowacourse.moamoa.studyroom.domain.studyroom.repository.StudyRoomRepository; @@ -66,10 +66,10 @@ void createArticle() { final LinkContent linkContent = new LinkContent("www.naver.com", "설명"); // act - final LinkArticle article = sut.createArticle(짱구.getId(), 자바_스터디.getId(), linkContent); + final Long articleId = sut.createArticle(짱구.getId(), 자바_스터디.getId(), linkContent); // assert - LinkArticle actualArticle = articleRepository.findById(article.getId()).orElseThrow(); + LinkArticle actualArticle = articleRepository.findById(articleId).orElseThrow(); assertThat(actualArticle.getContent()).isEqualTo(linkContent); } @@ -104,15 +104,15 @@ void updateArticle() { final Member 짱구 = saveMember(짱구()); final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); final LinkContent linkContent = new LinkContent("www.naver.com", "설명"); - final LinkArticle article = sut.createArticle(짱구.getId(), 자바_스터디.getId(), linkContent); + final Long articleId = sut.createArticle(짱구.getId(), 자바_스터디.getId(), linkContent); final LinkContent newContent = new LinkContent("링크 수정", "설명 수정"); // act - sut.updateArticle(짱구.getId(), 자바_스터디.getId(), article.getId(), newContent); + sut.updateArticle(짱구.getId(), 자바_스터디.getId(), articleId, newContent); // assert - LinkArticle actualArticle = articleRepository.findById(article.getId()).orElseThrow(); + LinkArticle actualArticle = articleRepository.findById(articleId).orElseThrow(); assertThat(actualArticle.getContent()).isEqualTo(new LinkContent("링크 수정", "설명 수정")); } @@ -137,9 +137,9 @@ void updateByNotParticipatedMember() { final LinkContent linkContent = new LinkContent("www.naver.com", "설명"); - final LinkArticle 링크_게시글 = createArticle(짱구, 자바_스터디, linkContent); + final Long 게시글_ID = createArticle(짱구, 자바_스터디, linkContent); - assertThatThrownBy(() -> sut.updateArticle(디우.getId(), 자바_스터디.getId(), 링크_게시글.getId(), + assertThatThrownBy(() -> sut.updateArticle(디우.getId(), 자바_스터디.getId(), 게시글_ID, linkContent)) .isInstanceOf(UneditableArticleException.class); } @@ -151,16 +151,16 @@ void deleteArticle() { final Member 짱구 = saveMember(짱구()); final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); final LinkContent linkContent = new LinkContent("www.naver.com", "설명"); - final LinkArticle 게시글 = createArticle(짱구, 자바_스터디, linkContent); + final Long 게시글_ID = createArticle(짱구, 자바_스터디, linkContent); //act - sut.deleteArticle(짱구.getId(), 자바_스터디.getId(), 게시글.getId()); + sut.deleteArticle(짱구.getId(), 자바_스터디.getId(), 게시글_ID); //assert entityManager.flush(); entityManager.clear(); - assertThat(articleRepository.findById(게시글.getId())).isEmpty(); + assertThat(articleRepository.findById(게시글_ID)).isEmpty(); } @DisplayName("존재하지 않는 링크 공유글을 삭제할 수 없다.") @@ -180,9 +180,9 @@ void deleteByNotParticipatedMember() { final Member 디우 = saveMember(디우()); final Study 자바_스터디 = createStudy(짱구, 자바_스터디_신청서(LocalDate.now())); final LinkContent linkContent = new LinkContent("www.naver.com", "설명"); - final LinkArticle 링크_게시글 = sut.createArticle(짱구.getId(), 자바_스터디.getId(), linkContent); + final Long 게시글_ID = sut.createArticle(짱구.getId(), 자바_스터디.getId(), linkContent); - assertThatThrownBy(() -> sut.deleteArticle(디우.getId(), 자바_스터디.getId(), 링크_게시글.getId())) + assertThatThrownBy(() -> sut.deleteArticle(디우.getId(), 자바_스터디.getId(), 게시글_ID)) .isInstanceOf(UneditableArticleException.class); } @@ -201,10 +201,10 @@ private Study createStudy(final Member owner, StudyRequest studyRequest) { return study; } - private LinkArticle createArticle(final Member author, final Study study, final LinkContent content) { - final LinkArticle article = sut.createArticle(author.getId(), study.getId(), content); + private Long createArticle(final Member author, final Study study, final LinkContent content) { + final Long articleId = sut.createArticle(author.getId(), study.getId(), content); entityManager.flush(); entityManager.clear(); - return article; + return articleId; } } From 6bb7d06a6d8fc1544fba34133562096e65fcc3c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=A7=84=ED=98=81?= Date: Thu, 6 Oct 2022 14:44:53 +0900 Subject: [PATCH 40/40] =?UTF-8?q?refactor:=20=ED=8C=A8=ED=82=A4=EC=A7=80?= =?UTF-8?q?=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../studyroom/controller/ReviewController.java | 2 +- .../controller/SearchingReviewController.java | 4 ++-- .../controller/converter/SizeRequestConverter.java | 2 +- .../repository}/JpaReviewRepository.java | 2 +- .../repository}/ReviewRepository.java | 2 +- .../moamoa/studyroom/service/ReviewService.java | 6 +++--- .../studyroom/service/SearchingReviewService.java | 4 ++-- .../{review => }/ReviewNotFoundException.java | 2 +- .../service/request/{review => }/ReviewRequest.java | 2 +- .../service/request/{review => }/SizeRequest.java | 2 +- .../response/{review => }/ReviewResponse.java | 2 +- .../response/{review => }/ReviewsResponse.java | 2 +- .../response/{review => }/WriterResponse.java | 2 +- .../acceptance/steps/StudyRelatedSteps.java | 2 +- .../test/studyroom/ReviewsAcceptanceTest.java | 8 ++++---- .../controller/review/ReviewControllerTest.java | 5 ++--- .../review/SearchingReviewControllerTest.java | 12 ++++++------ .../moamoa/studyroom/query/review/ReviewDaoTest.java | 2 +- .../webmvc/review/BadRequestReviewWebMvcTest.java | 2 +- .../webmvc/review/UnauthorizedReviewWebMvcTest.java | 2 +- 20 files changed, 33 insertions(+), 34 deletions(-) rename backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/{repository/review => review/repository}/JpaReviewRepository.java (76%) rename backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/{repository/review => review/repository}/ReviewRepository.java (77%) rename backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/{review => }/ReviewNotFoundException.java (77%) rename backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/{review => }/ReviewRequest.java (82%) rename backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/{review => }/SizeRequest.java (90%) rename backend/src/main/java/com/woowacourse/moamoa/studyroom/service/response/{review => }/ReviewResponse.java (92%) rename backend/src/main/java/com/woowacourse/moamoa/studyroom/service/response/{review => }/ReviewsResponse.java (92%) rename backend/src/main/java/com/woowacourse/moamoa/studyroom/service/response/{review => }/WriterResponse.java (90%) diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/ReviewController.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/ReviewController.java index 3a74fc554..51157145d 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/ReviewController.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/ReviewController.java @@ -2,7 +2,7 @@ import com.woowacourse.moamoa.auth.config.AuthenticatedMemberId; import com.woowacourse.moamoa.studyroom.service.ReviewService; -import com.woowacourse.moamoa.studyroom.service.request.review.ReviewRequest; +import com.woowacourse.moamoa.studyroom.service.request.ReviewRequest; import java.net.URI; import javax.validation.Valid; import lombok.RequiredArgsConstructor; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/SearchingReviewController.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/SearchingReviewController.java index 85569da4c..9d69e1a2a 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/SearchingReviewController.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/SearchingReviewController.java @@ -1,8 +1,8 @@ package com.woowacourse.moamoa.studyroom.controller; import com.woowacourse.moamoa.studyroom.service.SearchingReviewService; -import com.woowacourse.moamoa.studyroom.service.request.review.SizeRequest; -import com.woowacourse.moamoa.studyroom.service.response.review.ReviewsResponse; +import com.woowacourse.moamoa.studyroom.service.request.SizeRequest; +import com.woowacourse.moamoa.studyroom.service.response.ReviewsResponse; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/converter/SizeRequestConverter.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/converter/SizeRequestConverter.java index fe0fb1d5f..17efcff9a 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/converter/SizeRequestConverter.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/controller/converter/SizeRequestConverter.java @@ -1,6 +1,6 @@ package com.woowacourse.moamoa.studyroom.controller.converter; -import com.woowacourse.moamoa.studyroom.service.request.review.SizeRequest; +import com.woowacourse.moamoa.studyroom.service.request.SizeRequest; import org.springframework.core.convert.converter.Converter; import org.springframework.stereotype.Component; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/review/JpaReviewRepository.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/review/repository/JpaReviewRepository.java similarity index 76% rename from backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/review/JpaReviewRepository.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/review/repository/JpaReviewRepository.java index b9cec74d6..f3a11bb93 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/review/JpaReviewRepository.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/review/repository/JpaReviewRepository.java @@ -1,4 +1,4 @@ -package com.woowacourse.moamoa.studyroom.domain.repository.review; +package com.woowacourse.moamoa.studyroom.domain.review.repository; import com.woowacourse.moamoa.studyroom.domain.review.Review; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/review/ReviewRepository.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/review/repository/ReviewRepository.java similarity index 77% rename from backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/review/ReviewRepository.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/review/repository/ReviewRepository.java index 989d1ef9e..9ec5d9d75 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/repository/review/ReviewRepository.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/review/repository/ReviewRepository.java @@ -1,4 +1,4 @@ -package com.woowacourse.moamoa.studyroom.domain.repository.review; +package com.woowacourse.moamoa.studyroom.domain.review.repository; import com.woowacourse.moamoa.studyroom.domain.review.Review; import java.util.Optional; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ReviewService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ReviewService.java index b760ef76b..42de93df9 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ReviewService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/ReviewService.java @@ -3,11 +3,11 @@ import com.woowacourse.moamoa.study.service.exception.StudyNotFoundException; import com.woowacourse.moamoa.studyroom.domain.Accessor; import com.woowacourse.moamoa.studyroom.domain.studyroom.StudyRoom; -import com.woowacourse.moamoa.studyroom.domain.repository.review.ReviewRepository; +import com.woowacourse.moamoa.studyroom.domain.review.repository.ReviewRepository; import com.woowacourse.moamoa.studyroom.domain.studyroom.repository.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.domain.review.Review; -import com.woowacourse.moamoa.studyroom.service.exception.review.ReviewNotFoundException; -import com.woowacourse.moamoa.studyroom.service.request.review.ReviewRequest; +import com.woowacourse.moamoa.studyroom.service.exception.ReviewNotFoundException; +import com.woowacourse.moamoa.studyroom.service.request.ReviewRequest; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/SearchingReviewService.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/SearchingReviewService.java index f04d3b449..fd96bc587 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/SearchingReviewService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/SearchingReviewService.java @@ -2,8 +2,8 @@ import com.woowacourse.moamoa.studyroom.query.ReviewDao; import com.woowacourse.moamoa.studyroom.query.data.ReviewData; -import com.woowacourse.moamoa.studyroom.service.request.review.SizeRequest; -import com.woowacourse.moamoa.studyroom.service.response.review.ReviewsResponse; +import com.woowacourse.moamoa.studyroom.service.request.SizeRequest; +import com.woowacourse.moamoa.studyroom.service.response.ReviewsResponse; import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/review/ReviewNotFoundException.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/ReviewNotFoundException.java similarity index 77% rename from backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/review/ReviewNotFoundException.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/ReviewNotFoundException.java index 08fffc7a1..534ae655b 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/review/ReviewNotFoundException.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/ReviewNotFoundException.java @@ -1,4 +1,4 @@ -package com.woowacourse.moamoa.studyroom.service.exception.review; +package com.woowacourse.moamoa.studyroom.service.exception; import com.woowacourse.moamoa.common.exception.NotFoundException; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/review/ReviewRequest.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/ReviewRequest.java similarity index 82% rename from backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/review/ReviewRequest.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/ReviewRequest.java index 75228e7c4..f51225f4f 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/review/ReviewRequest.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/ReviewRequest.java @@ -1,4 +1,4 @@ -package com.woowacourse.moamoa.studyroom.service.request.review; +package com.woowacourse.moamoa.studyroom.service.request; import javax.validation.constraints.NotBlank; import lombok.AllArgsConstructor; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/review/SizeRequest.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/SizeRequest.java similarity index 90% rename from backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/review/SizeRequest.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/SizeRequest.java index 424f80df5..bc04f13b8 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/review/SizeRequest.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/request/SizeRequest.java @@ -1,4 +1,4 @@ -package com.woowacourse.moamoa.studyroom.service.request.review; +package com.woowacourse.moamoa.studyroom.service.request; public class SizeRequest { diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/response/review/ReviewResponse.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/response/ReviewResponse.java similarity index 92% rename from backend/src/main/java/com/woowacourse/moamoa/studyroom/service/response/review/ReviewResponse.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/service/response/ReviewResponse.java index 3319d7bef..dded2b3b2 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/response/review/ReviewResponse.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/response/ReviewResponse.java @@ -1,4 +1,4 @@ -package com.woowacourse.moamoa.studyroom.service.response.review; +package com.woowacourse.moamoa.studyroom.service.response; import com.woowacourse.moamoa.studyroom.query.data.ReviewData; import java.time.LocalDate; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/response/review/ReviewsResponse.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/response/ReviewsResponse.java similarity index 92% rename from backend/src/main/java/com/woowacourse/moamoa/studyroom/service/response/review/ReviewsResponse.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/service/response/ReviewsResponse.java index 7e61e6bd2..ea5d6339d 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/response/review/ReviewsResponse.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/response/ReviewsResponse.java @@ -1,4 +1,4 @@ -package com.woowacourse.moamoa.studyroom.service.response.review; +package com.woowacourse.moamoa.studyroom.service.response; import com.woowacourse.moamoa.studyroom.query.data.ReviewData; import java.util.List; diff --git a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/response/review/WriterResponse.java b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/response/WriterResponse.java similarity index 90% rename from backend/src/main/java/com/woowacourse/moamoa/studyroom/service/response/review/WriterResponse.java rename to backend/src/main/java/com/woowacourse/moamoa/studyroom/service/response/WriterResponse.java index 63469b92e..82b8ff8e1 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/response/review/WriterResponse.java +++ b/backend/src/main/java/com/woowacourse/moamoa/studyroom/service/response/WriterResponse.java @@ -1,4 +1,4 @@ -package com.woowacourse.moamoa.studyroom.service.response.review; +package com.woowacourse.moamoa.studyroom.service.response; import com.woowacourse.moamoa.member.query.data.MemberData; import lombok.AccessLevel; diff --git a/backend/src/test/java/com/woowacourse/acceptance/steps/StudyRelatedSteps.java b/backend/src/test/java/com/woowacourse/acceptance/steps/StudyRelatedSteps.java index 82c51d0f8..4e9fc21d5 100644 --- a/backend/src/test/java/com/woowacourse/acceptance/steps/StudyRelatedSteps.java +++ b/backend/src/test/java/com/woowacourse/acceptance/steps/StudyRelatedSteps.java @@ -4,7 +4,7 @@ import static org.springframework.http.HttpHeaders.CONTENT_TYPE; import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; -import com.woowacourse.moamoa.studyroom.service.request.review.ReviewRequest; +import com.woowacourse.moamoa.studyroom.service.request.ReviewRequest; import com.woowacourse.moamoa.studyroom.service.request.ArticleRequest; import com.woowacourse.moamoa.studyroom.service.request.LinkArticleRequest; import io.restassured.RestAssured; diff --git a/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/ReviewsAcceptanceTest.java b/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/ReviewsAcceptanceTest.java index 1c4188794..6b53be19d 100644 --- a/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/ReviewsAcceptanceTest.java +++ b/backend/src/test/java/com/woowacourse/acceptance/test/studyroom/ReviewsAcceptanceTest.java @@ -24,10 +24,10 @@ import static org.springframework.restdocs.restassured3.RestAssuredRestDocumentation.document; import com.woowacourse.acceptance.AcceptanceTest; -import com.woowacourse.moamoa.studyroom.service.request.review.ReviewRequest; -import com.woowacourse.moamoa.studyroom.service.response.review.ReviewResponse; -import com.woowacourse.moamoa.studyroom.service.response.review.ReviewsResponse; -import com.woowacourse.moamoa.studyroom.service.response.review.WriterResponse; +import com.woowacourse.moamoa.studyroom.service.request.ReviewRequest; +import com.woowacourse.moamoa.studyroom.service.response.ReviewResponse; +import com.woowacourse.moamoa.studyroom.service.response.ReviewsResponse; +import com.woowacourse.moamoa.studyroom.service.response.WriterResponse; import io.restassured.RestAssured; import java.time.LocalDate; import java.util.List; diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/review/ReviewControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/review/ReviewControllerTest.java index cd408656b..0c0cc663a 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/review/ReviewControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/review/ReviewControllerTest.java @@ -15,11 +15,10 @@ import com.woowacourse.moamoa.study.service.request.StudyRequest; import com.woowacourse.moamoa.studyroom.controller.ReviewController; import com.woowacourse.moamoa.studyroom.domain.exception.UneditableException; -import com.woowacourse.moamoa.studyroom.domain.repository.review.ReviewRepository; +import com.woowacourse.moamoa.studyroom.domain.review.repository.ReviewRepository; import com.woowacourse.moamoa.studyroom.domain.studyroom.repository.StudyRoomRepository; -import com.woowacourse.moamoa.studyroom.domain.exception.UnwritableException; import com.woowacourse.moamoa.studyroom.service.ReviewService; -import com.woowacourse.moamoa.studyroom.service.request.review.ReviewRequest; +import com.woowacourse.moamoa.studyroom.service.request.ReviewRequest; import java.time.LocalDate; import javax.persistence.EntityManager; import org.junit.jupiter.api.BeforeEach; diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/review/SearchingReviewControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/review/SearchingReviewControllerTest.java index 88f8f7b68..8cd15cb44 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/review/SearchingReviewControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/controller/review/SearchingReviewControllerTest.java @@ -21,16 +21,16 @@ import com.woowacourse.moamoa.study.service.StudyService; import com.woowacourse.moamoa.study.service.request.StudyRequest; import com.woowacourse.moamoa.studyroom.controller.SearchingReviewController; -import com.woowacourse.moamoa.studyroom.domain.repository.review.ReviewRepository; +import com.woowacourse.moamoa.studyroom.domain.review.repository.ReviewRepository; import com.woowacourse.moamoa.studyroom.domain.studyroom.repository.StudyRoomRepository; import com.woowacourse.moamoa.studyroom.query.ReviewDao; import com.woowacourse.moamoa.studyroom.service.ReviewService; import com.woowacourse.moamoa.studyroom.service.SearchingReviewService; -import com.woowacourse.moamoa.studyroom.service.request.review.SizeRequest; -import com.woowacourse.moamoa.studyroom.service.request.review.ReviewRequest; -import com.woowacourse.moamoa.studyroom.service.response.review.ReviewResponse; -import com.woowacourse.moamoa.studyroom.service.response.review.ReviewsResponse; -import com.woowacourse.moamoa.studyroom.service.response.review.WriterResponse; +import com.woowacourse.moamoa.studyroom.service.request.SizeRequest; +import com.woowacourse.moamoa.studyroom.service.request.ReviewRequest; +import com.woowacourse.moamoa.studyroom.service.response.ReviewResponse; +import com.woowacourse.moamoa.studyroom.service.response.ReviewsResponse; +import com.woowacourse.moamoa.studyroom.service.response.WriterResponse; import java.time.LocalDate; import java.util.List; import javax.persistence.EntityManager; diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/query/review/ReviewDaoTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/query/review/ReviewDaoTest.java index 0902df34c..709b319cb 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/query/review/ReviewDaoTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/query/review/ReviewDaoTest.java @@ -28,7 +28,7 @@ import com.woowacourse.moamoa.study.domain.repository.StudyRepository; import com.woowacourse.moamoa.study.service.StudyService; import com.woowacourse.moamoa.study.service.request.StudyRequest; -import com.woowacourse.moamoa.studyroom.domain.repository.review.ReviewRepository; +import com.woowacourse.moamoa.studyroom.domain.review.repository.ReviewRepository; import com.woowacourse.moamoa.studyroom.domain.review.Review; import com.woowacourse.moamoa.studyroom.query.ReviewDao; import com.woowacourse.moamoa.studyroom.query.data.ReviewData; diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/review/BadRequestReviewWebMvcTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/review/BadRequestReviewWebMvcTest.java index 0d41118e6..c207a101b 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/review/BadRequestReviewWebMvcTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/review/BadRequestReviewWebMvcTest.java @@ -6,7 +6,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import com.woowacourse.moamoa.WebMVCTest; -import com.woowacourse.moamoa.studyroom.service.request.review.ReviewRequest; +import com.woowacourse.moamoa.studyroom.service.request.ReviewRequest; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/review/UnauthorizedReviewWebMvcTest.java b/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/review/UnauthorizedReviewWebMvcTest.java index 079b7b349..7ffb8375b 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/review/UnauthorizedReviewWebMvcTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/studyroom/webmvc/review/UnauthorizedReviewWebMvcTest.java @@ -5,7 +5,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import com.woowacourse.moamoa.WebMVCTest; -import com.woowacourse.moamoa.studyroom.service.request.review.ReviewRequest; +import com.woowacourse.moamoa.studyroom.service.request.ReviewRequest; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test;