Исправлена пагинация пакетов
This commit is contained in:
@@ -1,12 +1,10 @@
|
|||||||
package ru.serega6531.packmate.controller;
|
package ru.serega6531.packmate.controller;
|
||||||
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.web.bind.annotation.PathVariable;
|
import org.springframework.web.bind.annotation.*;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
|
||||||
import ru.serega6531.packmate.model.Packet;
|
import ru.serega6531.packmate.model.Packet;
|
||||||
import ru.serega6531.packmate.model.pojo.PacketDto;
|
import ru.serega6531.packmate.model.pojo.PacketDto;
|
||||||
|
import ru.serega6531.packmate.model.pojo.PacketPagination;
|
||||||
import ru.serega6531.packmate.service.StreamService;
|
import ru.serega6531.packmate.service.StreamService;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -24,8 +22,8 @@ public class PacketController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@PostMapping("/{streamId}")
|
@PostMapping("/{streamId}")
|
||||||
public List<PacketDto> getPacketsForStream(@PathVariable long streamId) {
|
public List<PacketDto> getPacketsForStream(@PathVariable long streamId, @RequestBody PacketPagination pagination) {
|
||||||
List<Packet> packets = streamService.getPackets(streamId);
|
List<Packet> packets = streamService.getPackets(streamId, pagination.getStartingFrom(), pagination.getPageSize());
|
||||||
return packets.stream()
|
return packets.stream()
|
||||||
.map(streamService::packetToDto)
|
.map(streamService::packetToDto)
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ package ru.serega6531.packmate.controller;
|
|||||||
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.web.bind.annotation.*;
|
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.model.pojo.StreamDto;
|
||||||
import ru.serega6531.packmate.service.StreamService;
|
import ru.serega6531.packmate.service.StreamService;
|
||||||
|
|
||||||
@@ -22,14 +22,14 @@ public class StreamController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@PostMapping("/all")
|
@PostMapping("/all")
|
||||||
public List<StreamDto> getStreams(@RequestBody Pagination pagination) {
|
public List<StreamDto> getStreams(@RequestBody StreamPagination pagination) {
|
||||||
return service.findAll(pagination, Optional.empty(), pagination.isFavorites()).stream()
|
return service.findAll(pagination, Optional.empty(), pagination.isFavorites()).stream()
|
||||||
.map(service::streamToDto)
|
.map(service::streamToDto)
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
@PostMapping("/{port}")
|
@PostMapping("/{port}")
|
||||||
public List<StreamDto> getStreams(@PathVariable int port, @RequestBody Pagination pagination) {
|
public List<StreamDto> getStreams(@PathVariable int port, @RequestBody StreamPagination pagination) {
|
||||||
return service.findAll(pagination, Optional.of(port), pagination.isFavorites()).stream()
|
return service.findAll(pagination, Optional.of(port), pagination.isFavorites()).stream()
|
||||||
.map(service::streamToDto)
|
.map(service::streamToDto)
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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, ищем стримы с этим паттерном
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -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, ищем стримы с этим паттерном
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
package ru.serega6531.packmate.repository;
|
package ru.serega6531.packmate.repository;
|
||||||
|
|
||||||
|
import org.springframework.data.domain.Pageable;
|
||||||
import org.springframework.data.jpa.repository.*;
|
import org.springframework.data.jpa.repository.*;
|
||||||
import ru.serega6531.packmate.model.Packet;
|
import ru.serega6531.packmate.model.Packet;
|
||||||
import ru.serega6531.packmate.model.Stream;
|
import ru.serega6531.packmate.model.Stream;
|
||||||
@@ -18,9 +19,10 @@ public interface StreamRepository extends JpaRepository<Stream, Long>, JpaSpecif
|
|||||||
@Query("SELECT DISTINCT p FROM Packet p " +
|
@Query("SELECT DISTINCT p FROM Packet p " +
|
||||||
"LEFT JOIN FETCH p.matches " +
|
"LEFT JOIN FETCH p.matches " +
|
||||||
"WHERE p.stream.id = :streamId " +
|
"WHERE p.stream.id = :streamId " +
|
||||||
|
"AND (:startingFrom IS NULL OR p.id > :startingFrom) " +
|
||||||
"ORDER BY p.id"
|
"ORDER BY p.id"
|
||||||
)
|
)
|
||||||
@QueryHints(@QueryHint(name = org.hibernate.jpa.QueryHints.HINT_PASS_DISTINCT_THROUGH, value = "false"))
|
@QueryHints(@QueryHint(name = org.hibernate.jpa.QueryHints.HINT_PASS_DISTINCT_THROUGH, value = "false"))
|
||||||
List<Packet> getPackets(long streamId);
|
List<Packet> getPackets(long streamId, Long startingFrom, Pageable pageable);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
package ru.serega6531.packmate.service;
|
package ru.serega6531.packmate.service;
|
||||||
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.modelmapper.ModelMapper;
|
import org.modelmapper.ModelMapper;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.data.domain.PageRequest;
|
import org.springframework.data.domain.PageRequest;
|
||||||
|
import org.springframework.data.domain.Pageable;
|
||||||
import org.springframework.data.domain.Sort;
|
import org.springframework.data.domain.Sort;
|
||||||
import org.springframework.data.jpa.domain.Specification;
|
import org.springframework.data.jpa.domain.Specification;
|
||||||
import org.springframework.scheduling.annotation.Async;
|
import org.springframework.scheduling.annotation.Async;
|
||||||
@@ -242,8 +244,9 @@ public class StreamService {
|
|||||||
return saved;
|
return saved;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Packet> getPackets(long streamId) {
|
public List<Packet> getPackets(long streamId, @Nullable Long startingFrom, int pageSize) {
|
||||||
return repository.getPackets(streamId);
|
// 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);
|
repository.setFavorite(id, favorite);
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Stream> findAll(Pagination pagination, Optional<Integer> service, boolean onlyFavorites) {
|
public List<Stream> findAll(StreamPagination pagination, Optional<Integer> service, boolean onlyFavorites) {
|
||||||
PageRequest page = PageRequest.of(0, pagination.getPageSize(), pagination.getDirection(), "id");
|
PageRequest page = PageRequest.of(0, pagination.getPageSize(), Sort.Direction.DESC, "id");
|
||||||
|
|
||||||
Specification<Stream> spec = Specification.where(null);
|
Specification<Stream> spec = Specification.where(null);
|
||||||
|
|
||||||
if (pagination.getStartingFrom() != null) {
|
if (pagination.getStartingFrom() != null) {
|
||||||
if (pagination.getDirection() == Sort.Direction.ASC) {
|
spec = spec.and(streamIdLessThan(pagination.getStartingFrom()));
|
||||||
spec = spec.and(streamIdGreaterThan(pagination.getStartingFrom()));
|
|
||||||
} else {
|
|
||||||
spec = spec.and(streamIdLessThan(pagination.getStartingFrom()));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (service.isPresent()) {
|
if (service.isPresent()) {
|
||||||
|
|||||||
Reference in New Issue
Block a user