From 99cb81a59b62a4d0d20a5ef2997440abbd149609 Mon Sep 17 00:00:00 2001 From: jinyoungchoi95 Date: Wed, 27 Oct 2021 07:51:03 +0900 Subject: [PATCH] =?UTF-8?q?[#65]=20feat:=20=EA=B8=B0=EC=A1=B4=20Response?= =?UTF-8?q?=20=EA=B0=9D=EC=B2=B4=20=EA=B5=AC=EC=A1=B0=20=EB=B3=80=EA=B2=BD?= =?UTF-8?q?=20=EB=B0=8F=20ArticlesResponse=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - inner class 를 갖게하고, 해당 inner class 객체를 JsonProperty 로 json 객체 네임 변경으로 변경 --- .../controller/response/ArticleResponse.java | 124 ++++++++---------- .../controller/response/ArticlesResponse.java | 35 +++++ .../controller/response/ProfileResponse.java | 76 ++++++----- .../response/ArticleResponseTest.java | 8 +- .../response/ArticlesResponseTest.java | 12 ++ .../response/ProfileResponseTest.java | 2 + 6 files changed, 140 insertions(+), 117 deletions(-) create mode 100644 src/main/java/com/study/realworld/article/controller/response/ArticlesResponse.java create mode 100644 src/test/java/com/study/realworld/article/controller/response/ArticlesResponseTest.java diff --git a/src/main/java/com/study/realworld/article/controller/response/ArticleResponse.java b/src/main/java/com/study/realworld/article/controller/response/ArticleResponse.java index 7f0591c1..23667e20 100644 --- a/src/main/java/com/study/realworld/article/controller/response/ArticleResponse.java +++ b/src/main/java/com/study/realworld/article/controller/response/ArticleResponse.java @@ -2,108 +2,88 @@ import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonTypeInfo; -import com.fasterxml.jackson.annotation.JsonTypeName; import com.study.realworld.article.domain.Article; import com.study.realworld.article.domain.Body; import com.study.realworld.article.domain.Description; import com.study.realworld.article.domain.Slug; import com.study.realworld.article.domain.Title; import com.study.realworld.tag.domain.Tag; -import com.study.realworld.user.domain.Bio; -import com.study.realworld.user.domain.Image; -import com.study.realworld.user.domain.Profile; -import com.study.realworld.user.domain.Username; +import com.study.realworld.user.controller.response.ProfileResponse.ProfileResponseNested; import java.time.OffsetDateTime; import java.util.List; -@JsonTypeName(value = "article") -@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) public class ArticleResponse { - @JsonProperty("slug") - private Slug slug; - - @JsonProperty("title") - private Title title; - - @JsonProperty("description") - private Description description; - - @JsonProperty("body") - private Body body; - - @JsonProperty("tagList") - private List tags; - - @JsonProperty("createdAt") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", timezone = "UTC") - private OffsetDateTime createdAt; - - @JsonProperty("updatedAt") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", timezone = "UTC") - private OffsetDateTime updatedAt; - - @JsonProperty("author") - private AuthorProfile authorProfile; + @JsonProperty("article") + private ArticleResponseNested articleResponseNested; ArticleResponse() { } - private ArticleResponse(Slug slug, Title title, Description description, Body body, - List tags, OffsetDateTime createdAt, OffsetDateTime updatedAt, - AuthorProfile authorProfile) { - this.slug = slug; - this.title = title; - this.description = description; - this.body = body; - this.tags = tags; - this.createdAt = createdAt; - this.updatedAt = updatedAt; - this.authorProfile = authorProfile; + private ArticleResponse(ArticleResponseNested articleResponseNested) { + this.articleResponseNested = articleResponseNested; } public static ArticleResponse fromArticle(Article article) { - return new ArticleResponse( - article.slug(), - article.title(), - article.description(), - article.body(), - article.tags(), - article.createdAt(), - article.updatedAt(), - new AuthorProfile(article.author().profile()) - ); + return new ArticleResponse(ArticleResponseNested.fromArticle(article)); } - public static class AuthorProfile { + public static class ArticleResponseNested { - @JsonProperty("username") - private Username username; + @JsonProperty("slug") + private Slug slug; - @JsonProperty("bio") - private Bio bio; + @JsonProperty("title") + private Title title; - @JsonProperty("image") - private Image image; + @JsonProperty("description") + private Description description; - @JsonProperty("following") - private boolean following; + @JsonProperty("body") + private Body body; - AuthorProfile() { - } + @JsonProperty("tagList") + private List tags; + + @JsonProperty("createdAt") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", timezone = "UTC") + private OffsetDateTime createdAt; + + @JsonProperty("updatedAt") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", timezone = "UTC") + private OffsetDateTime updatedAt; - public AuthorProfile(Username username, Bio bio, Image image, boolean following) { - this.username = username; - this.bio = bio; - this.image = image; - this.following = following; + @JsonProperty("author") + private ProfileResponseNested profileResponseNested; + + ArticleResponseNested() { } - public AuthorProfile(Profile profile) { - this(profile.username(), profile.bio(), profile.image(), profile.isFollow()); + private ArticleResponseNested(Slug slug, Title title, Description description, Body body, List tags, + OffsetDateTime createdAt, OffsetDateTime updatedAt, ProfileResponseNested profileResponseNested) { + this.slug = slug; + this.title = title; + this.description = description; + this.body = body; + this.tags = tags; + this.createdAt = createdAt; + this.updatedAt = updatedAt; + this.profileResponseNested = profileResponseNested; } + public static ArticleResponseNested fromArticle(Article article) { + return new ArticleResponseNested( + article.slug(), + article.title(), + article.description(), + article.body(), + article.tags(), + article.createdAt(), + article.updatedAt(), + ProfileResponseNested.ofProfile(article.author().profile()) + ); + } } + } diff --git a/src/main/java/com/study/realworld/article/controller/response/ArticlesResponse.java b/src/main/java/com/study/realworld/article/controller/response/ArticlesResponse.java new file mode 100644 index 00000000..4018033c --- /dev/null +++ b/src/main/java/com/study/realworld/article/controller/response/ArticlesResponse.java @@ -0,0 +1,35 @@ +package com.study.realworld.article.controller.response; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.study.realworld.article.controller.response.ArticleResponse.ArticleResponseNested; +import com.study.realworld.article.domain.Article; +import java.util.List; +import java.util.stream.Collectors; +import org.springframework.data.domain.Page; + +public class ArticlesResponse { + + @JsonProperty("articles") + private List articleResponseNesteds; + + @JsonProperty("articlesCount") + private int articlesCount; + + ArticlesResponse() { + } + + private ArticlesResponse(List articleResponseNesteds, int articlesCount) { + this.articleResponseNesteds = articleResponseNesteds; + this.articlesCount = articlesCount; + } + + public static ArticlesResponse fromPageArticles(Page
articles) { + return new ArticlesResponse( + articles.getContent().stream() + .map(ArticleResponseNested::fromArticle) + .collect(Collectors.toList()), + articles.getSize() + ); + } + +} diff --git a/src/main/java/com/study/realworld/user/controller/response/ProfileResponse.java b/src/main/java/com/study/realworld/user/controller/response/ProfileResponse.java index f540be93..628e8f4c 100644 --- a/src/main/java/com/study/realworld/user/controller/response/ProfileResponse.java +++ b/src/main/java/com/study/realworld/user/controller/response/ProfileResponse.java @@ -1,62 +1,60 @@ package com.study.realworld.user.controller.response; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonTypeInfo; -import com.fasterxml.jackson.annotation.JsonTypeName; import com.study.realworld.user.domain.Bio; import com.study.realworld.user.domain.Image; import com.study.realworld.user.domain.Profile; import com.study.realworld.user.domain.Username; -@JsonTypeName("profile") -@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) public class ProfileResponse { - @JsonProperty("username") - private Username username; + @JsonProperty("profile") + private ProfileResponseNested profileResponseNested; - @JsonProperty("bio") - private Bio bio; - - @JsonProperty("image") - private Image image; - - @JsonProperty("following") - private boolean following; - - protected ProfileResponse() { + ProfileResponse() { } - private ProfileResponse(Username username, Bio bio, Image image, boolean following) { - this.username = username; - this.bio = bio; - this.image = image; - this.following = following; + private ProfileResponse(ProfileResponseNested profileResponseNested) { + this.profileResponseNested = profileResponseNested; } - public Username getUsername() { - return username; + public static ProfileResponse ofProfile(Profile profile) { + return new ProfileResponse(ProfileResponseNested.ofProfile(profile)); } - public Bio getBio() { - return bio; - } + public static class ProfileResponseNested { - public Image getImage() { - return image; - } + @JsonProperty("username") + private Username username; - public boolean isFollowing() { - return following; - } + @JsonProperty("bio") + private Bio bio; + + @JsonProperty("image") + private Image image; + + @JsonProperty("following") + private boolean following; + + ProfileResponseNested() { + } + + private ProfileResponseNested(Username username, Bio bio, Image image, boolean following) { + this.username = username; + this.bio = bio; + this.image = image; + this.following = following; + } + + public static ProfileResponseNested ofProfile(Profile profile) { + return new ProfileResponseNested ( + profile.username(), + profile.bio(), + profile.image(), + profile.isFollow() + ); + } - public static ProfileResponse ofProfile(Profile profile) { - return new ProfileResponse( - profile.username(), - profile.bio(), - profile.image(), - profile.isFollow() - ); } } diff --git a/src/test/java/com/study/realworld/article/controller/response/ArticleResponseTest.java b/src/test/java/com/study/realworld/article/controller/response/ArticleResponseTest.java index 149c9f88..970e71d2 100644 --- a/src/test/java/com/study/realworld/article/controller/response/ArticleResponseTest.java +++ b/src/test/java/com/study/realworld/article/controller/response/ArticleResponseTest.java @@ -1,6 +1,6 @@ package com.study.realworld.article.controller.response; -import com.study.realworld.article.controller.response.ArticleResponse.AuthorProfile; +import com.study.realworld.article.controller.response.ArticleResponse.ArticleResponseNested; import org.junit.jupiter.api.Test; class ArticleResponseTest { @@ -8,11 +8,7 @@ class ArticleResponseTest { @Test void articleResponseTest() { ArticleResponse articleResponse = new ArticleResponse(); - } - - @Test - void authorProfileTest() { - AuthorProfile authorProfile = new AuthorProfile(); + ArticleResponseNested articleResponseNested = new ArticleResponseNested(); } } \ No newline at end of file diff --git a/src/test/java/com/study/realworld/article/controller/response/ArticlesResponseTest.java b/src/test/java/com/study/realworld/article/controller/response/ArticlesResponseTest.java new file mode 100644 index 00000000..f7d503ec --- /dev/null +++ b/src/test/java/com/study/realworld/article/controller/response/ArticlesResponseTest.java @@ -0,0 +1,12 @@ +package com.study.realworld.article.controller.response; + +import org.junit.jupiter.api.Test; + +class ArticlesResponseTest { + + @Test + void articlesResponseTest() { + ArticlesResponse articlesResponse = new ArticlesResponse(); + } + +} \ No newline at end of file diff --git a/src/test/java/com/study/realworld/user/controller/response/ProfileResponseTest.java b/src/test/java/com/study/realworld/user/controller/response/ProfileResponseTest.java index a82a24bf..132bad5c 100644 --- a/src/test/java/com/study/realworld/user/controller/response/ProfileResponseTest.java +++ b/src/test/java/com/study/realworld/user/controller/response/ProfileResponseTest.java @@ -1,5 +1,6 @@ package com.study.realworld.user.controller.response; +import com.study.realworld.user.controller.response.ProfileResponse.ProfileResponseNested; import org.junit.jupiter.api.Test; class ProfileResponseTest { @@ -7,6 +8,7 @@ class ProfileResponseTest { @Test void profileResponseTest() { ProfileResponse profileResponse = new ProfileResponse(); + ProfileResponseNested profileResponseNested = new ProfileResponseNested(); } } \ No newline at end of file