From 13b8b4c1958df369d00afa008acaf723fe334c84 Mon Sep 17 00:00:00 2001 From: Bartosz Malec Date: Thu, 13 Jun 2024 15:11:59 +0200 Subject: [PATCH] BOF-65 Return info about pages --- .../com/example/backend/page/PageDto.java | 63 +++++++++++++++++++ .../example/backend/page/PageSerializer.java | 19 ++++++ .../com/example/backend/page/TableDto.java | 29 +++++++++ .../scheme/controller/SchemeController.java | 23 +++++-- .../scheme/repository/SchemeRepository.java | 3 +- .../backend/scheme/service/SchemeService.java | 7 ++- 6 files changed, 135 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/example/backend/page/PageDto.java create mode 100644 src/main/java/com/example/backend/page/PageSerializer.java create mode 100644 src/main/java/com/example/backend/page/TableDto.java diff --git a/src/main/java/com/example/backend/page/PageDto.java b/src/main/java/com/example/backend/page/PageDto.java new file mode 100644 index 0000000..15d2495 --- /dev/null +++ b/src/main/java/com/example/backend/page/PageDto.java @@ -0,0 +1,63 @@ +package com.example.backend.page; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class PageDto { + + private Integer page; + private Integer size; + private String sort; + private Long totalCount; + private Integer totalPages; + + public PageDto() {} + + public PageDto(Integer page, Integer size, String sort) { + this.page = page; + this.size = size; + this.sort = sort; + } + + public Integer getPage() { + return page; + } + + public void setPage(Integer page) { + this.page = page; + } + + public Integer getSize() { + return size; + } + + public void setSize(Integer size) { + this.size = size; + } + + public String getSort() { + return sort; + } + + public void setSort(String sort) { + this.sort = sort; + } + + public Long getTotalCount() { + return totalCount; + } + + public void setTotalCount(Long totalCount) { + this.totalCount = totalCount; + } + + public Integer getTotalPages() { + return totalPages; + } + + public void setTotalPages(Integer totalPages) { + this.totalPages = totalPages; + } +} diff --git a/src/main/java/com/example/backend/page/PageSerializer.java b/src/main/java/com/example/backend/page/PageSerializer.java new file mode 100644 index 0000000..ca6f821 --- /dev/null +++ b/src/main/java/com/example/backend/page/PageSerializer.java @@ -0,0 +1,19 @@ +package com.example.backend.page; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; + +public class PageSerializer { + + public static void fromPage(PageDto pageDto, Page page) { + pageDto.setTotalPages(page.getTotalPages()); + pageDto.setTotalCount(page.getTotalElements()); + } + + public static void fromPageable(PageDto pageDto, Pageable pageable) { + pageDto.setPage(pageable.getPageNumber()); + pageDto.setSize(pageable.getPageSize()); + pageDto.setSort(pageable.getSort().toString()); + } + +} diff --git a/src/main/java/com/example/backend/page/TableDto.java b/src/main/java/com/example/backend/page/TableDto.java new file mode 100644 index 0000000..bb54ce9 --- /dev/null +++ b/src/main/java/com/example/backend/page/TableDto.java @@ -0,0 +1,29 @@ +package com.example.backend.page; + +public class TableDto { + + private PageDto page; + + private T data; + + public TableDto(PageDto page, T data) { + this.page = page; + this.data = data; + } + + public PageDto getPage() { + return page; + } + + public void setPage(PageDto page) { + this.page = page; + } + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } +} diff --git a/src/main/java/com/example/backend/scheme/controller/SchemeController.java b/src/main/java/com/example/backend/scheme/controller/SchemeController.java index dfbbf47..e35a469 100644 --- a/src/main/java/com/example/backend/scheme/controller/SchemeController.java +++ b/src/main/java/com/example/backend/scheme/controller/SchemeController.java @@ -1,5 +1,8 @@ package com.example.backend.scheme.controller; +import com.example.backend.page.PageDto; +import com.example.backend.page.PageSerializer; +import com.example.backend.page.TableDto; import com.example.backend.exception.exceptions.EntityNotFoundException; import com.example.backend.exception.exceptions.IllegalInputException; import com.example.backend.scheme.dto.SchemeDto; @@ -8,6 +11,7 @@ import com.example.backend.common.UserEmail; import com.example.backend.scheme.model.Scheme; import jakarta.validation.Valid; +import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.web.bind.annotation.*; @@ -27,16 +31,23 @@ public SchemeController(SchemeService schemeService) { } @GetMapping - public List list(@UserEmail String email, Pageable pageable) { - List schemas = schemeService.list(email, pageable); - return schemas.stream().map((scheme -> SchemeSerializer.serialize(scheme, BASE))).toList(); + public TableDto> list(@UserEmail String email, Pageable pageable) { + Page schemas = schemeService.list(email, pageable); + PageDto pageDto = new PageDto(); + PageSerializer.fromPageable(pageDto, pageable); + PageSerializer.fromPage(pageDto, schemas); + + return new TableDto<>(pageDto, schemas.stream().map((scheme -> SchemeSerializer.serialize(scheme, BASE))).toList()); } @GetMapping("{id}") - public SchemeDto get(@UserEmail String email, @PathVariable("id") Long id, Pageable pageable) throws EntityNotFoundException { + public TableDto get(@UserEmail String email, @PathVariable("id") Long id, Pageable pageable) throws EntityNotFoundException { Scheme scheme = schemeService.getById(id, email); - schemeService.fetchCars(scheme, pageable); - return SchemeSerializer.serialize(scheme, BASE, CARS); + PageDto pageDto = new PageDto(); + PageSerializer.fromPageable(pageDto, pageable); + + schemeService.fetchCars(scheme, pageable, pageDto); + return new TableDto<>(pageDto, SchemeSerializer.serialize(scheme, BASE, CARS)); } @PostMapping diff --git a/src/main/java/com/example/backend/scheme/repository/SchemeRepository.java b/src/main/java/com/example/backend/scheme/repository/SchemeRepository.java index 5613098..d9c13d4 100644 --- a/src/main/java/com/example/backend/scheme/repository/SchemeRepository.java +++ b/src/main/java/com/example/backend/scheme/repository/SchemeRepository.java @@ -1,6 +1,7 @@ package com.example.backend.scheme.repository; import com.example.backend.scheme.model.Scheme; +import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; @@ -11,6 +12,6 @@ public interface SchemeRepository extends JpaRepository { Optional findByIdAndUserEmail(Long id, String email); - List findAllByUserEmail(String email, Pageable pageable); + Page findAllByUserEmail(String email, Pageable pageable); } diff --git a/src/main/java/com/example/backend/scheme/service/SchemeService.java b/src/main/java/com/example/backend/scheme/service/SchemeService.java index e60e878..90043c6 100644 --- a/src/main/java/com/example/backend/scheme/service/SchemeService.java +++ b/src/main/java/com/example/backend/scheme/service/SchemeService.java @@ -2,9 +2,11 @@ import com.example.backend.common.Collections; import com.example.backend.common.ErrorCode; +import com.example.backend.page.PageDto; import com.example.backend.email.EmailService; import com.example.backend.exception.exceptions.EntityNotFoundException; import com.example.backend.exception.exceptions.IllegalInputException; +import com.example.backend.page.PageSerializer; import com.example.backend.scheme.CarStatus; import com.example.backend.scheme.dto.SchemeDto; import com.example.backend.scheme.model.Scheme; @@ -72,7 +74,7 @@ public SchemeService(EntityManager em, SchemeRepository schemeRepository, Scheme this.emailService = emailService; } - public List list(String email, Pageable pageable) { + public Page list(String email, Pageable pageable) { return schemeRepository.findAllByUserEmail(email, pageable); } @@ -133,8 +135,9 @@ public void fetchCars(Scheme scheme) { scheme.setSchemeToCars(schemeToCars); } - public void fetchCars(Scheme scheme, Pageable pageable) { + public void fetchCars(Scheme scheme, Pageable pageable, PageDto pageDto) { Page schemeToCars = schemeToCarRepository.findBySchemeId(scheme.getId(), pageable); + PageSerializer.fromPage(pageDto, schemeToCars); em.detach(scheme); scheme.setSchemeToCars(schemeToCars.get().collect(Collectors.toList()));