RestResponsePage.java

package no.nav.data.common.rest;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import io.swagger.v3.oas.annotations.Parameter;
import lombok.Getter;
import lombok.Setter;
import no.nav.data.common.utils.StreamUtils;
import org.springframework.data.domain.Page;

import java.util.List;
import java.util.function.Function;

@Getter
@Setter
@JsonPropertyOrder({"pageNumber", "pageSize", "pages", "numberOfElements", "totalElements", "paged", "content"})
public class RestResponsePage<T> {

    private long pageNumber;
    private long pageSize;
    private long pages;
    private long numberOfElements;
    private long totalElements;
    @Parameter(description = "False if operation always returns all elements")
    private boolean paged;
    private List<T> content;

    @JsonCreator
    public RestResponsePage(
            @JsonProperty("pageNumber") long pageNumber,
            @JsonProperty("pageSize") long pageSize,
            @JsonProperty("pages") long pages,
            @JsonProperty("numberOfElements") long numberOfElements,
            @JsonProperty("totalElements") long totalElements,
            @JsonProperty("paged") boolean paged,
            @JsonProperty("content") List<T> content) {
        this.pageNumber = pageNumber;
        this.pageSize = pageSize;
        this.pages = pages;
        this.numberOfElements = numberOfElements;
        this.totalElements = totalElements;
        this.paged = paged;
        this.content = content;
    }

    public RestResponsePage(Page<T> page) {
        this.content = page.getContent();
        this.pageNumber = page.getNumber();
        this.pageSize = page.getSize();
        this.pages = page.getTotalPages();
        this.numberOfElements = page.getNumberOfElements();
        this.totalElements = page.getTotalElements();
        this.paged = true;
    }

    public RestResponsePage() {
        this(List.of());
    }

    public RestResponsePage(List<T> content) {
        this(content, content.size());
    }

    public RestResponsePage(List<T> content, long totalResults) {
        this.content = content;
        this.pageNumber = 0L;
        this.pages = 1L;
        this.pageSize = content.size();
        this.numberOfElements = content.size();
        this.totalElements = totalResults;
        this.paged = false;
    }

    public <R> RestResponsePage<R> convert(Function<T, R> converter) {
        return new RestResponsePage<>(pageNumber, pageSize, pages, numberOfElements, totalElements, paged, StreamUtils.convert(content, converter));
    }
}