use of com.radixdlt.application.tokens.ResourceInBucket in project radixdlt by radixdlt.
the class EntityHandler method handleRequest.
@Override
public EntityResponse handleRequest(EntityRequest request) throws CoreApiException {
modelMapper.verifyNetwork(request.getNetworkIdentifier());
var entity = modelMapper.entity(request.getEntityIdentifier());
var keyQueries = entity.getKeyQueries();
var resourceQueries = entity.getResourceQueries();
// This must be read atomically
return radixEngine.read(reader -> {
Function<REAddr, String> addressToSymbol = addr -> {
var mapKey = SystemMapKey.ofResourceData(addr, SubstateTypeId.TOKEN_RESOURCE_METADATA.id());
var substate = reader.get(mapKey).orElseThrow();
var tokenResource = (TokenResourceMetadata) substate;
return tokenResource.symbol();
};
var proof = reader.getMetadata().getProof();
var response = new EntityResponse().stateIdentifier(modelMapper.stateIdentifier(proof.getAccumulatorState()));
for (var resourceQuery : resourceQueries) {
resourceQuery.fold((index, bucketPredicate) -> reader.reduceResources(index, ResourceInBucket::bucket, bucketPredicate).entrySet().stream().map(e -> modelMapper.resourceOperation(e.getKey(), e.getValue(), addressToSymbol)), systemMapKey -> reader.get(systemMapKey).map(ResourceInBucket.class::cast).stream().map(b -> modelMapper.resourceOperation(b, true, addressToSymbol))).forEach(response::addBalancesItem);
}
for (var keyQuery : keyQueries) {
var substate = keyQuery.get(reader);
substate.flatMap(modelMapper::dataObject).ifPresent(response::addDataObjectsItem);
}
return response;
});
}
Aggregations