Skip to content

Commit

Permalink
Merge pull request #93 from uju-in/LIME-168-BE-feed-cursor-feat
Browse files Browse the repository at this point in the history
[LIME-168] 피드 목록 조회 기능 수정
  • Loading branch information
Curry4182 authored May 1, 2024
2 parents 1a5201c + 05d4f35 commit 7548480
Show file tree
Hide file tree
Showing 11 changed files with 138 additions and 112 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.programmers.lime.domains.feed.api;

import org.springdoc.core.annotations.ParameterObject;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
Expand All @@ -9,12 +10,11 @@
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.programmers.lime.common.cursor.CursorSummary;
import com.programmers.lime.common.model.Hobby;
import com.programmers.lime.domains.feed.api.request.FeedCreateRequest;
import com.programmers.lime.domains.feed.api.request.FeedCursorGetRequest;
import com.programmers.lime.domains.feed.api.request.FeedUpdateRequest;
import com.programmers.lime.domains.feed.api.response.FeedCreateResponse;
import com.programmers.lime.domains.feed.api.response.FeedGetByCursorResponse;
Expand Down Expand Up @@ -82,23 +82,15 @@ public ResponseEntity<Void> cancelLikedFeed(@PathVariable final Long feedId) {
return ResponseEntity.ok().build();
}

@Operation(summary = "피드 목록 조회", description = "hobbyName, nickname, sortCondition, CursorRequest을 이용하여 피드 목록 조회 합니다.")
@Operation(summary = "피드 목록 조회", description = "hobbyName, nickname, sortCondition, 커서 id, 페이지 사이지를 이용하여 피드 목록 조회 합니다.")
@GetMapping
public ResponseEntity<FeedGetByCursorResponse> getFeedByCursor(
@RequestParam(required = false) final String hobbyName,
@RequestParam(required = false) final String nickname,
@RequestParam(required = false) final boolean onlyNicknameLikeFeeds,
@RequestParam(required = false) final String sortCondition,
@ModelAttribute @Valid final CursorRequest request
@ParameterObject @ModelAttribute @Valid final FeedCursorGetRequest feedCursorGetRequest,
@ParameterObject @ModelAttribute @Valid final CursorRequest cursorRequest
) {
Hobby hobby = Hobby.from(hobbyName);

CursorSummary<FeedCursorSummaryLike> cursorSummary = feedService.getFeedByCursor(
hobby,
nickname,
onlyNicknameLikeFeeds,
sortCondition,
request.toParameters()
feedCursorGetRequest.toServiceRequest(),
cursorRequest.toParameters()
);
FeedGetByCursorResponse response = FeedGetByCursorResponse.from(cursorSummary);

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.programmers.lime.domains.feed.api.request;

import com.programmers.lime.common.model.Hobby;
import com.programmers.lime.domains.feed.application.dto.request.FeedGetCursorServiceRequest;
import com.programmers.lime.domains.feed.model.FeedSortCondition;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;

public record FeedCursorGetRequest(

@Schema(description = "취미 이름", example = "농구")
String hobbyName,

@Schema(description = "닉네임", example = "test0")
String nickname,

@Schema(description = "정렬 조건", example = "POPULARITY")
String sortCondition

) {
public FeedGetCursorServiceRequest toServiceRequest() {

FeedSortCondition feedSortCondition = FeedSortCondition.from(this.sortCondition);
Hobby hobby = Hobby.from(hobbyName);

return FeedGetCursorServiceRequest.builder()
.nickname(nickname)
.sortCondition(feedSortCondition)
.hobby(hobby)
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
import com.programmers.lime.common.cursor.CursorPageParameters;
import com.programmers.lime.common.cursor.CursorSummary;
import com.programmers.lime.common.model.Hobby;
import com.programmers.lime.domains.feed.api.request.FeedCursorGetRequest;
import com.programmers.lime.domains.feed.application.dto.request.FeedGetCursorServiceRequest;
import com.programmers.lime.domains.feed.application.dto.response.FeedGetRankingServiceResponse;
import com.programmers.lime.domains.feed.application.dto.response.FeedGetServiceResponse;
import com.programmers.lime.domains.feed.implementation.FeedAppender;
Expand Down Expand Up @@ -60,25 +62,16 @@ public void modifyFeed(
}

public CursorSummary<FeedCursorSummaryLike> getFeedByCursor(
final Hobby hobby,
final String nickName,
final boolean onlyNicknameLikeFeeds,
final String sortCondition,
final FeedGetCursorServiceRequest request,
final CursorPageParameters parameters
) {
FeedSortCondition feedSortCondition = FeedSortCondition.from(sortCondition);
Long loginMemberId = memberUtils.getCurrentMemberId();

if (onlyNicknameLikeFeeds && nickName == null) {
throw new BusinessException(ErrorCode.FEED_BAD_LIKE_ONLY_REQUEST);
}

return feedCursorReader.getFeedByCursor(
hobby,
nickName,
onlyNicknameLikeFeeds,
request.hobby(),
request.nickname(),
loginMemberId,
feedSortCondition,
request.sortCondition(),
parameters
);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
package com.programmers.lime.domains.feed.application.dto.request;

import com.programmers.lime.common.model.Hobby;
import com.programmers.lime.domains.feed.model.FeedSortCondition;

import lombok.Builder;

@Builder
public record FeedGetCursorServiceRequest(
Long myPageMemberId,
Long loginMemberId,
String nickname,
FeedSortCondition sortCondition,
Hobby hobby
) {
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.programmers.lime.domains.feed.implementation;

import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

import org.springframework.stereotype.Component;

Expand All @@ -10,6 +12,7 @@
import com.programmers.lime.common.model.Hobby;
import com.programmers.lime.domains.feed.model.FeedCursorSummary;
import com.programmers.lime.domains.feed.model.FeedCursorSummaryLike;
import com.programmers.lime.domains.feed.model.FeedLikeInfo;
import com.programmers.lime.domains.feed.model.FeedSortCondition;
import com.programmers.lime.domains.feed.repository.FeedLikeRepository;
import com.programmers.lime.domains.feed.repository.FeedRepository;
Expand All @@ -26,13 +29,10 @@ public class FeedCursorReader {

private final FeedRepository feedRepository;
private final MemberReader memberReader;
private final FeedLikeRepository feedLikeRepository;
private final FeedReader feedReader;

public CursorSummary<FeedCursorSummaryLike> getFeedByCursor(
final Hobby hobby,
final String nickname,
final boolean onlyNicknameLikeFeeds,
final Long loginMemberId,
final FeedSortCondition sortCondition,
final CursorPageParameters parameters
Expand All @@ -42,25 +42,39 @@ public CursorSummary<FeedCursorSummaryLike> getFeedByCursor(

List<FeedCursorSummary> feedCursorSummaries = feedRepository.findAllByCursor(
nicknameMemberId,
onlyNicknameLikeFeeds,
hobby,
sortCondition,
parameters.cursorId(),
pageSize
);

List<FeedCursorSummaryLike> feedCursorSummaryLikes = feedCursorSummaries.stream().map(
feedCursorSummary -> {
boolean isLike = feedLikeRepository.existsByMemberIdAndFeed(
loginMemberId,
feedReader.read(feedCursorSummary.feedId())
);
List<FeedCursorSummaryLike> feedCursorSummaryLikes = getFeedCursorSummaryLikes(
loginMemberId,
feedCursorSummaries
);

return CursorUtils.getCursorSummaries(feedCursorSummaryLikes);
}

private List<FeedCursorSummaryLike> getFeedCursorSummaryLikes(
final Long loginMemberId,
final List<FeedCursorSummary> feedCursorSummaries
) {
List<Long> feedIds = feedCursorSummaries.stream()
.map(FeedCursorSummary::feedId)
.toList();

Set<Long> feedLikeInfoSet = feedRepository.getFeedLikeInfos(feedIds, loginMemberId)
.stream()
.map(FeedLikeInfo::feedId)
.collect(Collectors.toSet());

return feedCursorSummaries.stream().map(
feedCursorSummary -> {
boolean isLike = feedLikeInfoSet.contains(feedCursorSummary.feedId());
return feedCursorSummary.of(isLike);
}
).toList();

return CursorUtils.getCursorSummaries(feedCursorSummaryLikes);
}

private int getPageSizeByParameter(final CursorPageParameters parameters) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.programmers.lime.domains.feed.model;

public record FeedLikeInfo(
Long feedId,
Long memberId

) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,20 @@

import com.programmers.lime.common.model.Hobby;
import com.programmers.lime.domains.feed.model.FeedCursorSummary;
import com.programmers.lime.domains.feed.model.FeedLikeInfo;
import com.programmers.lime.domains.feed.model.FeedSortCondition;

public interface FeedRepositoryForCursor {
List<FeedCursorSummary> findAllByCursor(
final Long nicknameMemberId,
final boolean onlyNicknameLikeFeeds,
final Hobby hobby,
final FeedSortCondition feedSortCondition,
final String cursorId,
final int pageSize
);

List<FeedLikeInfo> getFeedLikeInfos(
final List<Long> feedIds,
final Long loginMemberId
);
}
Loading

0 comments on commit 7548480

Please sign in to comment.