Skip to content

Commit

Permalink
feat: 마이페이지 회원 작성 댓글 목록 조회 시, 카페 별로 필터링되도록 구현 (#136)
Browse files Browse the repository at this point in the history
* feat: 엔티티 영역에서 mapId 가 같은 카페일 경우 동일 카페로 간주하도록 구현

* feat: 자신이 댓글 쓴 카페 목록 조회 시, 카페 별로 grouping 되도록 구현

* test: 기능 구현으로 인해 테스트 변경

* feat: 카페 mapId 에 따른 페이지네이션 처리 구현

* fix: 범위 벗어나는 toIndex 수정

* fix: 범위 잘못된 toIndex 수정

* feat: equals override 메서드 instanceof 이용하도록 구현

---------

Co-authored-by: 김태현 <[email protected]>
  • Loading branch information
kth990303 and kth990303-woowahan authored Dec 1, 2023
1 parent d77d372 commit b2fad09
Show file tree
Hide file tree
Showing 6 changed files with 71 additions and 15 deletions.
17 changes: 17 additions & 0 deletions src/main/java/mocacong/server/domain/Cafe.java
Original file line number Diff line number Diff line change
Expand Up @@ -107,4 +107,21 @@ public void addScore(Score score) {
public void addReview(Review review) {
this.reviews.add(review);
}

@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof Cafe)) {
return false;
}
Cafe cafe = (Cafe) o;
return Objects.equals(mapId, cafe.mapId);
}

@Override
public int hashCode() {
return Objects.hash(mapId);
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
package mocacong.server.dto.response;

import java.util.List;
import java.util.stream.Collectors;
import lombok.*;
import mocacong.server.domain.Cafe;
import mocacong.server.domain.Comment;

@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
Expand All @@ -11,5 +15,12 @@ public class MyCommentCafeResponse {
private String mapId;
private String name;
private String studyType;
private String comment;
private List<String> comments;

public static MyCommentCafeResponse of(Cafe cafe, List<Comment> comments) {
List<String> contents = comments.stream()
.map(Comment::getContent)
.collect(Collectors.toList());
return new MyCommentCafeResponse(cafe.getMapId(), cafe.getName(), cafe.getStudyType(), contents);
}
}
31 changes: 23 additions & 8 deletions src/main/java/mocacong/server/service/CafeService.java
Original file line number Diff line number Diff line change
Expand Up @@ -169,17 +169,32 @@ public MyReviewCafesResponse findMyReviewCafes(Long memberId, Integer page, int
public MyCommentCafesResponse findMyCommentCafes(Long memberId, int page, int count) {
Member member = memberRepository.findById(memberId)
.orElseThrow(NotFoundMemberException::new);
Slice<Comment> comments = commentRepository.findByMemberId(member.getId(), PageRequest.of(page, count));
List<Comment> comments = commentRepository.findAllByMemberId(member.getId());

List<MyCommentCafeResponse> responses = comments.stream()
.map(comment -> new MyCommentCafeResponse(
comment.getCafe().getMapId(),
comment.getCafe().getName(),
comment.getCafe().getStudyType(),
comment.getContent()
))
.collect(Collectors.groupingByConcurrent(Comment::getCafe))
.entrySet()
.stream()
.map(commentsGroupingByCafe ->
MyCommentCafeResponse.of(commentsGroupingByCafe.getKey(), commentsGroupingByCafe.getValue()))
.collect(Collectors.toList());
return new MyCommentCafesResponse(comments.isLast(), responses);

int toIndex = Math.min((page + 1) * count, responses.size());
int fromIndex = Math.min(toIndex, page * count);

return new MyCommentCafesResponse(findIsEnd(page, count, responses), responses.subList(fromIndex, toIndex));
}

/*
* TODO (23.11.11.)
* comments 를 Slice 로 받아온 후 grouping 할 경우 페이지네이션 시 count 보다 적은 데이터 수가 반환될 수 있음.
* 따라서 comments 전체를 받아온 후, mapId로 grouping 해야 한 후 페이지네이션해야 하므로 isLast 여부를 jpa Slice 로 구할 수 없음.
*
* 또한, 현재 mapId가 동일한 카페의 댓글 전체를 리스트로 반환하므로 API 스펙 협의 및 로직 개선 필요.
*/
private boolean findIsEnd(int page, int count, List<MyCommentCafeResponse> responses) {
int lastDataIndex = (page + 1) * count - 1;
return responses.size() - 1 <= lastDataIndex;
}

@CacheEvict(key = "#mapId", value = "cafePreviewCache")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -397,7 +397,10 @@ void findMyCommentCafes() {
.extract()
.as(MyCommentCafesResponse.class);

assertThat(response.getCafes()).hasSize(3);
assertAll(
()->assertThat(response.getCafes()).hasSize(2),
()->assertThat(response.getCafes().get(0).getComments()).containsExactlyInAnyOrder("댓글3")
);
}

@Test
Expand Down
10 changes: 10 additions & 0 deletions src/test/java/mocacong/server/domain/CafeTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,16 @@

class CafeTest {

@Test
@DisplayName("카페 mapId가 같으면 동일 카페로 간주한다")
void equals() {
String cafeMapId = "12345";
Cafe cafe1 = new Cafe(cafeMapId, "케이카페");
Cafe cafe2 = new Cafe(cafeMapId, "이름만다른케이카페");

assertThat(cafe1.equals(cafe2)).isTrue();
}

@Test
@DisplayName("카페에 평점을 기여한 사람이 없으면 0점을 반환한다")
void findScoreWithNoReviews() {
Expand Down
10 changes: 5 additions & 5 deletions src/test/java/mocacong/server/service/CafeServiceTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -487,14 +487,14 @@ void findMyCommentCafes() {
commentRepository.save(new Comment(cafe2, member1, "댓글3"));
commentRepository.save(new Comment(cafe2, member2, "댓글4"));

MyCommentCafesResponse actual = cafeService.findMyCommentCafes(member1.getId(), 0, 5);
MyCommentCafesResponse actual = cafeService.findMyCommentCafes(member1.getId(), 0, 3);

assertAll(
() -> assertThat(actual.getIsEnd()).isTrue(),
() -> assertThat(actual.getCafes()).hasSize(3),
() -> assertThat(actual.getCafes().get(0).getComment()).isEqualTo("댓글1"),
() -> assertThat(actual.getCafes().get(1).getComment()).isEqualTo("댓글2"),
() -> assertThat(actual.getCafes().get(2).getComment()).isEqualTo("댓글3")
// 댓글 수는 3개지만, 카페 종류가 2종류이므로 response size는 2개
() -> assertThat(actual.getCafes()).hasSize(2),
() -> assertThat(actual.getCafes().get(0).getComments()).containsExactlyInAnyOrder("댓글1", "댓글2"),
() -> assertThat(actual.getCafes().get(1).getComments()).containsExactlyInAnyOrder("댓글3")
);
}

Expand Down

0 comments on commit b2fad09

Please sign in to comment.