diff --git a/src/main/java/org/atdev/artrip/domain/exhibit/repository/ExhibitRepositoryCustom.java b/src/main/java/org/atdev/artrip/domain/exhibit/repository/ExhibitRepositoryCustom.java index 81fd2c7..0746162 100644 --- a/src/main/java/org/atdev/artrip/domain/exhibit/repository/ExhibitRepositoryCustom.java +++ b/src/main/java/org/atdev/artrip/domain/exhibit/repository/ExhibitRepositoryCustom.java @@ -13,7 +13,7 @@ @Repository public interface ExhibitRepositoryCustom { - Slice findExhibitByFilters(ExhibitFilterRequest filter, Pageable pageable, Long cursorId); + Slice findExhibitByFilters(ExhibitFilterRequest filter, Long size, Long cursorId); List findRandomExhibits(RandomExhibitRequest condition); diff --git a/src/main/java/org/atdev/artrip/domain/exhibit/repository/ExhibitRepositoryImpl.java b/src/main/java/org/atdev/artrip/domain/exhibit/repository/ExhibitRepositoryImpl.java index 4023e47..51ef40b 100644 --- a/src/main/java/org/atdev/artrip/domain/exhibit/repository/ExhibitRepositoryImpl.java +++ b/src/main/java/org/atdev/artrip/domain/exhibit/repository/ExhibitRepositoryImpl.java @@ -31,7 +31,7 @@ public class ExhibitRepositoryImpl implements ExhibitRepositoryCustom{ private final JPAQueryFactory queryFactory; @Override - public Slice findExhibitByFilters(ExhibitFilterRequest dto, Pageable pageable, Long cursorId) { + public Slice findExhibitByFilters(ExhibitFilterRequest dto, Long size, Long cursorId) { QExhibit e = QExhibit.exhibit; QExhibitHall h = QExhibitHall.exhibitHall; @@ -74,16 +74,18 @@ public Slice findExhibitByFilters(ExhibitFilterRequest dto, Pageable pa styleIn(dto.getStyles()) ) .orderBy(sortFilter(dto, e, f)) - .limit(pageable.getPageSize() + 1) + .limit(size+1) .groupBy(e.exhibitId) .fetch(); - boolean hasNext = content.size() > pageable.getPageSize(); - if (hasNext) content.remove(pageable.getPageSize()); + boolean hasNext = content.size() > size; - return new SliceImpl<>(content, pageable, hasNext); - } + if (hasNext) + content.remove(size.intValue()); + + return new SliceImpl<>(content, PageRequest.of(0, size.intValue()), hasNext); + }// 페이지 개념은 사용 x @Override public List findRandomExhibits(RandomExhibitRequest c) { @@ -127,18 +129,19 @@ public List findRandomExhibits(RandomExhibitRequest c) { private BooleanExpression cursorCondition(Exhibit cursor, long cursorFavoriteCount, SortType sortType, QExhibit e, QFavoriteExhibit f) { if (cursor == null) return null; + if (sortType == null) sortType = SortType.LATEST; return switch (sortType) { - case POPULAR -> f.favoriteId.count().loe(cursorFavoriteCount) + case POPULAR -> f.favoriteId.count().loe(cursorFavoriteCount)//<= .or(f.favoriteId.count().eq(cursorFavoriteCount) - .and(e.exhibitId.lt(cursor.getExhibitId()))); + .and(e.exhibitId.lt(cursor.getExhibitId())));//< - case LATEST -> e.createdAt.lt(cursor.getCreatedAt()) - .or(e.createdAt.eq(cursor.getCreatedAt()) + case LATEST -> e.startDate.lt(cursor.getStartDate()) + .or(e.startDate.eq(cursor.getStartDate()) .and(e.exhibitId.lt(cursor.getExhibitId()))); - case ENDING_SOON -> e.endDate.gt(cursor.getEndDate()) + default -> e.endDate.gt(cursor.getEndDate()) .or(e.endDate.eq(cursor.getEndDate()) .and(e.exhibitId.lt(cursor.getExhibitId()))); }; @@ -147,23 +150,24 @@ private BooleanExpression cursorCondition(Exhibit cursor, long cursorFavoriteCo private OrderSpecifier[] sortFilter(ExhibitFilterRequest dto, QExhibit e, QFavoriteExhibit f) { if (dto.getSortType() == null) { - return new OrderSpecifier[]{e.createdAt.desc()}; + return new OrderSpecifier[]{e.startDate.desc(), e.exhibitId.desc()}; } switch (dto.getSortType()) { case POPULAR: return new OrderSpecifier[]{ - f.favoriteId.count().desc().nullsLast(), // 인기순 - e.createdAt.desc() // 동률일 때 최신순 + f.favoriteId.count().desc().nullsLast(), + e.exhibitId.desc() }; -// case LATEST: -// return new OrderSpecifier[]{e.createdAt.desc()}; case ENDING_SOON: - return new OrderSpecifier[]{e.endDate.asc()}; + return new OrderSpecifier[]{ + e.endDate.asc(), + e.exhibitId.desc() + }; default: - return new OrderSpecifier[]{e.createdAt.desc()}; + return new OrderSpecifier[]{e.startDate.desc(),e.exhibitId.desc()}; } } diff --git a/src/main/java/org/atdev/artrip/domain/exhibit/web/controller/ExhibitController.java b/src/main/java/org/atdev/artrip/domain/exhibit/web/controller/ExhibitController.java index 166f0d7..6e3d735 100644 --- a/src/main/java/org/atdev/artrip/domain/exhibit/web/controller/ExhibitController.java +++ b/src/main/java/org/atdev/artrip/domain/exhibit/web/controller/ExhibitController.java @@ -110,10 +110,10 @@ public ResponseEntity>> getDomestic2(){ @PostMapping("/filter") public ResponseEntity getDomesticFilter(@RequestBody ExhibitFilterRequest dto, @RequestParam(required = false) Long cursor, - @PageableDefault(size = 20) Pageable pageable, + @RequestParam(defaultValue = "20") Long size, @AuthenticationPrincipal UserDetails userDetails) { Long userId = getUserId(userDetails); - FilterResponse exhibits = homeService.getFilterExhibit(dto, pageable, cursor,userId); + FilterResponse exhibits = homeService.getFilterExhibit(dto, size, cursor,userId); return ResponseEntity.ok(exhibits); diff --git a/src/main/java/org/atdev/artrip/domain/exhibit/web/dto/response/ExhibitFilterResponse.java b/src/main/java/org/atdev/artrip/domain/exhibit/web/dto/response/ExhibitFilterResponse.java new file mode 100644 index 0000000..4ee3da8 --- /dev/null +++ b/src/main/java/org/atdev/artrip/domain/exhibit/web/dto/response/ExhibitFilterResponse.java @@ -0,0 +1,16 @@ +package org.atdev.artrip.domain.exhibit.web.dto.response; + + +import lombok.Builder; +import lombok.Getter; +import org.atdev.artrip.domain.exhibit.data.Exhibit; + +import java.util.List; + +@Getter +@Builder +public class ExhibitFilterResponse { + private List content; + private Long nextCursorId; + private boolean hasNext; +} \ No newline at end of file diff --git a/src/main/java/org/atdev/artrip/domain/home/converter/HomeConverter.java b/src/main/java/org/atdev/artrip/domain/home/converter/HomeConverter.java index 416f198..086c19d 100644 --- a/src/main/java/org/atdev/artrip/domain/home/converter/HomeConverter.java +++ b/src/main/java/org/atdev/artrip/domain/home/converter/HomeConverter.java @@ -30,7 +30,7 @@ public FilterResponse toFilterResponse(Slice slice, Set favorites .map(exhibit -> toHomeExhibitListResponse(exhibit, favorites.contains(exhibit.getExhibitId()))) .toList(); - Long nextCursor = slice.hasNext() + Long nextCursor = slice.hasNext() && !slice.isEmpty() ? slice.getContent().get(slice.getContent().size() - 1).getExhibitId() : null; diff --git a/src/main/java/org/atdev/artrip/domain/home/service/HomeService.java b/src/main/java/org/atdev/artrip/domain/home/service/HomeService.java index 763ae18..c64955a 100644 --- a/src/main/java/org/atdev/artrip/domain/home/service/HomeService.java +++ b/src/main/java/org/atdev/artrip/domain/home/service/HomeService.java @@ -28,7 +28,6 @@ import org.springframework.transaction.annotation.Transactional; import java.util.*; -import java.util.stream.Collectors; @Service @RequiredArgsConstructor @@ -83,9 +82,9 @@ public List getRegions() { //필터 전체 조회 - public FilterResponse getFilterExhibit(ExhibitFilterRequest dto, Pageable pageable, Long cursorId, Long userId) { + public FilterResponse getFilterExhibit(ExhibitFilterRequest dto, Long size, Long cursorId, Long userId) { - Slice slice = exhibitRepository.findExhibitByFilters(dto, pageable, cursorId); + Slice slice = exhibitRepository.findExhibitByFilters(dto, size, cursorId); Set favoriteIds = getFavoriteIds(userId); return homeConverter.toFilterResponse(slice, favoriteIds); } diff --git a/src/main/java/org/atdev/artrip/domain/review/repository/ReviewRepository.java b/src/main/java/org/atdev/artrip/domain/review/repository/ReviewRepository.java index 8f10e35..8b4be2c 100644 --- a/src/main/java/org/atdev/artrip/domain/review/repository/ReviewRepository.java +++ b/src/main/java/org/atdev/artrip/domain/review/repository/ReviewRepository.java @@ -24,7 +24,7 @@ Slice findByUserIdAndIdLessThan(@Param("userId") Long userId, Pageable pageable); @Query("select r from Review r where r.exhibit.exhibitId = :exhibitId order by r.reviewId desc") - Slice findTopByExhibitId(@Param("exhibitId") Long exhibitId, Pageable pageable); + Slice findByExhibitId(@Param("exhibitId") Long exhibitId, Pageable pageable); @Query("select r from Review r where r.exhibit.exhibitId = :exhibitId and r.reviewId < :cursor order by r.reviewId desc") Slice findByExhibitIdAndIdLessThan(@Param("exhibitId") Long exhibitId, diff --git a/src/main/java/org/atdev/artrip/domain/review/service/ReviewService.java b/src/main/java/org/atdev/artrip/domain/review/service/ReviewService.java index e2b156c..15e92c9 100644 --- a/src/main/java/org/atdev/artrip/domain/review/service/ReviewService.java +++ b/src/main/java/org/atdev/artrip/domain/review/service/ReviewService.java @@ -177,7 +177,7 @@ public ExhibitReviewSliceResponse getExhibitReview(Long exhibitId, Long cursor, Slice slice; if (cursor == null) { - slice = reviewRepository.findTopByExhibitId(exhibitId, PageRequest.ofSize(size)); + slice = reviewRepository.findByExhibitId(exhibitId, PageRequest.ofSize(size)); } else { slice = reviewRepository.findByExhibitIdAndIdLessThan(exhibitId, cursor, PageRequest.ofSize(size)); } diff --git a/src/main/java/org/atdev/artrip/domain/user/web/controller/UserController.java b/src/main/java/org/atdev/artrip/domain/user/web/controller/UserController.java index a13795e..9288b0f 100644 --- a/src/main/java/org/atdev/artrip/domain/user/web/controller/UserController.java +++ b/src/main/java/org/atdev/artrip/domain/user/web/controller/UserController.java @@ -2,15 +2,12 @@ import io.swagger.v3.oas.annotations.Operation; import lombok.RequiredArgsConstructor; -import org.atdev.artrip.domain.keyword.service.KeywordService; -import org.atdev.artrip.domain.keyword.web.dto.KeywordRequest; import org.atdev.artrip.domain.user.service.UserService; import org.atdev.artrip.domain.user.web.dto.request.NicknameRequest; import org.atdev.artrip.domain.user.web.dto.response.MypageResponse; import org.atdev.artrip.domain.user.web.dto.response.NicknameResponse; import org.atdev.artrip.global.apipayload.CommonResponse; import org.atdev.artrip.global.apipayload.code.status.CommonError; -import org.atdev.artrip.global.apipayload.code.status.KeywordError; import org.atdev.artrip.global.apipayload.code.status.UserError; import org.atdev.artrip.global.s3.web.dto.request.ImageResizeRequest; import org.atdev.artrip.global.swagger.ApiErrorResponses;