diff --git a/src/main/java/ru/serega6531/packmate/controller/PacketController.java b/src/main/java/ru/serega6531/packmate/controller/PacketController.java index 0192996..e70a38f 100644 --- a/src/main/java/ru/serega6531/packmate/controller/PacketController.java +++ b/src/main/java/ru/serega6531/packmate/controller/PacketController.java @@ -1,12 +1,10 @@ package ru.serega6531.packmate.controller; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import ru.serega6531.packmate.model.Packet; import ru.serega6531.packmate.model.pojo.PacketDto; +import ru.serega6531.packmate.model.pojo.PacketPagination; import ru.serega6531.packmate.service.StreamService; import java.util.List; @@ -24,8 +22,8 @@ public class PacketController { } @PostMapping("/{streamId}") - public List getPacketsForStream(@PathVariable long streamId) { - List packets = streamService.getPackets(streamId); + public List getPacketsForStream(@PathVariable long streamId, @RequestBody PacketPagination pagination) { + List packets = streamService.getPackets(streamId, pagination.getStartingFrom(), pagination.getPageSize()); return packets.stream() .map(streamService::packetToDto) .collect(Collectors.toList()); diff --git a/src/main/java/ru/serega6531/packmate/controller/StreamController.java b/src/main/java/ru/serega6531/packmate/controller/StreamController.java index e8697b8..e0a77fa 100644 --- a/src/main/java/ru/serega6531/packmate/controller/StreamController.java +++ b/src/main/java/ru/serega6531/packmate/controller/StreamController.java @@ -2,7 +2,7 @@ package ru.serega6531.packmate.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; -import ru.serega6531.packmate.model.pojo.Pagination; +import ru.serega6531.packmate.model.pojo.StreamPagination; import ru.serega6531.packmate.model.pojo.StreamDto; import ru.serega6531.packmate.service.StreamService; @@ -22,14 +22,14 @@ public class StreamController { } @PostMapping("/all") - public List getStreams(@RequestBody Pagination pagination) { + public List getStreams(@RequestBody StreamPagination pagination) { return service.findAll(pagination, Optional.empty(), pagination.isFavorites()).stream() .map(service::streamToDto) .collect(Collectors.toList()); } @PostMapping("/{port}") - public List getStreams(@PathVariable int port, @RequestBody Pagination pagination) { + public List getStreams(@PathVariable int port, @RequestBody StreamPagination pagination) { return service.findAll(pagination, Optional.of(port), pagination.isFavorites()).stream() .map(service::streamToDto) .collect(Collectors.toList()); diff --git a/src/main/java/ru/serega6531/packmate/model/pojo/PacketPagination.java b/src/main/java/ru/serega6531/packmate/model/pojo/PacketPagination.java new file mode 100644 index 0000000..4f97c7e --- /dev/null +++ b/src/main/java/ru/serega6531/packmate/model/pojo/PacketPagination.java @@ -0,0 +1,14 @@ +package ru.serega6531.packmate.model.pojo; + +import lombok.Data; +import org.jetbrains.annotations.Nullable; + +@Data +public class PacketPagination { + + @Nullable + private Long startingFrom; + + private int pageSize; + +} diff --git a/src/main/java/ru/serega6531/packmate/model/pojo/Pagination.java b/src/main/java/ru/serega6531/packmate/model/pojo/Pagination.java deleted file mode 100644 index 30fa38d..0000000 --- a/src/main/java/ru/serega6531/packmate/model/pojo/Pagination.java +++ /dev/null @@ -1,23 +0,0 @@ -package ru.serega6531.packmate.model.pojo; - -import lombok.Data; -import org.jetbrains.annotations.Nullable; -import org.springframework.data.domain.Sort; -import ru.serega6531.packmate.model.Pattern; - -@Data -public class Pagination { - - private Sort.Direction direction; - - @Nullable - private Long startingFrom; - - private int pageSize; - - private boolean favorites; // только для стримов, определяет, искать только избранные стримы или все - - @Nullable - private Pattern pattern; // только для стримов, если не null, ищем стримы с этим паттерном - -} diff --git a/src/main/java/ru/serega6531/packmate/model/pojo/StreamPagination.java b/src/main/java/ru/serega6531/packmate/model/pojo/StreamPagination.java new file mode 100644 index 0000000..d78606f --- /dev/null +++ b/src/main/java/ru/serega6531/packmate/model/pojo/StreamPagination.java @@ -0,0 +1,20 @@ +package ru.serega6531.packmate.model.pojo; + +import lombok.Data; +import org.jetbrains.annotations.Nullable; +import ru.serega6531.packmate.model.Pattern; + +@Data +public class StreamPagination { + + @Nullable + private Long startingFrom; + + private int pageSize; + + private boolean favorites; // определяет, искать только избранные стримы или все + + @Nullable + private Pattern pattern; // если не null, ищем стримы с этим паттерном + +} diff --git a/src/main/java/ru/serega6531/packmate/repository/StreamRepository.java b/src/main/java/ru/serega6531/packmate/repository/StreamRepository.java index c971322..1af9dce 100644 --- a/src/main/java/ru/serega6531/packmate/repository/StreamRepository.java +++ b/src/main/java/ru/serega6531/packmate/repository/StreamRepository.java @@ -1,5 +1,6 @@ package ru.serega6531.packmate.repository; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.*; import ru.serega6531.packmate.model.Packet; import ru.serega6531.packmate.model.Stream; @@ -18,9 +19,10 @@ public interface StreamRepository extends JpaRepository, JpaSpecif @Query("SELECT DISTINCT p FROM Packet p " + "LEFT JOIN FETCH p.matches " + "WHERE p.stream.id = :streamId " + + "AND (:startingFrom IS NULL OR p.id > :startingFrom) " + "ORDER BY p.id" ) @QueryHints(@QueryHint(name = org.hibernate.jpa.QueryHints.HINT_PASS_DISTINCT_THROUGH, value = "false")) - List getPackets(long streamId); + List getPackets(long streamId, Long startingFrom, Pageable pageable); } diff --git a/src/main/java/ru/serega6531/packmate/service/StreamService.java b/src/main/java/ru/serega6531/packmate/service/StreamService.java index 752c03d..845ecc5 100644 --- a/src/main/java/ru/serega6531/packmate/service/StreamService.java +++ b/src/main/java/ru/serega6531/packmate/service/StreamService.java @@ -1,10 +1,12 @@ package ru.serega6531.packmate.service; import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.Nullable; import org.modelmapper.ModelMapper; 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.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.jpa.domain.Specification; import org.springframework.scheduling.annotation.Async; @@ -242,8 +244,9 @@ public class StreamService { return saved; } - public List getPackets(long streamId) { - return repository.getPackets(streamId); + public List getPackets(long streamId, @Nullable Long startingFrom, int pageSize) { +// long safeStartingFrom = startingFrom != null ? startingFrom : 0; + return repository.getPackets(streamId, startingFrom, Pageable.ofSize(pageSize)); } /** @@ -259,17 +262,13 @@ public class StreamService { repository.setFavorite(id, favorite); } - public List findAll(Pagination pagination, Optional service, boolean onlyFavorites) { - PageRequest page = PageRequest.of(0, pagination.getPageSize(), pagination.getDirection(), "id"); + public List findAll(StreamPagination pagination, Optional service, boolean onlyFavorites) { + PageRequest page = PageRequest.of(0, pagination.getPageSize(), Sort.Direction.DESC, "id"); Specification spec = Specification.where(null); if (pagination.getStartingFrom() != null) { - if (pagination.getDirection() == Sort.Direction.ASC) { - spec = spec.and(streamIdGreaterThan(pagination.getStartingFrom())); - } else { - spec = spec.and(streamIdLessThan(pagination.getStartingFrom())); - } + spec = spec.and(streamIdLessThan(pagination.getStartingFrom())); } if (service.isPresent()) {