class MetadataRepositoryOkHttpImpl extends AbstractRepositoryOkHttpImpl implements MetadataRepository {

  @Override
  public Observable<Page<Metadata>> search(MetadataSearchCriteria criteria) {

    String sourceAddress = toDto(criteria.getSourceAddress());
    String targetAddress = toDto(criteria.getTargetAddress());
    String scopedMetadataKey = toDto(criteria.getScopedMetadataKey());
    String targetId = criteria.getTargetId();
    MetadataTypeEnum metadataType =
        criteria.getMetadataType() == null
            ? null
            : MetadataTypeEnum.fromValue(criteria.getMetadataType().getValue());
    String offset = criteria.getOffset();
    Integer pageSize = criteria.getPageSize();
    Integer pageNumber = criteria.getPageNumber();
    Order order = toDto(criteria.getOrder());

    Callable<MetadataPage> callback =
        () ->
            getClient()
                .searchMetadataEntries(
                    sourceAddress,
                    targetAddress,
                    scopedMetadataKey,
                    targetId,
                    metadataType,
                    pageSize,
                    pageNumber,
                    offset,
                    order);

    return call(
        callback,
        page ->
            this.toPage(
                page.getPagination(),
                page.getData().stream().map(this::toMetadata).collect(Collectors.toList())));
  }

  public  MetadataRepositoryOkHttpImpl(ApiClient apiClient);

}