From b1a13d1270aeb2d90bfaffa6a46b2b670739a304 Mon Sep 17 00:00:00 2001 From: donghae-kim Date: Wed, 20 Sep 2023 17:41:17 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20=EC=95=84=ED=8B=B0=ED=81=B4=20?= =?UTF-8?q?=ED=83=80=EC=9E=85=20=EB=B3=80=EA=B2=BD=20=EB=B0=8F=20response?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../article/application/ArticleService.java | 15 ++++----------- .../article/domain/ArticleFilterType.java | 17 +++++++++++++++++ .../prolog/article/ui/ArticleController.java | 16 +++++----------- .../prolog/article/ui/ArticleResponse.java | 8 +++++--- .../prolog/common/WebConverterConfig.java | 6 +++--- .../article/application/ArticleServiceTest.java | 6 +++--- 6 files changed, 37 insertions(+), 31 deletions(-) create mode 100644 backend/src/main/java/wooteco/prolog/article/domain/ArticleFilterType.java diff --git a/backend/src/main/java/wooteco/prolog/article/application/ArticleService.java b/backend/src/main/java/wooteco/prolog/article/application/ArticleService.java index 3f7ce7cfe..55ec503ce 100644 --- a/backend/src/main/java/wooteco/prolog/article/application/ArticleService.java +++ b/backend/src/main/java/wooteco/prolog/article/application/ArticleService.java @@ -4,6 +4,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import wooteco.prolog.article.domain.Article; +import wooteco.prolog.article.domain.ArticleFilterType; import wooteco.prolog.article.domain.repository.ArticleRepository; import wooteco.prolog.article.ui.ArticleRequest; import wooteco.prolog.article.ui.ArticleResponse; @@ -12,7 +13,6 @@ import wooteco.prolog.login.ui.LoginMember; import wooteco.prolog.member.application.MemberService; import wooteco.prolog.member.domain.Member; -import wooteco.prolog.member.domain.MemberGroupType; import java.util.List; @@ -38,13 +38,6 @@ public Long create(final ArticleRequest articleRequest, final LoginMember loginM return articleRepository.save(article).getId(); } - public List getAll() { - return articleRepository.findAllByOrderByCreatedAtDesc() - .stream() - .map(ArticleResponse::from) - .collect(toList()); - } - @Transactional public void update(final Long id, final ArticleRequest articleRequest, final LoginMember loginMember) { @@ -82,15 +75,15 @@ public void bookmarkArticle(final Long id, final LoginMember loginMember, } } - public List filter(final LoginMember member, final MemberGroupType course, final boolean onlyBookmarked) { + public List getFilteredArticles(final LoginMember member, final ArticleFilterType course, final boolean onlyBookmarked) { if (member.isMember() && onlyBookmarked) { return articleRepository.findArticlesByCourseAndMember(course.getGroupName(), member.getId()).stream() - .map(ArticleResponse::from) + .map(article -> ArticleResponse.of(article,member.getId())) .collect(toList()); } return articleRepository.findArticlesByCourse(course.getGroupName()).stream() - .map(ArticleResponse::from) + .map(article -> ArticleResponse.of(article,member.getId())) .collect(toList()); } } diff --git a/backend/src/main/java/wooteco/prolog/article/domain/ArticleFilterType.java b/backend/src/main/java/wooteco/prolog/article/domain/ArticleFilterType.java new file mode 100644 index 000000000..8eddb65f6 --- /dev/null +++ b/backend/src/main/java/wooteco/prolog/article/domain/ArticleFilterType.java @@ -0,0 +1,17 @@ +package wooteco.prolog.article.domain; + +import lombok.Getter; + +@Getter +public enum ArticleFilterType { + ALL(""), + ANDROID("안드로이드"), + BACKEND("백엔드"), + FRONTEND("프론트엔드"); + + private final String groupName; + + ArticleFilterType(String groupName) { + this.groupName = groupName; + } +} diff --git a/backend/src/main/java/wooteco/prolog/article/ui/ArticleController.java b/backend/src/main/java/wooteco/prolog/article/ui/ArticleController.java index 8c5fa5e26..2ac381fd9 100644 --- a/backend/src/main/java/wooteco/prolog/article/ui/ArticleController.java +++ b/backend/src/main/java/wooteco/prolog/article/ui/ArticleController.java @@ -12,9 +12,9 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import wooteco.prolog.article.application.ArticleService; +import wooteco.prolog.article.domain.ArticleFilterType; import wooteco.prolog.login.domain.AuthMemberPrincipal; import wooteco.prolog.login.ui.LoginMember; -import wooteco.prolog.member.domain.MemberGroupType; import java.net.URI; import java.util.List; @@ -33,12 +33,6 @@ public ResponseEntity createArticles(@RequestBody final ArticleRequest art return ResponseEntity.created(URI.create("/articles/" + id)).build(); } - @GetMapping - public ResponseEntity> getArticles() { - final List allArticles = articleService.getAll(); - return ResponseEntity.ok(allArticles); - } - @PutMapping("/{id}") public ResponseEntity updateArticle(@RequestBody final ArticleRequest articleRequest, @AuthMemberPrincipal final LoginMember member, @@ -62,11 +56,11 @@ public ResponseEntity bookmarkArticle(@PathVariable final Long id, return ResponseEntity.ok().build(); } - @GetMapping("/filter") - public ResponseEntity> filterArticles(@AuthMemberPrincipal final LoginMember member, - @RequestParam("course") final MemberGroupType course, + @GetMapping + public ResponseEntity> getFilteredArticles(@AuthMemberPrincipal final LoginMember member, + @RequestParam("course") final ArticleFilterType course, @RequestParam("onlyBookmarked") boolean onlyBookmarked) { - final List articleResponses = articleService.filter(member, course, onlyBookmarked); + final List articleResponses = articleService.getFilteredArticles(member, course, onlyBookmarked); return ResponseEntity.ok(articleResponses); } diff --git a/backend/src/main/java/wooteco/prolog/article/ui/ArticleResponse.java b/backend/src/main/java/wooteco/prolog/article/ui/ArticleResponse.java index 6d79c7943..19d398ca5 100644 --- a/backend/src/main/java/wooteco/prolog/article/ui/ArticleResponse.java +++ b/backend/src/main/java/wooteco/prolog/article/ui/ArticleResponse.java @@ -16,20 +16,22 @@ public class ArticleResponse { private final String title; private final String url; private final String imageUrl; + private final boolean isBookmarked; @JsonFormat(pattern = "yyyy-MM-dd HH:mm") private final LocalDateTime createdAt; private ArticleResponse() { - this(null, null, null, null, null, null); + this(null, null, null, null, null, false, null); } - public static ArticleResponse from(final Article article) { + public static ArticleResponse of(final Article article, final Long memberId) { final Long id = article.getId(); final String nickName = article.getMember().getNickname(); final String title = article.getTitle().getTitle(); final String url = article.getUrl().getUrl(); final String imageUrl = article.getImageUrl().getUrl(); + final boolean isBookmarked = article.getArticleBookmarks().containBookmark(memberId); final LocalDateTime createdAt = article.getCreatedAt(); - return new ArticleResponse(id, nickName, title, url, imageUrl, createdAt); + return new ArticleResponse(id, nickName, title, url, imageUrl, isBookmarked, createdAt); } } diff --git a/backend/src/main/java/wooteco/prolog/common/WebConverterConfig.java b/backend/src/main/java/wooteco/prolog/common/WebConverterConfig.java index d7d157281..c0277be27 100644 --- a/backend/src/main/java/wooteco/prolog/common/WebConverterConfig.java +++ b/backend/src/main/java/wooteco/prolog/common/WebConverterConfig.java @@ -3,7 +3,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.format.FormatterRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import wooteco.prolog.member.domain.MemberGroupType; +import wooteco.prolog.article.domain.ArticleFilterType; import java.time.LocalDate; import java.time.Month; @@ -21,8 +21,8 @@ public void addFormatters(FormatterRegistry registry) { source -> LocalDate.parse(source, DateTimeFormatter.BASIC_ISO_DATE) ); - registry.addConverter(String.class, MemberGroupType.class, - source -> MemberGroupType.valueOf(source.toUpperCase()) + registry.addConverter(String.class, ArticleFilterType.class, + source -> ArticleFilterType.valueOf(source.toUpperCase()) ); } } diff --git a/backend/src/test/java/wooteco/prolog/article/application/ArticleServiceTest.java b/backend/src/test/java/wooteco/prolog/article/application/ArticleServiceTest.java index 00b94cb45..1d5c4a366 100644 --- a/backend/src/test/java/wooteco/prolog/article/application/ArticleServiceTest.java +++ b/backend/src/test/java/wooteco/prolog/article/application/ArticleServiceTest.java @@ -10,6 +10,7 @@ import org.mockito.junit.jupiter.MockitoExtension; import wooteco.prolog.article.domain.Article; import wooteco.prolog.article.domain.ArticleBookmarks; +import wooteco.prolog.article.domain.ArticleFilterType; import wooteco.prolog.article.domain.ImageUrl; import wooteco.prolog.article.domain.Title; import wooteco.prolog.article.domain.Url; @@ -20,7 +21,6 @@ import wooteco.prolog.login.ui.LoginMember; import wooteco.prolog.member.application.MemberService; import wooteco.prolog.member.domain.Member; -import wooteco.prolog.member.domain.MemberGroupType; import wooteco.prolog.member.domain.Role; import java.util.Arrays; @@ -251,7 +251,7 @@ void filter() { when(articleRepository.findArticlesByCourse(any())).thenReturn(Arrays.asList(article)); //when - final List articleResponses = articleService.filter(unLoginMember, MemberGroupType.BACKEND, false); + final List articleResponses = articleService.getFilteredArticles(unLoginMember, ArticleFilterType.BACKEND, false); //then verify(articleRepository).findArticlesByCourse(any()); @@ -269,7 +269,7 @@ void filter_isBookmarked() { when(articleRepository.findArticlesByCourseAndMember(any(), any())).thenReturn(Arrays.asList(article)); //when - final List articleResponses = articleService.filter(loginMember, MemberGroupType.BACKEND, true); + final List articleResponses = articleService.getFilteredArticles(loginMember, ArticleFilterType.BACKEND, true); //then verify(articleRepository).findArticlesByCourseAndMember(any(), any());