EntityMapper.java

package com.wilzwert.myjobs.infrastructure.mapper;

import com.wilzwert.myjobs.core.domain.shared.pagination.DomainPage;
import com.wilzwert.myjobs.infrastructure.api.rest.dto.RestPage;
import org.springframework.data.domain.Page;

import java.util.List;

/**
 * @author Wilhelm Zwertvaegher
 * D for Domain aggregate / entity
 * E for persisted Entity
 * R for creation Request DTO
 * C for domain creation command
 * A for update Request DTO
 * U for domain update command
 * S for response
 */
public interface EntityMapper<D, E, R, C, A, U, S> {
    E toEntity(D domain);

    List<E> toEntity(List<D> domains);

    D toDomain(E entity);

    List<D> toDomain(List<E> entities);

    S toResponse(D domain);

    List<S> toResponse(List<D> domains);

    C toCommand(R request);

    U toUpdateCommand(A request);

    default RestPage<S> toResponse(DomainPage<D> domain) {
        return new RestPage<>(
            toResponse(domain.getContent()),
            domain.getCurrentPage(),
            domain.getPageSize(),
            domain.getTotalElementsCount(),
            domain.getPageCount()
        );
    }
    default DomainPage<D> toDomain(Page<E> entity) {
        return DomainPage.builder(toDomain(entity.getContent()))
                    .currentPage(entity.getNumber())
                    .pageSize(entity.getSize())
                    .totalElementsCount(entity.getTotalElements())
                .build();
    }

}