diff --git a/src/main/java/ru/serega6531/packmate/controller/StreamController.java b/src/main/java/ru/serega6531/packmate/controller/StreamController.java index b72cec4..6f50ef7 100644 --- a/src/main/java/ru/serega6531/packmate/controller/StreamController.java +++ b/src/main/java/ru/serega6531/packmate/controller/StreamController.java @@ -7,6 +7,7 @@ import ru.serega6531.packmate.model.pojo.Pagination; import ru.serega6531.packmate.service.StreamService; import java.util.List; +import java.util.Optional; @RestController @RequestMapping("/api/stream/") @@ -21,20 +22,12 @@ public class StreamController { @PostMapping("/all") public List getStreams(@RequestBody Pagination pagination) { - if (pagination.isFavorites()) { - return streamService.findFavorites(pagination); - } else { - return streamService.findAll(pagination); - } + return streamService.findAll(pagination, Optional.empty(), pagination.isFavorites()); } @PostMapping("/{port}") public List getStreams(@PathVariable int port, @RequestBody Pagination pagination) { - if (pagination.isFavorites()) { - return streamService.findFavoritesByService(pagination, port); - } else { - return streamService.findAllByService(pagination, port); - } + return streamService.findAll(pagination, Optional.of(port), pagination.isFavorites()); } @PostMapping("/{id}/favorite") diff --git a/src/main/java/ru/serega6531/packmate/repository/StreamRepository.java b/src/main/java/ru/serega6531/packmate/repository/StreamRepository.java index 4530abb..53eed39 100644 --- a/src/main/java/ru/serega6531/packmate/repository/StreamRepository.java +++ b/src/main/java/ru/serega6531/packmate/repository/StreamRepository.java @@ -1,45 +1,8 @@ package ru.serega6531.packmate.repository; -import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; -import ru.serega6531.packmate.model.Pattern; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import ru.serega6531.packmate.model.Stream; -import java.util.List; - -public interface StreamRepository extends JpaRepository { - - List findAllByIdGreaterThanAndFavoriteIsTrue(long streamId, Pageable pageable); - - List findAllByIdLessThanAndFavoriteIsTrue(long streamId, Pageable pageable); - - List findAllByIdGreaterThanAndFavoriteIsTrueAndFoundPatternsContaining(long streamId, Pattern pattern, Pageable pageable); - - List findAllByIdLessThanAndFavoriteIsTrueAndFoundPatternsContaining(long streamId, Pattern pattern, Pageable pageable); - - List findAllByServiceAndIdGreaterThanAndFavoriteIsTrue(int service, long streamId, Pageable pageable); - - List findAllByServiceAndIdLessThanAndFavoriteIsTrue(int service, long streamId, Pageable pageable); - - List findAllByServiceAndIdGreaterThanAndFavoriteIsTrueAndFoundPatternsContaining(int service, long streamId, Pattern pattern, Pageable pageable); - - List findAllByServiceAndIdLessThanAndFavoriteIsTrueAndFoundPatternsContaining(int service, long streamId, Pattern pattern, Pageable pageable); - - List findAllByIdGreaterThan(long streamId, Pageable pageable); - - List findAllByIdLessThan(long streamId, Pageable pageable); - - List findAllByIdGreaterThanAndFoundPatternsContaining(long streamId, Pattern pattern, Pageable pageable); - - List findAllByIdLessThanAndFoundPatternsContaining(long streamId, Pattern pattern, Pageable pageable); - - List findAllByServiceAndIdGreaterThan(int service, long streamId, Pageable pageable); - - List findAllByServiceAndIdLessThan(int service, long streamId, Pageable pageable); - - List findAllByServiceAndIdGreaterThanAndFoundPatternsContaining(int service, long streamId, Pattern pattern, Pageable pageable); - - List findAllByServiceAndIdLessThanAndFoundPatternsContaining(int service, long streamId, Pattern pattern, Pageable pageable); - - +public interface StreamRepository extends JpaRepository, JpaSpecificationExecutor { } diff --git a/src/main/java/ru/serega6531/packmate/service/StreamService.java b/src/main/java/ru/serega6531/packmate/service/StreamService.java index 1a1811d..af134ee 100644 --- a/src/main/java/ru/serega6531/packmate/service/StreamService.java +++ b/src/main/java/ru/serega6531/packmate/service/StreamService.java @@ -8,6 +8,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; +import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import ru.serega6531.packmate.model.*; @@ -360,76 +361,49 @@ public class StreamService { return null; } - public List findFavorites(Pagination pagination) { + public List findAll(Pagination pagination, Optional service, boolean onlyFavorites) { PageRequest page = PageRequest.of(0, pagination.getPageSize(), pagination.getDirection(), "id"); - if (pagination.getPattern() != null) { // задан паттерн для поиска - if (pagination.getDirection() == Sort.Direction.ASC) { // более новые стримы - return repository.findAllByIdGreaterThanAndFavoriteIsTrueAndFoundPatternsContaining(pagination.getStartingFrom(), pagination.getPattern(), page); - } else { // более старые стримы - return repository.findAllByIdLessThanAndFavoriteIsTrueAndFoundPatternsContaining(pagination.getStartingFrom(), pagination.getPattern(), page); - } + Specification spec; + if(pagination.getDirection() == Sort.Direction.ASC) { + spec = streamIdGreaterThan(pagination.getStartingFrom()); } else { - if (pagination.getDirection() == Sort.Direction.ASC) { // более новые стримы - return repository.findAllByIdGreaterThanAndFavoriteIsTrue(pagination.getStartingFrom(), page); - } else { // более старые стримы - return repository.findAllByIdLessThanAndFavoriteIsTrue(pagination.getStartingFrom(), page); - } + spec = streamIdLessThan(pagination.getStartingFrom()); } + + if(service.isPresent()) { + spec = spec.and(streamServiceEquals(service.get())); + } + + if(onlyFavorites) { + spec = spec.and(streamIsFavorite()); + } + + if(pagination.getPattern() != null) { + spec = spec.and(streamPatternsContains(pagination.getPattern())); + } + + return repository.findAll(spec, page).getContent(); } - public List findFavoritesByService(Pagination pagination, int service) { - PageRequest page = PageRequest.of(0, pagination.getPageSize(), pagination.getDirection(), "id"); - - if (pagination.getPattern() != null) { // задан паттерн для поиска - if (pagination.getDirection() == Sort.Direction.ASC) { // более новые стримы - return repository.findAllByServiceAndIdGreaterThanAndFavoriteIsTrueAndFoundPatternsContaining(service, pagination.getStartingFrom(), pagination.getPattern(), page); - } else { // более старые стримы - return repository.findAllByServiceAndIdLessThanAndFavoriteIsTrueAndFoundPatternsContaining(service, pagination.getStartingFrom(), pagination.getPattern(), page); - } - } else { - if (pagination.getDirection() == Sort.Direction.ASC) { // более новые стримы - return repository.findAllByServiceAndIdGreaterThanAndFavoriteIsTrue(service, pagination.getStartingFrom(), page); - } else { // более старые стримы - return repository.findAllByServiceAndIdLessThanAndFavoriteIsTrue(service, pagination.getStartingFrom(), page); - } - } + private Specification streamServiceEquals(long service) { + return (root, query, cb) -> cb.equal(root.get("service"), service); } - public List findAll(Pagination pagination) { - PageRequest page = PageRequest.of(0, pagination.getPageSize(), pagination.getDirection(), "id"); - - if (pagination.getPattern() != null) { // задан паттерн для поиска - if (pagination.getDirection() == Sort.Direction.ASC) { // более новые стримы - return repository.findAllByIdGreaterThanAndFoundPatternsContaining(pagination.getStartingFrom(), pagination.getPattern(), page); - } else { // более старые стримы - return repository.findAllByIdLessThanAndFoundPatternsContaining(pagination.getStartingFrom(), pagination.getPattern(), page); - } - } else { - if (pagination.getDirection() == Sort.Direction.ASC) { // более новые стримы - return repository.findAllByIdGreaterThan(pagination.getStartingFrom(), page); - } else { // более старые стримы - return repository.findAllByIdLessThan(pagination.getStartingFrom(), page); - } - } + private Specification streamIsFavorite() { + return (root, query, cb) -> cb.equal(root.get("favorite"), true); } - public List findAllByService(Pagination pagination, int service) { - PageRequest page = PageRequest.of(0, pagination.getPageSize(), pagination.getDirection(), "id"); + private Specification streamIdGreaterThan(long id) { + return (root, query, cb) -> cb.greaterThan(root.get("id"), id); + } - if (pagination.getPattern() != null) { // задан паттерн для поиска - if (pagination.getDirection() == Sort.Direction.ASC) { // более новые стримы - return repository.findAllByServiceAndIdGreaterThanAndFoundPatternsContaining(service, pagination.getStartingFrom(), pagination.getPattern(), page); - } else { // более старые стримы - return repository.findAllByServiceAndIdLessThanAndFoundPatternsContaining(service, pagination.getStartingFrom(), pagination.getPattern(), page); - } - } else { - if (pagination.getDirection() == Sort.Direction.ASC) { // более новые стримы - return repository.findAllByServiceAndIdGreaterThan(service, pagination.getStartingFrom(), page); - } else { // более старые стримы - return repository.findAllByServiceAndIdLessThan(service, pagination.getStartingFrom(), page); - } - } + private Specification streamIdLessThan(long id) { + return (root, query, cb) -> cb.lessThan(root.get("id"), id); + } + + private Specification streamPatternsContains(Pattern pattern) { + return (root, query, cb) -> cb.isMember(pattern, root.get("foundPatterns")); } }