diff --git a/pom.xml b/pom.xml
index a74133c..d4daa2c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
org.springframework.boot
spring-boot-starter-parent
- 3.3.4
+ 3.3.8
diff --git a/src/main/java/it/aboutbits/springboot/toolbox/web/response/PagedResponse.java b/src/main/java/it/aboutbits/springboot/toolbox/web/response/PagedResponse.java
index 599e46b..4b926d2 100644
--- a/src/main/java/it/aboutbits/springboot/toolbox/web/response/PagedResponse.java
+++ b/src/main/java/it/aboutbits/springboot/toolbox/web/response/PagedResponse.java
@@ -4,6 +4,7 @@
import org.springframework.data.domain.Page;
import java.util.List;
+import java.util.function.Function;
public record PagedResponse(
@NonNull
@@ -12,6 +13,34 @@ public record PagedResponse(
MetaWithPagination meta
) {
+ public static PagedResponse of(@NonNull Page page) {
+ return new PagedResponse<>(
+ page.getContent(),
+ new MetaWithPagination(
+ new MetaWithPagination.Pagination(
+ page.getNumber(),
+ page.getSize(),
+ page.getTotalElements()
+ )
+ )
+ );
+ }
+
+ public static PagedResponse of(@NonNull Page page, @NonNull Function converter) {
+ var mapped = page.map(converter);
+
+ return new PagedResponse<>(
+ mapped.getContent(),
+ new MetaWithPagination(
+ new MetaWithPagination.Pagination(
+ mapped.getNumber(),
+ mapped.getSize(),
+ mapped.getTotalElements()
+ )
+ )
+ );
+ }
+
public record MetaWithPagination(
@NonNull
Pagination pagination
diff --git a/src/test/java/it/aboutbits/springboot/toolbox/web/response/PagedResponseTest.java b/src/test/java/it/aboutbits/springboot/toolbox/web/response/PagedResponseTest.java
new file mode 100644
index 0000000..ae166f5
--- /dev/null
+++ b/src/test/java/it/aboutbits/springboot/toolbox/web/response/PagedResponseTest.java
@@ -0,0 +1,98 @@
+package it.aboutbits.springboot.toolbox.web.response;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.data.domain.PageImpl;
+import org.springframework.data.domain.PageRequest;
+
+import java.util.List;
+import java.util.function.Function;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class PagedResponseTest {
+ @Test
+ void shouldReturnPagedResponseWithDataAndMeta_forSingleParameterOfMethod() {
+ // given
+ var content = List.of("item1", "item2", "item3");
+ var page = new PageImpl<>(content, PageRequest.of(1, 3), 10);
+
+ // when
+ var pagedResponse = PagedResponse.of(page);
+
+ // then
+ assertThat(pagedResponse).isNotNull();
+ assertThat(pagedResponse.data()).isEqualTo(content);
+ assertThat(pagedResponse.meta().pagination().page()).isEqualTo(1);
+ assertThat(pagedResponse.meta().pagination().size()).isEqualTo(3);
+ assertThat(pagedResponse.meta().pagination().totalElements()).isEqualTo(10);
+ }
+
+ @Test
+ void shouldReturnPagedResponseWithMappedDataAndMeta_forTwoParameterOfMethod() {
+ // given
+ var content = List.of(1, 2, 3);
+ var page = new PageImpl<>(content, PageRequest.of(2, 5), 15);
+ Function converter = Object::toString;
+
+ // when
+ var pagedResponse = PagedResponse.of(page, converter);
+
+ // then
+ assertThat(pagedResponse).isNotNull();
+ assertThat(pagedResponse.data()).isEqualTo(List.of("1", "2", "3"));
+ assertThat(pagedResponse.meta().pagination().page()).isEqualTo(2);
+ assertThat(pagedResponse.meta().pagination().size()).isEqualTo(5);
+ assertThat(pagedResponse.meta().pagination().totalElements()).isEqualTo(15);
+ }
+
+ @Test
+ void shouldHandleEmptyPageCorrectly() {
+ // given
+ var page = new PageImpl<>(List.of(), PageRequest.of(0, 10), 0);
+
+ // when
+ var pagedResponse = PagedResponse.of(page);
+
+ // then
+ assertThat(pagedResponse).isNotNull();
+ assertThat(pagedResponse.data()).isEmpty();
+ assertThat(pagedResponse.meta().pagination().page()).isZero();
+ assertThat(pagedResponse.meta().pagination().size()).isEqualTo(10);
+ assertThat(pagedResponse.meta().pagination().totalElements()).isZero();
+ }
+
+ @Test
+ void shouldHandlePageWithCustomConverterCorrectly() {
+ // given
+ var content = List.of(10, 20, 30);
+ var page = new PageImpl<>(content, PageRequest.of(3, 3), 24);
+ Function converter = val -> "Value-" + val;
+
+ // when
+ var pagedResponse = PagedResponse.of(page, converter);
+
+ // then
+ assertThat(pagedResponse).isNotNull();
+ assertThat(pagedResponse.data()).isEqualTo(List.of("Value-10", "Value-20", "Value-30"));
+ assertThat(pagedResponse.meta().pagination().page()).isEqualTo(3);
+ assertThat(pagedResponse.meta().pagination().size()).isEqualTo(3);
+ assertThat(pagedResponse.meta().pagination().totalElements()).isEqualTo(24);
+ }
+
+ @Test
+ void shouldHandleEmptyPageWithCustomConverterCorrectly() {
+ // given
+ var page = new PageImpl(List.of(), PageRequest.of(2, 4), 0);
+ Function converter = val -> "Value-" + val;
+
+ // when
+ var pagedResponse = PagedResponse.of(page, converter);
+
+ // then
+ assertThat(pagedResponse).isNotNull();
+ assertThat(pagedResponse.data()).isEmpty();
+ assertThat(pagedResponse.meta().pagination().page()).isEqualTo(2);
+ assertThat(pagedResponse.meta().pagination().size()).isEqualTo(4);
+ assertThat(pagedResponse.meta().pagination().totalElements()).isZero();
+ }
+}