Skip to content

Commit 90fa2b5

Browse files
committed
Implement queryTransactionsByAccount method in MirrorNodeClientImpl
1 parent 516b240 commit 90fa2b5

File tree

2 files changed

+50
-19
lines changed

2 files changed

+50
-19
lines changed

hedera-spring/src/main/java/com/openelements/hedera/spring/implementation/MirrorNodeClientImpl.java

Lines changed: 39 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,5 @@
11
package com.openelements.hedera.spring.implementation;
22

3-
import com.fasterxml.jackson.core.JsonProcessingException;
4-
import com.fasterxml.jackson.databind.JsonNode;
5-
import com.fasterxml.jackson.databind.ObjectMapper;
6-
import com.hedera.hashgraph.sdk.AccountId;
7-
import com.hedera.hashgraph.sdk.TokenId;
8-
import com.openelements.hedera.base.HederaException;
9-
import com.openelements.hedera.base.Nft;
10-
import com.openelements.hedera.base.mirrornode.MirrorNodeClient;
11-
import com.openelements.hedera.base.mirrornode.Page;
12-
import com.openelements.hedera.base.mirrornode.TransactionInfo;
133
import java.io.IOException;
144
import java.net.URI;
155
import java.util.List;
@@ -20,6 +10,7 @@
2010
import java.util.Spliterators;
2111
import java.util.function.Function;
2212
import java.util.stream.StreamSupport;
13+
2314
import org.jspecify.annotations.NonNull;
2415
import org.springframework.http.HttpStatus;
2516
import org.springframework.http.HttpStatusCode;
@@ -28,6 +19,17 @@
2819
import org.springframework.web.client.RestClient;
2920
import org.springframework.web.util.UriBuilder;
3021

22+
import com.fasterxml.jackson.core.JsonProcessingException;
23+
import com.fasterxml.jackson.databind.JsonNode;
24+
import com.fasterxml.jackson.databind.ObjectMapper;
25+
import com.hedera.hashgraph.sdk.AccountId;
26+
import com.hedera.hashgraph.sdk.TokenId;
27+
import com.openelements.hedera.base.HederaException;
28+
import com.openelements.hedera.base.Nft;
29+
import com.openelements.hedera.base.mirrornode.MirrorNodeClient;
30+
import com.openelements.hedera.base.mirrornode.Page;
31+
import com.openelements.hedera.base.mirrornode.TransactionInfo;
32+
3133
public class MirrorNodeClientImpl implements MirrorNodeClient {
3234

3335
private final ObjectMapper objectMapper;
@@ -88,6 +90,14 @@ public Optional<Nft> queryNftsByAccountAndTokenIdAndSerial(@NonNull final Accoun
8890
.filter(nft -> Objects.equals(nft.owner(), accountId));
8991
}
9092

93+
@Override
94+
public Page<TransactionInfo> queryTransactionsByAccount(@NonNull final AccountId accountId) throws HederaException {
95+
Objects.requireNonNull(accountId, "accountId must not be null");
96+
final String path = "/api/v1/transactions?account.id=" + accountId.toString();
97+
final Function<JsonNode, List<TransactionInfo>> dataExtractionFunction = this::extractTransactionInfoFromJsonNode;
98+
return new RestBasedPage<>(objectMapper, restClient.mutate().clone(), path, dataExtractionFunction);
99+
}
100+
91101
@Override
92102
public Optional<TransactionInfo> queryTransaction(@NonNull final String transactionId) throws HederaException {
93103
Objects.requireNonNull(transactionId, "transactionId must not be null");
@@ -190,4 +200,23 @@ private List<Nft> getNfts(final JsonNode jsonNode) {
190200
}
191201
}).toList();
192202
}
203+
204+
private List<TransactionInfo> extractTransactionInfoFromJsonNode(JsonNode jsonNode) {
205+
if (!jsonNode.has("transactions")) {
206+
return List.of();
207+
}
208+
final JsonNode transactionsNode = jsonNode.get("transactions");
209+
if (!transactionsNode.isArray()) {
210+
throw new IllegalArgumentException("Transactions node is not an array: " + transactionsNode);
211+
}
212+
return StreamSupport.stream(Spliterators.spliteratorUnknownSize(transactionsNode.iterator(), Spliterator.ORDERED), false)
213+
.map(transactionNode -> {
214+
try {
215+
final String transactionId = transactionNode.get("transaction_id").asText();
216+
return new TransactionInfo(transactionId);
217+
} catch (final Exception e) {
218+
throw new RuntimeException("Error parsing transaction from JSON '" + transactionNode + "'", e);
219+
}
220+
}).toList();
221+
}
193222
}

hedera-spring/src/test/java/com/openelements/hedera/spring/test/NftRepositoryTests.java

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,26 @@
11
package com.openelements.hedera.spring.test;
22

3-
import com.hedera.hashgraph.sdk.AccountId;
4-
import com.hedera.hashgraph.sdk.PrivateKey;
5-
import com.hedera.hashgraph.sdk.TokenId;
6-
import com.openelements.hedera.base.Account;
7-
import com.openelements.hedera.base.AccountClient;
8-
import com.openelements.hedera.base.Nft;
9-
import com.openelements.hedera.base.NftClient;
10-
import com.openelements.hedera.base.NftRepository;
11-
import com.openelements.hedera.base.mirrornode.Page;
123
import java.nio.charset.StandardCharsets;
134
import java.util.ArrayList;
145
import java.util.List;
156
import java.util.Optional;
167
import java.util.stream.IntStream;
8+
179
import org.junit.jupiter.api.Assertions;
1810
import org.junit.jupiter.api.Test;
1911
import org.springframework.beans.factory.annotation.Autowired;
2012
import org.springframework.boot.test.context.SpringBootTest;
2113

14+
import com.hedera.hashgraph.sdk.AccountId;
15+
import com.hedera.hashgraph.sdk.PrivateKey;
16+
import com.hedera.hashgraph.sdk.TokenId;
17+
import com.openelements.hedera.base.Account;
18+
import com.openelements.hedera.base.AccountClient;
19+
import com.openelements.hedera.base.Nft;
20+
import com.openelements.hedera.base.NftClient;
21+
import com.openelements.hedera.base.NftRepository;
22+
import com.openelements.hedera.base.mirrornode.Page;
23+
2224
@SpringBootTest(classes = TestConfig.class)
2325
public class NftRepositoryTests {
2426

0 commit comments

Comments
 (0)