Skip to content

Commit

Permalink
[#65] feat: 기존 Response 객체 구조 변경 및 ArticlesResponse 생성
Browse files Browse the repository at this point in the history
- inner class 를 갖게하고, 해당 inner class 객체를 JsonProperty 로 json 객체 네임 변경으로 변경
  • Loading branch information
jinyoungchoi95 committed Oct 26, 2021
1 parent 03d9ecf commit 99cb81a
Show file tree
Hide file tree
Showing 6 changed files with 140 additions and 117 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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<Tag> 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<Tag> 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<Tag> 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<Tag> 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())
);
}
}


}
Original file line number Diff line number Diff line change
@@ -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<ArticleResponseNested> articleResponseNesteds;

@JsonProperty("articlesCount")
private int articlesCount;

ArticlesResponse() {
}

private ArticlesResponse(List<ArticleResponseNested> articleResponseNesteds, int articlesCount) {
this.articleResponseNesteds = articleResponseNesteds;
this.articlesCount = articlesCount;
}

public static ArticlesResponse fromPageArticles(Page<Article> articles) {
return new ArticlesResponse(
articles.getContent().stream()
.map(ArticleResponseNested::fromArticle)
.collect(Collectors.toList()),
articles.getSize()
);
}

}
Original file line number Diff line number Diff line change
@@ -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()
);
}

}
Original file line number Diff line number Diff line change
@@ -1,18 +1,14 @@
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 {

@Test
void articleResponseTest() {
ArticleResponse articleResponse = new ArticleResponse();
}

@Test
void authorProfileTest() {
AuthorProfile authorProfile = new AuthorProfile();
ArticleResponseNested articleResponseNested = new ArticleResponseNested();
}

}
Original file line number Diff line number Diff line change
@@ -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();
}

}
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
package com.study.realworld.user.controller.response;

import com.study.realworld.user.controller.response.ProfileResponse.ProfileResponseNested;
import org.junit.jupiter.api.Test;

class ProfileResponseTest {

@Test
void profileResponseTest() {
ProfileResponse profileResponse = new ProfileResponse();
ProfileResponseNested profileResponseNested = new ProfileResponseNested();
}

}

0 comments on commit 99cb81a

Please sign in to comment.