diff --git a/src/main/java/com/depromeet/stonebed/domain/feed/api/FeedController.java b/src/main/java/com/depromeet/stonebed/domain/feed/api/FeedController.java index 67f356a2..6179ab1e 100644 --- a/src/main/java/com/depromeet/stonebed/domain/feed/api/FeedController.java +++ b/src/main/java/com/depromeet/stonebed/domain/feed/api/FeedController.java @@ -2,8 +2,9 @@ import com.depromeet.stonebed.domain.feed.application.FeedService; import com.depromeet.stonebed.domain.feed.dto.request.FeedGetRequest; -import com.depromeet.stonebed.domain.feed.dto.response.FeedContentGetResponse; -import com.depromeet.stonebed.domain.feed.dto.response.FeedGetResponse; +import com.depromeet.stonebed.domain.feed.dto.response.v1.FeedContentGetResponse; +import com.depromeet.stonebed.domain.feed.dto.response.v1.FeedGetResponse; +import com.depromeet.stonebed.domain.feed.dto.response.v2.FeedGetResponseV2; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; @@ -23,6 +24,12 @@ public FeedGetResponse feedFind(@Valid FeedGetRequest request) { return feedService.findFeed(request); } + @Operation(summary = "피드 조회", description = "내 피드를 조회하는 API입니다.") + @GetMapping("/v2") + public FeedGetResponseV2 feedFindV2(@Valid FeedGetRequest request) { + return feedService.findFeedV2(request); + } + @Operation(summary = "단일 피드 조회", description = "단일 피드를 조회하는 API입니다.") @GetMapping("/{recordId}") public FeedContentGetResponse feedFindOne(@PathVariable Long recordId) { diff --git a/src/main/java/com/depromeet/stonebed/domain/feed/application/FeedService.java b/src/main/java/com/depromeet/stonebed/domain/feed/application/FeedService.java index 371ad318..47a2d22c 100644 --- a/src/main/java/com/depromeet/stonebed/domain/feed/application/FeedService.java +++ b/src/main/java/com/depromeet/stonebed/domain/feed/application/FeedService.java @@ -3,8 +3,10 @@ import com.depromeet.stonebed.domain.feed.dao.FeedRepository; import com.depromeet.stonebed.domain.feed.dto.FindFeedDto; import com.depromeet.stonebed.domain.feed.dto.request.FeedGetRequest; -import com.depromeet.stonebed.domain.feed.dto.response.FeedContentGetResponse; -import com.depromeet.stonebed.domain.feed.dto.response.FeedGetResponse; +import com.depromeet.stonebed.domain.feed.dto.response.v1.FeedContentGetResponse; +import com.depromeet.stonebed.domain.feed.dto.response.v1.FeedGetResponse; +import com.depromeet.stonebed.domain.feed.dto.response.v2.FeedContentGetResponseV2; +import com.depromeet.stonebed.domain.feed.dto.response.v2.FeedGetResponseV2; import com.depromeet.stonebed.global.error.ErrorCode; import com.depromeet.stonebed.global.error.exception.CustomException; import java.util.List; @@ -83,4 +85,19 @@ public FeedContentGetResponse findFeedOne(Long recordId) { } return FeedContentGetResponse.from(feedOne); } + + public FeedGetResponseV2 findFeedV2(FeedGetRequest request) { + List feeds = getFeeds(request.cursor(), request.memberId(), request.limit()); + + List feedContentList = + feeds.stream().map(FeedContentGetResponseV2::from).toList(); + + String nextCursor = getNextCursor(feeds, request.limit()); + + if (nextFeedNotExists(feeds, request.memberId())) { + nextCursor = null; + } + + return FeedGetResponseV2.from(feedContentList, nextCursor); + } } diff --git a/src/main/java/com/depromeet/stonebed/domain/feed/dto/response/FeedContentGetResponse.java b/src/main/java/com/depromeet/stonebed/domain/feed/dto/response/v1/FeedContentGetResponse.java similarity index 91% rename from src/main/java/com/depromeet/stonebed/domain/feed/dto/response/FeedContentGetResponse.java rename to src/main/java/com/depromeet/stonebed/domain/feed/dto/response/v1/FeedContentGetResponse.java index b5165147..00427e1d 100644 --- a/src/main/java/com/depromeet/stonebed/domain/feed/dto/response/FeedContentGetResponse.java +++ b/src/main/java/com/depromeet/stonebed/domain/feed/dto/response/v1/FeedContentGetResponse.java @@ -1,4 +1,4 @@ -package com.depromeet.stonebed.domain.feed.dto.response; +package com.depromeet.stonebed.domain.feed.dto.response.v1; import com.depromeet.stonebed.domain.feed.dto.FindFeedDto; import io.swagger.v3.oas.annotations.media.Schema; @@ -17,7 +17,6 @@ public record FeedContentGetResponse( String missionRecordImageUrl, @Schema(description = "미션 기록 생성일") LocalDate createdDate, @Schema(description = "부스트") Long totalBoostCount, - @Schema(description = "댓글 수", example = "12") Integer totalCommentCount, @Schema(description = "미션 기록 컨텐츠") String content) { public static FeedContentGetResponse from(FindFeedDto missionRecord) { return new FeedContentGetResponse( @@ -31,7 +30,6 @@ public static FeedContentGetResponse from(FindFeedDto missionRecord) { missionRecord.missionRecord().getImageUrl(), missionRecord.missionRecord().getCreatedAt().toLocalDate(), missionRecord.totalBoostCount(), - missionRecord.totalCommentCount(), missionRecord.missionRecord().getContent()); } } diff --git a/src/main/java/com/depromeet/stonebed/domain/feed/dto/response/FeedGetResponse.java b/src/main/java/com/depromeet/stonebed/domain/feed/dto/response/v1/FeedGetResponse.java similarity index 86% rename from src/main/java/com/depromeet/stonebed/domain/feed/dto/response/FeedGetResponse.java rename to src/main/java/com/depromeet/stonebed/domain/feed/dto/response/v1/FeedGetResponse.java index 527c47a6..cfd08916 100644 --- a/src/main/java/com/depromeet/stonebed/domain/feed/dto/response/FeedGetResponse.java +++ b/src/main/java/com/depromeet/stonebed/domain/feed/dto/response/v1/FeedGetResponse.java @@ -1,4 +1,4 @@ -package com.depromeet.stonebed.domain.feed.dto.response; +package com.depromeet.stonebed.domain.feed.dto.response.v1; import io.swagger.v3.oas.annotations.media.Schema; import java.util.List; diff --git a/src/main/java/com/depromeet/stonebed/domain/feed/dto/response/v2/FeedContentGetResponseV2.java b/src/main/java/com/depromeet/stonebed/domain/feed/dto/response/v2/FeedContentGetResponseV2.java new file mode 100644 index 00000000..01bbf99a --- /dev/null +++ b/src/main/java/com/depromeet/stonebed/domain/feed/dto/response/v2/FeedContentGetResponseV2.java @@ -0,0 +1,37 @@ +package com.depromeet.stonebed.domain.feed.dto.response.v2; + +import com.depromeet.stonebed.domain.feed.dto.FindFeedDto; +import io.swagger.v3.oas.annotations.media.Schema; +import java.time.LocalDate; + +public record FeedContentGetResponseV2( + @Schema(description = "미션 ID", example = "1") Long missionId, + @Schema(description = "미션 제목", example = "산책하기") String missionTitle, + @Schema(description = "미션 완료 메시지", example = "산책하기 미션을 수행했어요!") + String missionCompleteMessage, + @Schema(description = "미션 기록 ID", example = "1") Long missionRecordId, + @Schema(description = "작성자 ID", example = "1") Long authorId, + @Schema(description = "작성자 프로필 닉네임") String authorProfileNickname, + @Schema(description = "작성자 프로필 이미지 URL") String authorProfileImageUrl, + @Schema(description = "미션 기록 이미지 URL", example = "example.jpeg") + String missionRecordImageUrl, + @Schema(description = "미션 기록 생성일") LocalDate createdDate, + @Schema(description = "부스트") Long totalBoostCount, + @Schema(description = "댓글 수", example = "12") Integer totalCommentCount, + @Schema(description = "미션 기록 컨텐츠") String content) { + public static FeedContentGetResponseV2 from(FindFeedDto missionRecord) { + return new FeedContentGetResponseV2( + missionRecord.mission().getId(), + missionRecord.mission().getTitle(), + missionRecord.mission().getCompleteMessage(), + missionRecord.missionRecord().getId(), + missionRecord.author().getId(), + missionRecord.author().getProfile().getNickname(), + missionRecord.author().getProfile().getProfileImageUrl(), + missionRecord.missionRecord().getImageUrl(), + missionRecord.missionRecord().getCreatedAt().toLocalDate(), + missionRecord.totalBoostCount(), + missionRecord.totalCommentCount(), + missionRecord.missionRecord().getContent()); + } +} diff --git a/src/main/java/com/depromeet/stonebed/domain/feed/dto/response/v2/FeedGetResponseV2.java b/src/main/java/com/depromeet/stonebed/domain/feed/dto/response/v2/FeedGetResponseV2.java new file mode 100644 index 00000000..6fbc7470 --- /dev/null +++ b/src/main/java/com/depromeet/stonebed/domain/feed/dto/response/v2/FeedGetResponseV2.java @@ -0,0 +1,12 @@ +package com.depromeet.stonebed.domain.feed.dto.response.v2; + +import io.swagger.v3.oas.annotations.media.Schema; +import java.util.List; + +public record FeedGetResponseV2( + List list, + @Schema(description = "커서 위치", example = "1") String nextCursor) { + public static FeedGetResponseV2 from(List list, String nextCursor) { + return new FeedGetResponseV2(list, nextCursor); + } +} diff --git a/src/test/java/com/depromeet/stonebed/domain/feed/application/FeedServiceTest.java b/src/test/java/com/depromeet/stonebed/domain/feed/application/FeedServiceTest.java index 41dff0eb..636a3f77 100644 --- a/src/test/java/com/depromeet/stonebed/domain/feed/application/FeedServiceTest.java +++ b/src/test/java/com/depromeet/stonebed/domain/feed/application/FeedServiceTest.java @@ -8,7 +8,7 @@ import com.depromeet.stonebed.domain.feed.dao.FeedRepository; import com.depromeet.stonebed.domain.feed.dto.FindFeedDto; import com.depromeet.stonebed.domain.feed.dto.request.FeedGetRequest; -import com.depromeet.stonebed.domain.feed.dto.response.FeedGetResponse; +import com.depromeet.stonebed.domain.feed.dto.response.v1.FeedGetResponse; import com.depromeet.stonebed.domain.member.domain.Member; import com.depromeet.stonebed.domain.mission.domain.Mission; import com.depromeet.stonebed.domain.missionRecord.domain.MissionRecord;