From aba4c6000ffce108ec356caa6ff53e1fb75c97c4 Mon Sep 17 00:00:00 2001 From: crowetic Date: Fri, 27 Sep 2024 18:00:32 -0700 Subject: [PATCH] added new '/addresses/levels' API call that will pull an array of accounts with their levels, based on an input number. Accounts and levels at or above the input number will be pulled and displayed along with their level. Thanks to @kennycud! --- .../api/resource/AddressesResource.java | 36 +++++++++++++--- .../data/account/AddressLevelPairing.java | 43 +++++++++++++++++++ .../qortal/repository/AccountRepository.java | 4 +- .../hsqldb/HSQLDBAccountRepository.java | 34 +++++++++++++++ 4 files changed, 110 insertions(+), 7 deletions(-) create mode 100644 src/main/java/org/qortal/data/account/AddressLevelPairing.java diff --git a/src/main/java/org/qortal/api/resource/AddressesResource.java b/src/main/java/org/qortal/api/resource/AddressesResource.java index 349dd89d..2f2dd529 100644 --- a/src/main/java/org/qortal/api/resource/AddressesResource.java +++ b/src/main/java/org/qortal/api/resource/AddressesResource.java @@ -20,10 +20,7 @@ import org.qortal.asset.Asset; import org.qortal.controller.LiteNode; import org.qortal.controller.OnlineAccountsManager; import org.qortal.crypto.Crypto; -import org.qortal.data.account.AccountData; -import org.qortal.data.account.AccountPenaltyData; -import org.qortal.data.account.RewardShareData; -import org.qortal.data.account.SponsorshipReport; +import org.qortal.data.account.*; import org.qortal.data.network.OnlineAccountData; import org.qortal.data.network.OnlineAccountLevel; import org.qortal.data.transaction.PublicizeTransactionData; @@ -668,7 +665,7 @@ public class AddressesResource { description = "Returns sponsorship statistics for an account's sponsor", responses = { @ApiResponse( - description = "the statistics", + description = "statistics", content = @Content(mediaType = MediaType.APPLICATION_JSON, array = @ArraySchema(schema = @Schema(implementation = SponsorshipReport.class))) ) } @@ -698,4 +695,31 @@ public class AddressesResource { throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.REPOSITORY_ISSUE, e); } } -} + + + @GET + @Path("/levels/{minLevel}") + @Operation( + summary = "Return accounts with levels greater than or equal to input", + responses = { + @ApiResponse( + description = "online accounts", + content = @Content(mediaType = MediaType.APPLICATION_JSON, array = @ArraySchema(schema = @Schema(implementation = AddressLevelPairing.class))) + ) + } + ) + @ApiErrors({ApiError.REPOSITORY_ISSUE}) + + public List getAddressLevelPairings(@PathParam("minLevel") int minLevel) { + + try (final Repository repository = RepositoryManager.getRepository()) { + + // get the level address pairings + List pairings = repository.getAccountRepository().getAddressLevelPairings(minLevel); + + return pairings; + } catch (DataException e) { + throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.REPOSITORY_ISSUE, e); + } + } +} \ No newline at end of file diff --git a/src/main/java/org/qortal/data/account/AddressLevelPairing.java b/src/main/java/org/qortal/data/account/AddressLevelPairing.java new file mode 100644 index 00000000..f6156c0b --- /dev/null +++ b/src/main/java/org/qortal/data/account/AddressLevelPairing.java @@ -0,0 +1,43 @@ +package org.qortal.data.account; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import java.util.Arrays; + +// All properties to be converted to JSON via JAXB +@XmlAccessorType(XmlAccessType.FIELD) +public class AddressLevelPairing { + + private String address; + + private int level; + + // Constructors + + // For JAXB + protected AddressLevelPairing() { + } + + public AddressLevelPairing(String address, int level) { + this.address = address; + this.level = level; + } + + // Getters / setters + + + public String getAddress() { + return address; + } + + public int getLevel() { + return level; + } + @Override + public String toString() { + return "SponsorshipReport{" + + "address='" + address + '\'' + + ", level=" + level + + '}'; + } +} \ No newline at end of file diff --git a/src/main/java/org/qortal/repository/AccountRepository.java b/src/main/java/org/qortal/repository/AccountRepository.java index d1ade684..eec8d736 100644 --- a/src/main/java/org/qortal/repository/AccountRepository.java +++ b/src/main/java/org/qortal/repository/AccountRepository.java @@ -165,7 +165,9 @@ public interface AccountRepository { */ public Optional getSponsor(String address) throws DataException; - /** How to order results when fetching asset balances. */ + public List getAddressLevelPairings(int minLevel) throws DataException; + + /** How to order results when fetching asset balances. */ public enum BalanceOrdering { /** assetID first, then balance, then account address */ ASSET_BALANCE_ACCOUNT, diff --git a/src/main/java/org/qortal/repository/hsqldb/HSQLDBAccountRepository.java b/src/main/java/org/qortal/repository/hsqldb/HSQLDBAccountRepository.java index d33434d1..bf71c77f 100644 --- a/src/main/java/org/qortal/repository/hsqldb/HSQLDBAccountRepository.java +++ b/src/main/java/org/qortal/repository/hsqldb/HSQLDBAccountRepository.java @@ -1,5 +1,6 @@ package org.qortal.repository.hsqldb; +import cash.z.wallet.sdk.rpc.Service; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.qortal.asset.Asset; @@ -1241,6 +1242,39 @@ public class HSQLDBAccountRepository implements AccountRepository { } } + @Override + public List getAddressLevelPairings(int minLevel) throws DataException { + + StringBuffer accLevelSql = new StringBuffer(51); + + accLevelSql.append( "SELECT account,level FROM ACCOUNTS WHERE level >= ?" ); + + try { + ResultSet accountLevelResultSet = this.repository.checkedExecute(accLevelSql.toString(),minLevel); + + List addressLevelPairings; + + if( accountLevelResultSet == null ) { + addressLevelPairings = new ArrayList<>(0); + } + else { + addressLevelPairings = new ArrayList<>(); + + do { + AddressLevelPairing pairing + = new AddressLevelPairing( + accountLevelResultSet.getString(1), + accountLevelResultSet.getInt(2) + ); + addressLevelPairings.add(pairing); + } while (accountLevelResultSet.next()); + } + return addressLevelPairings; + } catch (SQLException e) { + throw new DataException("Can't get addresses for this level from blockchain data", e); + } + } + /** * Produce Sponsorship Report *