package com.ecep.contract; import java.util.List; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.jpa.domain.Specification; import org.springframework.util.StringUtils; import com.ecep.contract.constant.ServiceConstant; import com.ecep.contract.ds.MyRepository; import com.ecep.contract.util.SpecificationUtils; import com.fasterxml.jackson.databind.JsonNode; public abstract class EntityService { protected abstract MyRepository getRepository(); public abstract T createNewEntity(); public long count() { return getRepository().count(); } public long count(Specification spec) { return getRepository().count(spec); } public long count(JsonNode paramsNode) { return getRepository().count(buildParameterSpecification(paramsNode)); } protected abstract Specification buildParameterSpecification(JsonNode paramsNode); public Page findAll(JsonNode paramsNode, Pageable pageable) { Specification spec = null; if (paramsNode.has(ServiceConstant.KEY_SEARCH_TEXT)) { spec = getSpecification(paramsNode.get(ServiceConstant.KEY_SEARCH_TEXT).asText()); } spec = SpecificationUtils.and(spec, buildParameterSpecification(paramsNode)); return findAll(spec, pageable); } public Page findAll(Specification spec, Pageable pageable) { return getRepository().findAll(spec, pageable); } public List findAll(Specification spec, Sort sort) { return getRepository().findAll(spec, sort); } protected abstract Specification buildSearchSpecification(String searchText); public Specification getSpecification(String searchText) { if (!StringUtils.hasText(searchText)) { return null; } return SpecificationUtils.andWith(searchText, this::buildSearchSpecification); } public List search(String searchText) { Specification spec = getSpecification(searchText); return getRepository().findAll(spec, Pageable.ofSize(10)).getContent(); } }