diff --git a/purithm/src/main/java/com/example/purithm/domain/filter/controller/FilterControllerDocs.java b/purithm/src/main/java/com/example/purithm/domain/filter/controller/FilterControllerDocs.java index be84fde..0332a4b 100644 --- a/purithm/src/main/java/com/example/purithm/domain/filter/controller/FilterControllerDocs.java +++ b/purithm/src/main/java/com/example/purithm/domain/filter/controller/FilterControllerDocs.java @@ -29,7 +29,9 @@ public SuccessResponse getFilters( examples = {@ExampleObject(name = "최신순", summary = "최신순 정렬", value = "latest"), @ExampleObject(name = "오래된순", summary = "오래된순 정렬", value = "earliest"), - @ExampleObject(name = "퓨어지수 높은순", summary = "퓨어지수 높은순 정렬", value = "popular")}) String sortedBy, + @ExampleObject(name = "퓨어지수 높은순", summary = "퓨어지수 높은순 정렬", value = "popular"), + @ExampleObject(name = "이름순", summary = "이름순 정렬", value = "name"), + @ExampleObject(name = "등급 낮은순", summary = "등급 낮은순 정렬", value = "membership")}) String sortedBy, @RequestParam(value = "page") int page, @RequestParam(value = "size") int size ); diff --git a/purithm/src/main/java/com/example/purithm/domain/filter/repository/CustomFilterRepository.java b/purithm/src/main/java/com/example/purithm/domain/filter/repository/CustomFilterRepository.java index a6595e5..28e8af9 100644 --- a/purithm/src/main/java/com/example/purithm/domain/filter/repository/CustomFilterRepository.java +++ b/purithm/src/main/java/com/example/purithm/domain/filter/repository/CustomFilterRepository.java @@ -12,4 +12,6 @@ public interface CustomFilterRepository { Page findAllWithLikeSorting(OS os, Tag tag, Long photographerId, Pageable pageable); Page findAllWithReviewSorting(OS os, Tag tag, Long photographerId, Pageable pageable); Page findAllWithViewsSorting(OS os, Long photographerId, Pageable pageable); + Page findAllWithNameSorting(OS os, Tag tag, Long photographerId, Pageable pageable); + Page findAllWithMembershipSorting(OS os, Tag tag, Long photographerId, Pageable pageable); } diff --git a/purithm/src/main/java/com/example/purithm/domain/filter/repository/CustomFilterRepositoryImpl.java b/purithm/src/main/java/com/example/purithm/domain/filter/repository/CustomFilterRepositoryImpl.java index 87085d7..7d64e3e 100644 --- a/purithm/src/main/java/com/example/purithm/domain/filter/repository/CustomFilterRepositoryImpl.java +++ b/purithm/src/main/java/com/example/purithm/domain/filter/repository/CustomFilterRepositoryImpl.java @@ -30,14 +30,7 @@ public class CustomFilterRepositoryImpl implements CustomFilterRepository { @Override public Page findAllByOs(OS os, Tag tag, Long photographerId, Pageable pageable) { - BooleanBuilder builder = new BooleanBuilder(); - builder.and(filter.os.eq(os)); - if (tag != null) { - builder.and(filter.tag.eq(tag)); - } - if (photographerId != null) { - builder.and(filter.photographer.id.eq(photographerId)); - } + BooleanBuilder builder = this.createBuilder(os, tag, photographerId); List results = jpaQueryFactory .selectFrom(filter) @@ -57,14 +50,7 @@ public Page findAllByOs(OS os, Tag tag, Long photographerId, Pageable pa @Override public Page findAllWithLikeSorting(OS os, Tag tag, Long photographerId, Pageable pageable) { - BooleanBuilder builder = new BooleanBuilder(); - builder.and(filter.os.eq(os)); - if (tag != null) { - builder.and(filter.tag.eq(tag)); - } - if (photographerId != null) { - builder.and(filter.photographer.id.eq(photographerId)); - } + BooleanBuilder builder = this.createBuilder(os, tag, photographerId); List tuples = jpaQueryFactory .select(filter, filterLike.count()) @@ -93,14 +79,7 @@ public Page findAllWithLikeSorting(OS os, Tag tag, Long photographerId @Override public Page findAllWithReviewSorting(OS os, Tag tag, Long photographerId, Pageable pageable) { - BooleanBuilder builder = new BooleanBuilder(); - builder.and(filter.os.eq(os)); - if (tag != null) { - builder.and(filter.tag.eq(tag)); - } - if (photographerId != null) { - builder.and(filter.photographer.id.eq(photographerId)); - } + BooleanBuilder builder = this.createBuilder(os, tag, photographerId); List tuples = jpaQueryFactory .select(filter, review.pureDegree.avg().as("avg")) @@ -129,11 +108,7 @@ public Page findAllWithReviewSorting(OS os, Tag tag, Long photographer @Override public Page findAllWithViewsSorting(OS os, Long photographerId, Pageable pageable) { - BooleanBuilder builder = new BooleanBuilder(); - builder.and(filter.os.eq(os)); - if (photographerId != null) { - builder.and(filter.photographer.id.eq(photographerId)); - } + BooleanBuilder builder = this.createBuilder(os, null, photographerId); List tuples = jpaQueryFactory .select(filter, userFilterLog.filterId.count().as("count")) @@ -159,4 +134,58 @@ public Page findAllWithViewsSorting(OS os, Long photographerId, Pageab return new PageImpl<>(results, pageable, total); } + + @Override + public Page findAllWithNameSorting(OS os, Tag tag, Long photographerId, Pageable pageable) { + BooleanBuilder builder = this.createBuilder(os, tag, photographerId); + + List results = jpaQueryFactory + .selectFrom(filter) + .where(builder) + .orderBy(filter.name.asc()) + .offset(pageable.getOffset()) + .limit(pageable.getPageSize()) + .fetch(); + + long total = jpaQueryFactory + .select(filter.count()) + .from(filter) + .where(builder).fetchOne(); + + return new PageImpl<>(results, pageable, total); + } + + @Override + public Page findAllWithMembershipSorting(OS os, Tag tag, Long photographerId, Pageable pageable) { + BooleanBuilder builder = this.createBuilder(os, tag, photographerId); + + List results = jpaQueryFactory + .selectFrom(filter) + .where(builder) + .orderBy(filter.membership.asc(), filter.name.asc()) + .offset(pageable.getOffset()) + .limit(pageable.getPageSize()) + .fetch(); + + long total = jpaQueryFactory + .select(filter.count()) + .from(filter) + .where(builder).fetchOne(); + + return new PageImpl<>(results, pageable, total); + } + + private BooleanBuilder createBuilder(OS os, Tag tag, Long photographerId) { + BooleanBuilder builder = new BooleanBuilder(); + + builder.and(filter.os.eq(os)); + if (tag != null) { + builder.and(filter.tag.eq(tag)); + } + if (photographerId != null) { + builder.and(filter.photographer.id.eq(photographerId)); + } + return builder; + } + } diff --git a/purithm/src/main/java/com/example/purithm/domain/filter/service/FilterService.java b/purithm/src/main/java/com/example/purithm/domain/filter/service/FilterService.java index 74f8daf..5d2d295 100644 --- a/purithm/src/main/java/com/example/purithm/domain/filter/service/FilterService.java +++ b/purithm/src/main/java/com/example/purithm/domain/filter/service/FilterService.java @@ -114,6 +114,28 @@ public FilterListDto getFilters(Long id, int page, int size, OS os, Tag tag, Str isLike(((Filter) filter[0]).getId(), id), filterLikeRepository.getLikes((Filter) filter[0]), checkAccess(user.getMembership(), ((Filter)filter[0]).getMembership()))).toList(); + } else if (sortedBy.equals("name")) { + Page filterByName = filterRepository.findAllWithNameSorting(os, tag, photographerId, pageRequest); + isLast = filterByName.isLast(); + totalPage = filterByName.getTotalPages(); + totalElement = filterByName.getTotalElements(); + filterDtos = filterByName.getContent().stream().map(filter -> + FilterDto.of( + filter, + isLike((filter).getId(), id), + filterLikeRepository.getLikes(filter), + checkAccess(user.getMembership(), (filter).getMembership()))).toList(); + } else if (sortedBy.equals("membership")) { + Page filterByName = filterRepository.findAllWithMembershipSorting(os, tag, photographerId, pageRequest); + isLast = filterByName.isLast(); + totalPage = filterByName.getTotalPages(); + totalElement = filterByName.getTotalElements(); + filterDtos = filterByName.getContent().stream().map(filter -> + FilterDto.of( + filter, + isLike((filter).getId(), id), + filterLikeRepository.getLikes(filter), + checkAccess(user.getMembership(), (filter).getMembership()))).toList(); } else { pageRequest = PageRequest.of(page, size, Sort.by("createdAt").descending()); // 정렬 없을 때는 최신 순 Page filterByLatest = filterRepository.findAllByOs(os, tag, photographerId, pageRequest); diff --git a/purithm/src/main/java/com/example/purithm/domain/photographer/controller/PhotographerControllerDocs.java b/purithm/src/main/java/com/example/purithm/domain/photographer/controller/PhotographerControllerDocs.java index 76fd3a2..e05dec9 100644 --- a/purithm/src/main/java/com/example/purithm/domain/photographer/controller/PhotographerControllerDocs.java +++ b/purithm/src/main/java/com/example/purithm/domain/photographer/controller/PhotographerControllerDocs.java @@ -38,7 +38,9 @@ public SuccessResponse getFiltersByPhotographer( examples = {@ExampleObject(name = "최신순", summary = "최신순 정렬", value = "latest"), @ExampleObject(name = "퓨어지수 높은순", summary = "퓨어지수 높은순 정렬", value = "pure"), - @ExampleObject(name = "조회순", summary = "조회순 정렬", value = "views")}) String sortedBy, + @ExampleObject(name = "조회순", summary = "조회순 정렬", value = "views"), + @ExampleObject(name = "이름순", summary = "이름순 정렬", value = "name"), + @ExampleObject(name = "등급 낮은순", summary = "등급 낮은순 정렬", value = "membership")}) String sortedBy, @RequestParam(value = "os", required = true) @Parameter(description = "휴대폰 os", examples = {@ExampleObject(value = "AOS"), @ExampleObject(value = "iOS")}) OS os, @RequestParam(value = "page") int page,