From 23c9a70a472d5dcc9e0810d9a1b645ecd24554ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A1n=20Oliva?= Date: Mon, 29 May 2023 00:41:26 -0600 Subject: First instance for pagination. Setting filters and sorters and saving them on a list. Then the list can be paginated and returned. --- src/main/java/com/encora/Main.java | 62 +++++++++++++++++++++++++++ src/main/java/com/encora/ToDosRepository.java | 13 ++++++ 2 files changed, 75 insertions(+) (limited to 'src') diff --git a/src/main/java/com/encora/Main.java b/src/main/java/com/encora/Main.java index a8d86ba..5aaede6 100644 --- a/src/main/java/com/encora/Main.java +++ b/src/main/java/com/encora/Main.java @@ -6,6 +6,7 @@ import org.springframework.data.domain.Sort; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.*; +import java.util.Collections; import java.util.Date; import java.util.List; import java.util.Objects; @@ -174,4 +175,65 @@ public class Main { public Integer giveMeLastID() { return toDosRepository.lastId; } + + + // Set filters and sorters for our to dos. + record filtersAndSorters ( + toDoFilters filters, + SortingsFields sortField, + SortingOrders sortOrder + ) { + + } + @CrossOrigin(origins=allowed_origin) + @PostMapping("/todos/setFiltSort") + @ResponseStatus(value=HttpStatus.OK) + public void setFiltersAndSorters(@RequestBody filtersAndSorters filAndSor) throws Exception { + // Sorting method. + Sort sortingMethod = Sort.by(String.valueOf(filAndSor.sortField())); + if (Objects.equals(String.valueOf(filAndSor.sortOrder()), "DESC")) { + sortingMethod = sortingMethod.descending(); + } + + // Filter to dos and then sort them. + toDosRepository.refreshFilteredToDos( + sortingMethod, + filAndSor.filters().name(), + filAndSor.filters().priority(), + filAndSor.filters().done() + ); + } + + + // Return our todos filtered, sorted AND paginated. + @CrossOrigin(origins=allowed_origin) + @GetMapping("/todos/filtSort/{page}") + @ResponseStatus(value=HttpStatus.OK) + public List getFilteredToDos(@PathVariable("page") Integer page) { + if(page <= 0) { + throw new IllegalArgumentException("invalid page: " + page); + } + + final int pageSize = 10; + List myToDos = toDosRepository.filteredToDos; + + int fromIndex = (page - 1) * pageSize; + if (myToDos.size() <= fromIndex) { + return Collections.emptyList(); + } + + // toIndex exclusive + return myToDos.subList(fromIndex, Math.min(fromIndex + pageSize, myToDos.size())); + } + + + // Return how many pages after filter and sorting. + @CrossOrigin(origins=allowed_origin) + @GetMapping("/todos/filtSort/pages") + @ResponseStatus(value=HttpStatus.OK) + public Integer getNumberOfPages(@RequestBody filtersAndSorters filAndSor) { + // Number of items divided by page size. + final int pageSize = 10; + return (int) Math.ceil((double) toDosRepository.filteredToDos.size() / pageSize); + } } diff --git a/src/main/java/com/encora/ToDosRepository.java b/src/main/java/com/encora/ToDosRepository.java index 8d09d7e..a4c9a10 100644 --- a/src/main/java/com/encora/ToDosRepository.java +++ b/src/main/java/com/encora/ToDosRepository.java @@ -184,6 +184,19 @@ public class ToDosRepository implements JpaRepository { return comparator; } + + // Filter and then sort all of our to dos. + public void refreshFilteredToDos(Sort sort, String name, String priority, String done) throws Exception { + this.filteredToDos = this.findAllWithFilter(name, priority, done); + + try { + Comparator comparator = this.getToDoComparator(sort); + Collections.sort(this.filteredToDos, comparator); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + /* * N O T Y E T D E F I N E D . */ -- cgit v1.2.3