Dentro de AvistamentoController temos:
@RestController
@RequestMapping("/avistamento")
@RequiredArgsConstructor
@Getter
public class AvistamentoController {
private final AvistamentoRepository repository;
// A paginação é iniciada na página 0 a cada 5 página - o total de páginas é o size
@GetMapping("/paginado")
public ResponseEntity<List<Avistamento>> ListarTodosPaginado(
@RequestHeader(value = "X-Page", required = false, defaultValue = "0") int page,
@RequestHeader(value = "X-Size", required = false, defaultValue = "5") int size) {
// 1-10 de 2000
// 11-20 de 2000
// 1991-2000 de 2000
// Armazena todos os itens
List<Avistamento> avistamentos = repository.listarTodos();
int fromIndex = page * size; // 0 * 5
int toIndex = Math.min(fromIndex + size, avistamentos.size()); // Obtém até a próximia pagianção
// Caso o index seja maior que o tamanho da base retorna sem conteúdso
if (fromIndex > avistamentos.size()) {
return ResponseEntity.noContent().build();
}
// Lista todas as páginas do índice atual até o próximo índice
List<Avistamento> pagina = avistamentos.subList(fromIndex, toIndex);
// Calcula o total de páginas arredondando paar baixo
int totalPages = (int) Math.ceil((double) avistamentos.size() / size);
return ResponseEntity.ok()
.header("X-Total-Count", String.valueOf(avistamentos.size()))
.header("X-Total-Pages", String.valueOf(totalPages))
.header("X-Total-Count", String.valueOf(totalPages))
.body(pagina);
}