All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.nem.symbol.sdk.infrastructure.vertx.MosaicRepositoryVertxImpl Maven / Gradle / Ivy

/*
 * Copyright 2020 NEM
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package io.nem.symbol.sdk.infrastructure.vertx;

import static io.nem.symbol.core.utils.MapperUtils.toMosaicId;

import io.nem.symbol.core.utils.MapperUtils;
import io.nem.symbol.sdk.api.MosaicRepository;
import io.nem.symbol.sdk.api.MosaicSearchCriteria;
import io.nem.symbol.sdk.api.Page;
import io.nem.symbol.sdk.model.mosaic.MosaicFlags;
import io.nem.symbol.sdk.model.mosaic.MosaicId;
import io.nem.symbol.sdk.model.mosaic.MosaicInfo;
import io.nem.symbol.sdk.model.network.NetworkType;
import io.nem.symbol.sdk.openapi.vertx.api.MosaicRoutesApi;
import io.nem.symbol.sdk.openapi.vertx.api.MosaicRoutesApiImpl;
import io.nem.symbol.sdk.openapi.vertx.invoker.ApiClient;
import io.nem.symbol.sdk.openapi.vertx.model.MosaicDTO;
import io.nem.symbol.sdk.openapi.vertx.model.MosaicIds;
import io.nem.symbol.sdk.openapi.vertx.model.MosaicInfoDTO;
import io.nem.symbol.sdk.openapi.vertx.model.MosaicPage;
import io.reactivex.Observable;
import io.vertx.core.AsyncResult;
import io.vertx.core.Handler;
import java.util.List;
import java.util.function.Consumer;
import java.util.stream.Collectors;

/**
 * Mosaic http repository.
 *
 * @since 1.0
 */
public class MosaicRepositoryVertxImpl extends AbstractRepositoryVertxImpl
    implements MosaicRepository {

  private final MosaicRoutesApi client;

  private final Observable networkTypeObservable;

  public MosaicRepositoryVertxImpl(
      ApiClient apiClient, Observable networkTypeObservable) {
    super(apiClient);
    this.client = new MosaicRoutesApiImpl(apiClient);
    this.networkTypeObservable = networkTypeObservable;
  }

  public MosaicRoutesApi getClient() {
    return client;
  }

  @Override
  public Observable getMosaic(MosaicId mosaicId) {

    Consumer>> callback =
        handler -> getClient().getMosaic(mosaicId.getIdAsHex(), handler);
    return exceptionHandling(
        networkTypeObservable.flatMap(
            networkType -> call(callback).map(mosaicInfoDTO -> createMosaicInfo(mosaicInfoDTO))));
  }

  @Override
  public Observable> getMosaics(List ids) {

    MosaicIds mosaicIds = new MosaicIds();
    mosaicIds.mosaicIds(ids.stream().map(MosaicId::getIdAsHex).collect(Collectors.toList()));
    Consumer>>> callback =
        handler -> getClient().getMosaics(mosaicIds, handler);
    return exceptionHandling(
        networkTypeObservable.flatMap(
            networkType ->
                call(callback)
                    .flatMapIterable(item -> item)
                    .map(mosaicInfoDTO -> createMosaicInfo(mosaicInfoDTO))
                    .toList()
                    .toObservable()));
  }

  @Override
  public Observable> search(MosaicSearchCriteria criteria) {
    Consumer>> callback =
        handler ->
            getClient()
                .searchMosaics(
                    toDto(criteria.getOwnerAddress()),
                    criteria.getPageSize(),
                    criteria.getPageNumber(),
                    criteria.getOffset(),
                    toDto(criteria.getOrder()),
                    handler);

    return exceptionHandling(
        networkTypeObservable.flatMap(
            networkType ->
                call(callback)
                    .map(
                        mosaicPage ->
                            this.toPage(
                                mosaicPage.getPagination(),
                                mosaicPage.getData().stream()
                                    .map(this::createMosaicInfo)
                                    .collect(Collectors.toList())))));
  }

  private MosaicInfo createMosaicInfo(MosaicInfoDTO mosaicInfoDTO) {
    return createMosaicInfo(mosaicInfoDTO.getMosaic(), mosaicInfoDTO.getId());
  }

  private MosaicInfo createMosaicInfo(MosaicDTO mosaic, String recordId) {
    return new MosaicInfo(
        recordId,
        toMosaicId(mosaic.getId()),
        mosaic.getSupply(),
        mosaic.getStartHeight(),
        MapperUtils.toAddress(mosaic.getOwnerAddress()),
        mosaic.getRevision(),
        extractMosaicFlags(mosaic),
        mosaic.getDivisibility(),
        mosaic.getDuration());
  }

  private static MosaicFlags extractMosaicFlags(MosaicDTO mosaicDTO) {
    return MosaicFlags.create(mosaicDTO.getFlags());
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy