Skip to content

Commit

Permalink
게시글 상세 조회 기능 구현 (#186)
Browse files Browse the repository at this point in the history
* feat: (#174) 게시글 상세 조회 기능 Dto 구현

* feat: (#174) 게시글 상세 조회 기능 구현 (아직 Post content의 imageUrl 필드는 추가 못함)

* refactor: (#174) response dto에 Post content의 imageUrl 필드 추가

* refactor: (#174) 게시글 내용의 이미지 데이터 처리 로직 추가

* refactor: (#174) dto 관련 클래스들을 패키지로 나누기

* refactor: (#174) 이미 tostring이 있는 record에서 tostring 삭제

* refactor: (#174) stream() 코드를 더 가독성이 높게 하나의 메서드마다 개행을 해주는 것으로 변경

* refactor: (#174) 게시글 작성자가 아닐 시, 상세조회 예외 처리 기능 구현

* refactor: (#174) 로그인 한 회원의 변수명 통일

* refactor: (#174) contentImages가 있는지 확인하는 메서드 명 개선

* refactor: (#174) null 체크 메서드를 isNull에서 nonNull로 개선

* refactor: (#174) 페이징 제외한 원시 타입을 래퍼 클래스로 원복

* refactor: (#174) 출력문 제서
  • Loading branch information
tjdtls690 authored Aug 3, 2023
1 parent 3f75cd4 commit 7ef315f
Show file tree
Hide file tree
Showing 14 changed files with 372 additions and 65 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
import com.votogether.domain.member.entity.Member;
import com.votogether.domain.post.dto.request.PostCreateRequest;
import com.votogether.domain.post.dto.response.PostResponse;
import com.votogether.domain.post.dto.response.VoteOptionStatisticsResponse;
import com.votogether.domain.post.dto.response.detail.PostDetailResponse;
import com.votogether.domain.post.dto.response.vote.VoteOptionStatisticsResponse;
import com.votogether.domain.post.entity.PostClosingType;
import com.votogether.domain.post.entity.PostSortType;
import com.votogether.domain.post.service.PostService;
Expand Down Expand Up @@ -37,15 +38,15 @@ public class PostController {

@Operation(summary = "게시글 작성", description = "게시글을 저장한다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "201", description = "게시물 생성되었습니다."),
@ApiResponse(responseCode = "201", description = "게시글 생성 성공"),
@ApiResponse(responseCode = "400", description = "잘못된 입력입니다.")
})
@PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ResponseEntity<Void> save(
@RequestPart @Valid final PostCreateRequest request,
@RequestPart(required = false) final List<MultipartFile> contentImages,
@RequestPart final List<MultipartFile> optionImages,
@Auth final Member loginMember
@Auth final Member member
) {
System.out.println("PostController.save");

Expand All @@ -59,28 +60,42 @@ public ResponseEntity<Void> save(
System.out.println("optionImages1 = " + optionImages.get(0).getOriginalFilename());
System.out.println("optionImages2 = " + optionImages.get(1).getOriginalFilename());
}
final long postId = postService.save(request, loginMember, contentImages, optionImages);
final long postId = postService.save(request, member, contentImages, optionImages);
return ResponseEntity.created(URI.create("/posts/" + postId)).build();
}

@Operation(summary = "전체 게시글 조회", description = "게시글을 조회한다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "게시글을 조회했습니다."),
@ApiResponse(responseCode = "200", description = "게시글 조회 성공"),
@ApiResponse(responseCode = "400", description = "잘못된 입력입니다.")
})
@GetMapping
public ResponseEntity<List<PostResponse>> getAllPost(
final int page,
final PostClosingType postClosingType,
final PostSortType postSortType,
@Auth final Member loginMember
@Auth final Member member
) {
final List<PostResponse> responses =
postService.getAllPostBySortTypeAndClosingType(loginMember, page, postClosingType, postSortType);
postService.getAllPostBySortTypeAndClosingType(member, page, postClosingType, postSortType);

return ResponseEntity.ok(responses);
}

@Operation(summary = "게시글 상세 조회", description = "한 게시글의 상세를 조회한다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "게시글 조회 성공"),
@ApiResponse(responseCode = "404", description = "존재하지 않는 게시글")
})
@GetMapping("{postId}")
public ResponseEntity<PostDetailResponse> getPost(
@PathVariable final Long postId,
@Auth final Member member
) {
final PostDetailResponse response = postService.getPostById(postId, member);
return ResponseEntity.ok(response);
}

@Operation(summary = "게시글 투표 통계 조회", description = "게시글 투표에 대한 전체 통계를 조회한다.")
@ApiResponses({
@ApiResponse(responseCode = "200", description = "게시글 투표 통계 조회 성공"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,12 @@
import com.votogether.domain.category.entity.Category;

public record CategoryResponse(
long id,
Long id,
String name
) {

public static CategoryResponse of(Category category) {
return new CategoryResponse(category.getId(), category.getName());
}

@Override
public String toString() {
return "CategoryResponse{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@
import com.votogether.domain.post.entity.PostOption;

public record PostOptionResponse(
long optionId,
Long optionId,
String content,
int voteCount,
double votePercent
Integer voteCount,
Double votePercent
) {

public static PostOptionResponse of(
Expand All @@ -22,14 +22,4 @@ public static PostOptionResponse of(
);
}

@Override
public String toString() {
return "OptionResponse{" +
"optionId=" + optionId +
", content='" + content + '\'' +
", voteCount=" + voteCount +
", votePercent=" + votePercent +
'}';
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.fasterxml.jackson.annotation.JsonFormat;
import com.votogether.domain.member.entity.Member;
import com.votogether.domain.post.dto.response.vote.VoteResponse;
import com.votogether.domain.post.entity.Post;
import com.votogether.domain.post.entity.PostBody;
import com.votogether.domain.post.entity.PostCategory;
Expand Down Expand Up @@ -47,7 +48,9 @@ public static PostResponse of(final Post post, final Member loginMember) {
}

private static List<CategoryResponse> getCategories(final Post post) {
return post.getPostCategories().getPostCategories().stream()
return post.getPostCategories()
.getPostCategories()
.stream()
.map(PostCategory::getCategory)
.map(CategoryResponse::of)
.toList();
Expand All @@ -57,7 +60,9 @@ private static List<PostOptionResponse> getOptions(
final Post post,
final Member loginMember
) {
return post.getPostOptions().getPostOptions().stream()
return post.getPostOptions()
.getPostOptions()
.stream()
.map(postOption ->
PostOptionResponse.of(
postOption,
Expand All @@ -68,18 +73,4 @@ private static List<PostOptionResponse> getOptions(
.toList();
}

@Override
public String toString() {
return "PostResponse{" +
"postId=" + postId +
", writer=" + writer +
", title='" + title + '\'' +
", content='" + content + '\'' +
", categories=" + categories +
", createdAt=" + createdAt +
", deadline=" + deadline +
", voteInfo=" + voteInfo +
'}' + "\n\n";
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,4 @@ public static WriterResponse of(final Long id, final String nickname) {
return new WriterResponse(id, nickname);
}

@Override
public String toString() {
return "WriterResponse{" +
"id=" + id +
", nickname='" + nickname + '\'' +
'}';
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
package com.votogether.domain.post.dto.response.detail;

import com.votogether.domain.member.entity.Member;
import com.votogether.domain.post.dto.response.CategoryResponse;
import com.votogether.domain.post.dto.response.WriterResponse;
import com.votogether.domain.post.entity.Post;
import com.votogether.domain.post.entity.PostBody;
import com.votogether.domain.post.entity.PostCategories;
import com.votogether.domain.post.entity.PostCategory;
import com.votogether.domain.post.entity.PostContentImage;
import java.time.LocalDateTime;
import java.util.List;

public record PostDetailResponse(
Long postId,
WriterResponse writer,
String title,
String content,
String imageUrl,
List<CategoryResponse> categories,
LocalDateTime createdAt,
LocalDateTime deadline,
VoteDetailResponse voteInfo
) {

public static PostDetailResponse of(final Post post, final Member loginMember) {
final Member writer = post.getWriter();
final PostBody postBody = post.getPostBody();
final List<PostContentImage> contentImages = postBody.getPostContentImages().getContentImages();
final StringBuilder contentImageUrl = new StringBuilder();

if (!contentImages.isEmpty()) {
contentImageUrl.append(contentImages.get(0).getImageUrl());
}

final PostCategories postCategories = post.getPostCategories();
return new PostDetailResponse(
post.getId(),
WriterResponse.of(writer.getId(), writer.getNickname()),
postBody.getTitle(),
postBody.getContent(),
contentImageUrl.toString(),
getCategories(postCategories.getPostCategories()),
post.getCreatedAt(),
post.getDeadline(),
VoteDetailResponse.of(
post.getPostOptions().getSelectedOptionId(loginMember),
post.getFinalTotalVoteCount(loginMember),
getOptions(post, loginMember)
)
);
}

private static List<CategoryResponse> getCategories(final List<PostCategory> postCategories) {
return postCategories.stream()
.map(PostCategory::getCategory)
.map(CategoryResponse::of)
.toList();
}

private static List<PostOptionDetailResponse> getOptions(
final Post post,
final Member loginMember
) {
return post.getPostOptions().getPostOptions().stream()
.map(postOption ->
PostOptionDetailResponse.of(
postOption,
post.isVisibleVoteResult(loginMember),
post.getFinalTotalVoteCount(loginMember)
)
)
.toList();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.votogether.domain.post.dto.response.detail;

import com.votogether.domain.post.entity.PostOption;

public record PostOptionDetailResponse(
Long optionId,
String content,
String imageUrl,
Integer voteCount,
Double votePercent
) {

public static PostOptionDetailResponse of(
final PostOption postOption,
final Boolean isVisibleVoteResult,
final Long totalVoteCount
) {
return new PostOptionDetailResponse(
postOption.getId(),
postOption.getContent(),
postOption.getImageUrl(),
postOption.getVoteCount(isVisibleVoteResult),
postOption.getVotePercent(totalVoteCount)
);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.votogether.domain.post.dto.response.detail;

import java.util.List;

public record VoteDetailResponse(
Long selectedOptionId,
Long totalVoteCount,
List<PostOptionDetailResponse> options
) {

public static VoteDetailResponse of(
final long selectedOptionId,
final long finalTotalVoteCount,
final List<PostOptionDetailResponse> options
) {
return new VoteDetailResponse(selectedOptionId, finalTotalVoteCount, options);
}

}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.votogether.domain.post.dto.response;
package com.votogether.domain.post.dto.response.vote;

import com.votogether.domain.member.entity.Gender;
import java.util.Map;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.votogether.domain.post.dto.response;
package com.votogether.domain.post.dto.response.vote;

import com.votogether.domain.member.entity.Gender;
import java.util.Arrays;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.votogether.domain.post.dto.response;
package com.votogether.domain.post.dto.response.vote;

import com.votogether.domain.post.dto.response.PostOptionResponse;
import java.util.List;

public record VoteResponse(
Expand Down
Loading

0 comments on commit 7ef315f

Please sign in to comment.