diff --git a/src/main/java/konkuk/chacall/domain/member/application/foodtruck/SavedFoodTruckService.java b/src/main/java/konkuk/chacall/domain/member/application/foodtruck/SavedFoodTruckService.java index 05b5209..4dd7973 100644 --- a/src/main/java/konkuk/chacall/domain/member/application/foodtruck/SavedFoodTruckService.java +++ b/src/main/java/konkuk/chacall/domain/member/application/foodtruck/SavedFoodTruckService.java @@ -61,10 +61,12 @@ public CursorPagingResponse getSavedFoodTrucks(CursorPag // 응답 DTO로 변환 List responses = savedFoodTrucks.stream() - .map(SavedFoodTruck::getFoodTruck) .map(SavedFoodTruckResponse::of) .toList(); - return CursorPagingResponse.of(responses, SavedFoodTruckResponse::foodTruckId, savedFoodTruckSlice.hasNext()); + // 전체 저장 푸드트럭 갯수 조회 + long totalSize = savedFoodTruckRepository.countByMemberAndFoodTruckViewedStatus(member, FoodTruckViewedStatus.ON); + + return CursorPagingResponse.of(responses, SavedFoodTruckResponse::savedFoodTruckId, savedFoodTruckSlice.hasNext(), totalSize); } } diff --git a/src/main/java/konkuk/chacall/domain/member/domain/repository/SavedFoodTruckRepository.java b/src/main/java/konkuk/chacall/domain/member/domain/repository/SavedFoodTruckRepository.java index 089cb30..bfabbb9 100644 --- a/src/main/java/konkuk/chacall/domain/member/domain/repository/SavedFoodTruckRepository.java +++ b/src/main/java/konkuk/chacall/domain/member/domain/repository/SavedFoodTruckRepository.java @@ -58,4 +58,10 @@ select exists ( """) boolean existsByMemberIdAndFoodTruckId(@Param("userId") Long userId, @Param("foodTruckId") Long foodTruckId); + + @Query("SELECT COUNT(sft) FROM SavedFoodTruck sft " + + "WHERE sft.member = :member " + + "AND sft.foodTruck.foodTruckViewedStatus = :status") + long countByMemberAndFoodTruckViewedStatus(@Param("member") User member, + @Param("status") FoodTruckViewedStatus status); } diff --git a/src/main/java/konkuk/chacall/domain/member/presentation/dto/response/SavedFoodTruckResponse.java b/src/main/java/konkuk/chacall/domain/member/presentation/dto/response/SavedFoodTruckResponse.java index df344d0..6183db2 100644 --- a/src/main/java/konkuk/chacall/domain/member/presentation/dto/response/SavedFoodTruckResponse.java +++ b/src/main/java/konkuk/chacall/domain/member/presentation/dto/response/SavedFoodTruckResponse.java @@ -1,8 +1,10 @@ package konkuk.chacall.domain.member.presentation.dto.response; +import com.fasterxml.jackson.annotation.JsonIgnore; import io.swagger.v3.oas.annotations.media.Schema; import konkuk.chacall.domain.foodtruck.domain.model.FoodTruck; import konkuk.chacall.domain.foodtruck.domain.value.FoodTruckInfo; +import konkuk.chacall.domain.member.domain.SavedFoodTruck; import java.util.List; @@ -20,9 +22,14 @@ public record SavedFoodTruckResponse( @Schema(description = "푸드트럭 평균 평점", example = "4.5") Double averageRating, @Schema(description = "푸드트럭 평점 수", example = "100") - Integer ratingCount + Integer ratingCount, + + @JsonIgnore + @Schema(hidden = true, description = "커서 계산용 내부 필드 (응답에 미포함)") + Long savedFoodTruckId ) { - public static SavedFoodTruckResponse of(FoodTruck foodTruck) { + public static SavedFoodTruckResponse of(SavedFoodTruck savedFoodTruck) { + FoodTruck foodTruck = savedFoodTruck.getFoodTruck(); FoodTruckInfo foodTruckInfo = foodTruck.getFoodTruckInfo(); return new SavedFoodTruckResponse( foodTruck.getFoodTruckId(), @@ -31,7 +38,8 @@ public static SavedFoodTruckResponse of(FoodTruck foodTruck) { foodTruckInfo.getDescription(), foodTruckInfo.getMenuCategoryList().getMenuCategoryLabelList(), foodTruck.getRatingInfo().getAverageRating(), - foodTruck.getRatingInfo().getRatingCount() + foodTruck.getRatingInfo().getRatingCount(), + savedFoodTruck.getSavedFoodTruckId() ); } } diff --git a/src/main/java/konkuk/chacall/global/common/dto/CursorPagingResponse.java b/src/main/java/konkuk/chacall/global/common/dto/CursorPagingResponse.java index c399156..679b13e 100644 --- a/src/main/java/konkuk/chacall/global/common/dto/CursorPagingResponse.java +++ b/src/main/java/konkuk/chacall/global/common/dto/CursorPagingResponse.java @@ -5,14 +5,24 @@ public record CursorPagingResponse( List content, Long lastCursor, - boolean hasNext + boolean hasNext, + Long totalSize ) { public static CursorPagingResponse of( List content, CursorExtractor extractor, boolean hasNext + ) { + return of(content, extractor, hasNext, null); + } + + public static CursorPagingResponse of( + List content, + CursorExtractor extractor, + boolean hasNext, + Long totalSize ) { Long lastCursor = (content == null || content.isEmpty()) ? null : extractor.extractCursor(content.get(content.size() - 1)); - return new CursorPagingResponse<>(content, lastCursor, hasNext); + return new CursorPagingResponse<>(content, lastCursor, hasNext, totalSize); } } \ No newline at end of file