From bad614e9fc04182b57ec3a5b983a8602cf87af27 Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Mon, 24 Aug 2020 08:56:48 +0300 Subject: [PATCH 1/2] wip --- .../src/dto/transaction-collection.ts | 29 ++++++++++ .../src/dto/transaction-mapper.ts | 19 ++++++- .../src/dto/transaction.ts | 22 ++++++++ .../profiles/aggregates/entity-aggregate.ts | 25 +++++---- .../entity-registration-aggregate.ts | 15 ++--- .../entity-resignation-aggregate.ts | 15 ++--- .../aggregates/entity-update-aggregate.ts | 15 ++--- .../aggregates/registration-aggregate.ts | 6 +- .../aggregates/transaction-aggregate.ts | 28 +++++----- .../profiles/aggregates/wallet-aggregate.ts | 7 ++- .../repositories/wallet-repository.test.ts | 7 ++- .../src/repositories/wallet-repository.ts | 55 ++++++++++--------- .../wallets/aggregates/entity-aggregate.ts | 28 +++++----- .../entity-registration-aggregate.ts | 15 ++--- .../entity-resignation-aggregate.ts | 15 ++--- .../aggregates/entity-update-aggregate.ts | 15 ++--- .../src/wallets/wallet.models.ts | 7 ++- .../src/wallets/wallet.ts | 19 ++++--- .../src/coins/collections/index.ts | 1 + .../src/coins/collections/paginator.ts | 8 +++ 20 files changed, 220 insertions(+), 131 deletions(-) create mode 100644 packages/platform-sdk-profiles/src/dto/transaction-collection.ts diff --git a/packages/platform-sdk-profiles/src/dto/transaction-collection.ts b/packages/platform-sdk-profiles/src/dto/transaction-collection.ts new file mode 100644 index 0000000000..3890bd66f2 --- /dev/null +++ b/packages/platform-sdk-profiles/src/dto/transaction-collection.ts @@ -0,0 +1,29 @@ +import { Coins } from "@arkecosystem/platform-sdk"; + +import { ExtendedTransactionData } from "./transaction"; + +export class ExtendedTransactionDataCollection extends Coins.Paginator { + public findById(id: string): ExtendedTransactionData | undefined { + return this.find("id", id); + } + + public findByType(type: string): ExtendedTransactionData | undefined { + return this.find("type", type); + } + + public findByTimestamp(timestamp: string): ExtendedTransactionData | undefined { + return this.find("timestamp", timestamp); + } + + public findBySender(sender: string): ExtendedTransactionData | undefined { + return this.find("sender", sender); + } + + public findByRecipient(recipient: string): ExtendedTransactionData | undefined { + return this.find("recipient", recipient); + } + + private find(key: string, value: string): ExtendedTransactionData | undefined { + return this.items().find((transaction: ExtendedTransactionData) => transaction[key]() === value); + } +} diff --git a/packages/platform-sdk-profiles/src/dto/transaction-mapper.ts b/packages/platform-sdk-profiles/src/dto/transaction-mapper.ts index 12f3337ebf..aebc042b47 100644 --- a/packages/platform-sdk-profiles/src/dto/transaction-mapper.ts +++ b/packages/platform-sdk-profiles/src/dto/transaction-mapper.ts @@ -1,4 +1,4 @@ -import { Contracts } from "@arkecosystem/platform-sdk"; +import { Coins, Contracts } from "@arkecosystem/platform-sdk"; import { ReadWriteWallet } from "../wallets/wallet.models"; import { @@ -13,6 +13,7 @@ import { EntityRegistrationData, EntityResignationData, EntityUpdateData, + ExtendedTransactionData, HtlcClaimData, HtlcLockData, HtlcRefundData, @@ -24,12 +25,13 @@ import { TransferData, VoteData, } from "./transaction"; +import { ExtendedTransactionDataCollection } from "./transaction-collection"; export const transformTransactionData = ( wallet: ReadWriteWallet, transaction: Contracts.TransactionDataType, -): Contracts.TransactionDataType => { - const instance: Contracts.TransactionDataType = new TransactionData(wallet, transaction); +): ExtendedTransactionData => { + const instance: ExtendedTransactionData = new TransactionData(wallet, transaction); if (instance.isLegacyBridgechainRegistration()) { return new BridgechainRegistrationData(wallet, transaction); @@ -117,3 +119,14 @@ export const transformTransactionData = ( return instance; }; + +export const transformTransactionDataCollection = ( + wallet: ReadWriteWallet, + transactions: Coins.TransactionDataCollection, +): ExtendedTransactionDataCollection => + new ExtendedTransactionDataCollection( + transactions + .getData() + .map((transaction: Contracts.TransactionData) => transformTransactionData(wallet, transaction)), + transactions.getPagination(), + ); diff --git a/packages/platform-sdk-profiles/src/dto/transaction.ts b/packages/platform-sdk-profiles/src/dto/transaction.ts index 9d1d4e20bb..4b47f489f9 100644 --- a/packages/platform-sdk-profiles/src/dto/transaction.ts +++ b/packages/platform-sdk-profiles/src/dto/transaction.ts @@ -514,3 +514,25 @@ export class VoteData extends TransactionData { return this.data().unvotes(); } } + +export type ExtendedTransactionData = + | BridgechainRegistrationData + | BridgechainResignationData + | BridgechainUpdateData + | BusinessRegistrationData + | BusinessResignationData + | BusinessUpdateData + | DelegateRegistrationData + | DelegateResignationData + | EntityRegistrationData + | EntityResignationData + | EntityUpdateData + | HtlcClaimData + | HtlcLockData + | HtlcRefundData + | IpfsData + | MultiPaymentData + | MultiSignatureData + | SecondSignatureData + | TransferData + | VoteData; diff --git a/packages/platform-sdk-profiles/src/profiles/aggregates/entity-aggregate.ts b/packages/platform-sdk-profiles/src/profiles/aggregates/entity-aggregate.ts index 4c47583f4c..e43a235185 100644 --- a/packages/platform-sdk-profiles/src/profiles/aggregates/entity-aggregate.ts +++ b/packages/platform-sdk-profiles/src/profiles/aggregates/entity-aggregate.ts @@ -1,12 +1,14 @@ import { Coins, Contracts } from "@arkecosystem/platform-sdk"; -import { transformTransactionData } from "../../dto/transaction-mapper"; +import { ExtendedTransactionData } from "../../dto/transaction"; +import { ExtendedTransactionDataCollection } from "../../dto/transaction-collection"; +import { transformTransactionData, transformTransactionDataCollection } from "../../dto/transaction-mapper"; import { promiseAllSettledByKey } from "../../helpers/promise"; -import { Wallet } from "../../wallets/wallet"; +import { ReadWriteWallet } from "../../wallets/wallet.models"; import { ProfileContract } from "../profile.models"; type HistoryMethod = string; -type HistoryWallet = Coins.TransactionDataCollection; +type HistoryWallet = ExtendedTransactionDataCollection; export class EntityAggregate { readonly #profile: ProfileContract; @@ -31,14 +33,14 @@ export class EntityAggregate { entityType: string, entityAction: string, query: Contracts.ClientPagination, - ): Promise { + ): Promise { const historyKey = `${entityType}.${entityAction}`; if (!this.#history[historyKey]) { this.#history[historyKey] = {}; } - const syncedWallets: Wallet[] = this.getWallets(); + const syncedWallets: ReadWriteWallet[] = this.getWallets(); const requests: Record> = {}; @@ -60,6 +62,7 @@ export class EntityAggregate { senderPublicKey: syncedWallet.publicKey(), }; + let transactions; if (lastResponse && lastResponse.hasMorePages()) { return resolve(syncedWallet.client().transactions({ cursor: lastResponse.nextPage(), ...query })); } @@ -68,8 +71,8 @@ export class EntityAggregate { }); } - const responses = await promiseAllSettledByKey(requests); - const result: Contracts.TransactionDataTypeCollection = []; + const responses = await promiseAllSettledByKey(requests); + const result: ExtendedTransactionData[] = []; for (const [id, request] of Object.entries(responses || {})) { if (request.status === "rejected" || request.value instanceof Error) { @@ -87,21 +90,21 @@ export class EntityAggregate { this.#history[historyKey][id] = request.value; } - return new Coins.TransactionDataCollection(result, { + return new ExtendedTransactionDataCollection(result, { prev: undefined, self: undefined, next: Number(this.hasMore(historyKey)), }); } - private getWallet(id: string): Wallet { + private getWallet(id: string): ReadWriteWallet { return this.#profile.wallets().findById(id); } - private getWallets(): Wallet[] { + private getWallets(): ReadWriteWallet[] { return this.#profile .wallets() .values() - .filter((wallet: Wallet) => wallet.hasSyncedWithNetwork()); + .filter((wallet: ReadWriteWallet) => wallet.hasSyncedWithNetwork()); } } diff --git a/packages/platform-sdk-profiles/src/profiles/aggregates/entity-registration-aggregate.ts b/packages/platform-sdk-profiles/src/profiles/aggregates/entity-registration-aggregate.ts index 2d4ee85124..304732cab9 100644 --- a/packages/platform-sdk-profiles/src/profiles/aggregates/entity-registration-aggregate.ts +++ b/packages/platform-sdk-profiles/src/profiles/aggregates/entity-registration-aggregate.ts @@ -1,31 +1,32 @@ -import { Coins, Contracts } from "@arkecosystem/platform-sdk"; +import { Contracts } from "@arkecosystem/platform-sdk"; +import { ExtendedTransactionDataCollection } from "../../dto/transaction-collection"; import { EntityAggregate } from "./entity-aggregate"; export class EntityRegistrationAggregate extends EntityAggregate { - public async all(query: Contracts.ClientPagination = {}): Promise { + public async all(query: Contracts.ClientPagination = {}): Promise { return this.aggregate("all", "register", query); } - public async businesses(query: Contracts.ClientPagination = {}): Promise { + public async businesses(query: Contracts.ClientPagination = {}): Promise { return this.aggregate("business", "register", query); } - public async delegates(query: Contracts.ClientPagination = {}): Promise { + public async delegates(query: Contracts.ClientPagination = {}): Promise { return this.aggregate("delegate", "register", query); } - public async plugins(query: Contracts.ClientPagination = {}): Promise { + public async plugins(query: Contracts.ClientPagination = {}): Promise { return this.aggregate("plugin", "register", query); } - public async corePlugins(query: Contracts.ClientPagination = {}): Promise { + public async corePlugins(query: Contracts.ClientPagination = {}): Promise { return this.aggregate("corePlugin", "register", query); } public async desktopWalletPlugins( query: Contracts.ClientPagination = {}, - ): Promise { + ): Promise { return this.aggregate("desktopWalletPlugin", "register", query); } } diff --git a/packages/platform-sdk-profiles/src/profiles/aggregates/entity-resignation-aggregate.ts b/packages/platform-sdk-profiles/src/profiles/aggregates/entity-resignation-aggregate.ts index 593badfda3..67cf24e070 100644 --- a/packages/platform-sdk-profiles/src/profiles/aggregates/entity-resignation-aggregate.ts +++ b/packages/platform-sdk-profiles/src/profiles/aggregates/entity-resignation-aggregate.ts @@ -1,31 +1,32 @@ -import { Coins, Contracts } from "@arkecosystem/platform-sdk"; +import { Contracts } from "@arkecosystem/platform-sdk"; +import { ExtendedTransactionDataCollection } from "../../dto/transaction-collection"; import { EntityAggregate } from "./entity-aggregate"; export class EntityResignationAggregate extends EntityAggregate { - public async all(query: Contracts.ClientPagination = {}): Promise { + public async all(query: Contracts.ClientPagination = {}): Promise { return this.aggregate("all", "resign", query); } - public async businesses(query: Contracts.ClientPagination = {}): Promise { + public async businesses(query: Contracts.ClientPagination = {}): Promise { return this.aggregate("business", "resign", query); } - public async delegates(query: Contracts.ClientPagination = {}): Promise { + public async delegates(query: Contracts.ClientPagination = {}): Promise { return this.aggregate("delegate", "resign", query); } - public async plugins(query: Contracts.ClientPagination = {}): Promise { + public async plugins(query: Contracts.ClientPagination = {}): Promise { return this.aggregate("plugin", "resign", query); } - public async corePlugins(query: Contracts.ClientPagination = {}): Promise { + public async corePlugins(query: Contracts.ClientPagination = {}): Promise { return this.aggregate("corePlugin", "resign", query); } public async desktopWalletPlugins( query: Contracts.ClientPagination = {}, - ): Promise { + ): Promise { return this.aggregate("desktopWalletPlugin", "resign", query); } } diff --git a/packages/platform-sdk-profiles/src/profiles/aggregates/entity-update-aggregate.ts b/packages/platform-sdk-profiles/src/profiles/aggregates/entity-update-aggregate.ts index e455bdd1b8..e0b8f42eb2 100644 --- a/packages/platform-sdk-profiles/src/profiles/aggregates/entity-update-aggregate.ts +++ b/packages/platform-sdk-profiles/src/profiles/aggregates/entity-update-aggregate.ts @@ -1,31 +1,32 @@ -import { Coins, Contracts } from "@arkecosystem/platform-sdk"; +import { Contracts } from "@arkecosystem/platform-sdk"; +import { ExtendedTransactionDataCollection } from "../../dto/transaction-collection"; import { EntityAggregate } from "./entity-aggregate"; export class EntityUpdateAggregate extends EntityAggregate { - public async all(query: Contracts.ClientPagination = {}): Promise { + public async all(query: Contracts.ClientPagination = {}): Promise { return this.aggregate("all", "update", query); } - public async businesses(query: Contracts.ClientPagination = {}): Promise { + public async businesses(query: Contracts.ClientPagination = {}): Promise { return this.aggregate("business", "update", query); } - public async delegates(query: Contracts.ClientPagination = {}): Promise { + public async delegates(query: Contracts.ClientPagination = {}): Promise { return this.aggregate("delegate", "update", query); } - public async plugins(query: Contracts.ClientPagination = {}): Promise { + public async plugins(query: Contracts.ClientPagination = {}): Promise { return this.aggregate("plugin", "update", query); } - public async corePlugins(query: Contracts.ClientPagination = {}): Promise { + public async corePlugins(query: Contracts.ClientPagination = {}): Promise { return this.aggregate("corePlugin", "update", query); } public async desktopWalletPlugins( query: Contracts.ClientPagination = {}, - ): Promise { + ): Promise { return this.aggregate("desktopWalletPlugin", "update", query); } } diff --git a/packages/platform-sdk-profiles/src/profiles/aggregates/registration-aggregate.ts b/packages/platform-sdk-profiles/src/profiles/aggregates/registration-aggregate.ts index 30b8b5db3b..853716d818 100644 --- a/packages/platform-sdk-profiles/src/profiles/aggregates/registration-aggregate.ts +++ b/packages/platform-sdk-profiles/src/profiles/aggregates/registration-aggregate.ts @@ -1,4 +1,4 @@ -import { Wallet } from "../../wallets/wallet"; +import { ReadWriteWallet } from "../../wallets/wallet.models"; import { ProfileContract } from "../profile.models"; export class RegistrationAggregate { @@ -8,10 +8,10 @@ export class RegistrationAggregate { this.#profile = profile; } - public delegates(): Wallet[] { + public delegates(): ReadWriteWallet[] { return this.#profile .wallets() .values() - .filter((wallet: Wallet) => wallet.isDelegate()); + .filter((wallet: ReadWriteWallet) => wallet.isDelegate()); } } diff --git a/packages/platform-sdk-profiles/src/profiles/aggregates/transaction-aggregate.ts b/packages/platform-sdk-profiles/src/profiles/aggregates/transaction-aggregate.ts index 154bb2ba33..5a067fde54 100644 --- a/packages/platform-sdk-profiles/src/profiles/aggregates/transaction-aggregate.ts +++ b/packages/platform-sdk-profiles/src/profiles/aggregates/transaction-aggregate.ts @@ -1,12 +1,14 @@ import { Coins, Contracts } from "@arkecosystem/platform-sdk"; +import { ExtendedTransactionData } from "../../dto/transaction"; +import { ExtendedTransactionDataCollection } from "../../dto/transaction-collection"; import { transformTransactionData } from "../../dto/transaction-mapper"; import { promiseAllSettledByKey } from "../../helpers/promise"; -import { Wallet } from "../../wallets/wallet"; +import { ReadWriteWallet } from "../../wallets/wallet.models"; import { ProfileContract } from "../profile.models"; type HistoryMethod = string; -type HistoryWallet = Coins.TransactionDataCollection; +type HistoryWallet = ExtendedTransactionDataCollection; export class TransactionAggregate { readonly #profile: ProfileContract; @@ -17,17 +19,17 @@ export class TransactionAggregate { this.#profile = profile; } - public async transactions(query: Contracts.ClientPagination = {}): Promise { + public async transactions(query: Contracts.ClientPagination = {}): Promise { return this.aggregate("transactions", query); } - public async sentTransactions(query: Contracts.ClientPagination = {}): Promise { + public async sentTransactions(query: Contracts.ClientPagination = {}): Promise { return this.aggregate("sentTransactions", query); } public async receivedTransactions( query: Contracts.ClientPagination = {}, - ): Promise { + ): Promise { return this.aggregate("receivedTransactions", query); } @@ -44,12 +46,12 @@ export class TransactionAggregate { private async aggregate( method: string, query: Contracts.ClientPagination, - ): Promise { + ): Promise { if (!this.#history[method]) { this.#history[method] = {}; } - const syncedWallets: Wallet[] = this.getWallets(); + const syncedWallets: ReadWriteWallet[] = this.getWallets(); const requests: Record> = {}; @@ -71,8 +73,8 @@ export class TransactionAggregate { }); } - const responses = await promiseAllSettledByKey(requests); - const result: Contracts.TransactionDataTypeCollection = []; + const responses = await promiseAllSettledByKey(requests); + const result: ExtendedTransactionData[] = []; for (const [id, request] of Object.entries(responses || {})) { if (request.status === "rejected" || request.value instanceof Error) { @@ -90,21 +92,21 @@ export class TransactionAggregate { this.#history[method][id] = request.value; } - return new Coins.TransactionDataCollection(result, { + return new ExtendedTransactionDataCollection(result, { prev: undefined, self: undefined, next: Number(this.hasMore(method)), }); } - private getWallet(id: string): Wallet { + private getWallet(id: string): ReadWriteWallet { return this.#profile.wallets().findById(id); } - private getWallets(): Wallet[] { + private getWallets(): ReadWriteWallet[] { return this.#profile .wallets() .values() - .filter((wallet: Wallet) => wallet.hasSyncedWithNetwork()); + .filter((wallet: ReadWriteWallet) => wallet.hasSyncedWithNetwork()); } } diff --git a/packages/platform-sdk-profiles/src/profiles/aggregates/wallet-aggregate.ts b/packages/platform-sdk-profiles/src/profiles/aggregates/wallet-aggregate.ts index e3254e3f15..5a1f1bc615 100644 --- a/packages/platform-sdk-profiles/src/profiles/aggregates/wallet-aggregate.ts +++ b/packages/platform-sdk-profiles/src/profiles/aggregates/wallet-aggregate.ts @@ -1,6 +1,7 @@ import { BigNumber } from "@arkecosystem/platform-sdk-support"; import { Wallet } from "../../wallets/wallet"; +import { ReadWriteWallet } from "../../wallets/wallet.models"; import { ProfileContract } from "../profile.models"; export class WalletAggregate { @@ -14,18 +15,18 @@ export class WalletAggregate { return this.#profile .wallets() .values() - .reduce((total: BigNumber, wallet: Wallet) => total.plus(wallet.balance()), BigNumber.ZERO); + .reduce((total: BigNumber, wallet: ReadWriteWallet) => total.plus(wallet.balance()), BigNumber.ZERO); } public balancePerCoin(): Record { const result = {}; const totalByProfile: BigNumber = this.#profile.balance(); - const walletsByCoin: Record> = this.#profile.wallets().allByCoin(); + const walletsByCoin: Record> = this.#profile.wallets().allByCoin(); for (const [coin, wallets] of Object.entries(walletsByCoin)) { const totalByCoin: BigNumber = Object.values(wallets).reduce( - (total: BigNumber, wallet: Wallet) => total.plus(wallet.balance()), + (total: BigNumber, wallet: ReadWriteWallet) => total.plus(wallet.balance()), BigNumber.ZERO, ); diff --git a/packages/platform-sdk-profiles/src/repositories/wallet-repository.test.ts b/packages/platform-sdk-profiles/src/repositories/wallet-repository.test.ts index bd9fdc0700..96c0af90fb 100644 --- a/packages/platform-sdk-profiles/src/repositories/wallet-repository.test.ts +++ b/packages/platform-sdk-profiles/src/repositories/wallet-repository.test.ts @@ -13,6 +13,7 @@ import { Profile } from "../profiles/profile"; import { ProfileSetting } from "../profiles/profile.models"; import { Wallet } from "../wallets/wallet"; import { WalletRepository } from "./wallet-repository"; +import { ReadWriteWallet } from "../wallets/wallet.models"; let subject: WalletRepository; @@ -104,9 +105,9 @@ test("#findByCoin", () => { }); describe("#sortBy", () => { - let walletARK: Wallet; - let walletBTC: Wallet; - let walletETH: Wallet; + let walletARK: ReadWriteWallet; + let walletBTC: ReadWriteWallet; + let walletETH: ReadWriteWallet; beforeEach(async () => { subject.flush(); diff --git a/packages/platform-sdk-profiles/src/repositories/wallet-repository.ts b/packages/platform-sdk-profiles/src/repositories/wallet-repository.ts index 2a07317ffd..065e4bd152 100644 --- a/packages/platform-sdk-profiles/src/repositories/wallet-repository.ts +++ b/packages/platform-sdk-profiles/src/repositories/wallet-repository.ts @@ -4,6 +4,7 @@ import { v4 as uuidv4 } from "uuid"; import { Profile } from "../profiles/profile"; import { Wallet } from "../wallets/wallet"; +import { ReadWriteWallet } from "../wallets/wallet.models"; import { DataRepository } from "./data-repository"; export class WalletRepository { @@ -15,19 +16,19 @@ export class WalletRepository { this.#profile = profile; } - public all(): Record { - return this.#data.all() as Record; + public all(): Record { + return this.#data.all() as Record; } - public first(): Wallet { + public first(): ReadWriteWallet { return this.#data.first(); } - public last(): Wallet { + public last(): ReadWriteWallet { return this.#data.last(); } - public allByCoin(): Record> { + public allByCoin(): Record> { const result = {}; for (const [id, wallet] of Object.entries(this.all())) { @@ -49,13 +50,13 @@ export class WalletRepository { return this.#data.keys(); } - public values(): Wallet[] { + public values(): ReadWriteWallet[] { return this.#data.values(); } - public async importByMnemonic(mnemonic: string, coin: string, network: string): Promise { + public async importByMnemonic(mnemonic: string, coin: string, network: string): Promise { const id: string = uuidv4(); - const wallet: Wallet = new Wallet(id, this.#profile); + const wallet = new Wallet(id, this.#profile); await wallet.setCoin(coin, network); await wallet.setIdentity(mnemonic); @@ -63,9 +64,9 @@ export class WalletRepository { return this.storeWallet(id, wallet); } - public async importByAddress(address: string, coin: string, network: string): Promise { + public async importByAddress(address: string, coin: string, network: string): Promise { const id: string = uuidv4(); - const wallet: Wallet = new Wallet(id, this.#profile); + const wallet = new Wallet(id, this.#profile); await wallet.setCoin(coin, network); await wallet.setAddress(address); @@ -73,14 +74,14 @@ export class WalletRepository { return this.storeWallet(id, wallet); } - public async generate(coin: string, network: string): Promise<{ mnemonic: string; wallet: Wallet }> { + public async generate(coin: string, network: string): Promise<{ mnemonic: string; wallet: ReadWriteWallet }> { const mnemonic: string = BIP39.generate(); return { mnemonic, wallet: await this.importByMnemonic(mnemonic, coin, network) }; } - public async restore({ id, coin, coinConfig, network, address, data, settings }): Promise { - const wallet: Wallet = new Wallet(id, this.#profile); + public async restore({ id, coin, coinConfig, network, address, data, settings }): Promise { + const wallet = new Wallet(id, this.#profile); await wallet.setCoin(coin, network); await wallet.setAddress(address); @@ -93,11 +94,11 @@ export class WalletRepository { wallet.settings().fill(settings); - return this.storeWallet(wallet.id(), wallet); + return this.storeWallet(wallet.id(), wallet as ReadWriteWallet); } - public findById(id: string): Wallet { - const wallet: Wallet | undefined = this.#data.get(id); + public findById(id: string): ReadWriteWallet { + const wallet: ReadWriteWallet | undefined = this.#data.get(id); if (!wallet) { throw new Error(`Failed to find a wallet for [${id}].`); @@ -106,21 +107,21 @@ export class WalletRepository { return wallet; } - public findByAddress(address: string): Wallet | undefined { - return this.values().find((wallet: Wallet) => wallet.address() === address); + public findByAddress(address: string): ReadWriteWallet | undefined { + return this.values().find((wallet: ReadWriteWallet) => wallet.address() === address); } - public findByPublicKey(publicKey: string): Wallet | undefined { - return this.values().find((wallet: Wallet) => wallet.publicKey() === publicKey); + public findByPublicKey(publicKey: string): ReadWriteWallet | undefined { + return this.values().find((wallet: ReadWriteWallet) => wallet.publicKey() === publicKey); } - public findByCoin(coin: string): Wallet[] { - return this.values().filter((wallet: Wallet) => wallet.coin().manifest().get("name") === coin); + public findByCoin(coin: string): ReadWriteWallet[] { + return this.values().filter((wallet: ReadWriteWallet) => wallet.coin().manifest().get("name") === coin); } - public findByCoinWithNetwork(coin: string, network: string): Wallet[] { + public findByCoinWithNetwork(coin: string, network: string): ReadWriteWallet[] { return this.values().filter( - (wallet: Wallet) => + (wallet: ReadWriteWallet) => wallet.coin().manifest().get("name") === coin && wallet.network().id === network, ); } @@ -151,10 +152,10 @@ export class WalletRepository { return result; } - public sortBy(column: string, direction: "asc" | "desc" = "asc"): Wallet[] { + public sortBy(column: string, direction: "asc" | "desc" = "asc"): ReadWriteWallet[] { // TODO: sort by balance as fiat (BigInt) - const sortFunction = (wallet: Wallet) => { + const sortFunction = (wallet: ReadWriteWallet) => { if (column === "coin") { return wallet.currency(); } @@ -177,7 +178,7 @@ export class WalletRepository { return sortByDesc(this.values(), sortFunction); } - private storeWallet(id: string, wallet: Wallet): Wallet { + private storeWallet(id: string, wallet: ReadWriteWallet): ReadWriteWallet { if (this.findByAddress(wallet.address())) { throw new Error(`The wallet [${wallet.address()}] already exists.`); } diff --git a/packages/platform-sdk-profiles/src/wallets/aggregates/entity-aggregate.ts b/packages/platform-sdk-profiles/src/wallets/aggregates/entity-aggregate.ts index 65c8412dc6..43cd1f39c9 100644 --- a/packages/platform-sdk-profiles/src/wallets/aggregates/entity-aggregate.ts +++ b/packages/platform-sdk-profiles/src/wallets/aggregates/entity-aggregate.ts @@ -1,6 +1,7 @@ -import { Coins, Contracts } from "@arkecosystem/platform-sdk"; +import { Contracts } from "@arkecosystem/platform-sdk"; -import { transformTransactionData } from "../../dto/transaction-mapper"; +import { ExtendedTransactionDataCollection } from "../../dto/transaction-collection"; +import { transformTransactionDataCollection } from "../../dto/transaction-mapper"; import { ReadWriteWallet } from "../wallet.models"; export class EntityAggregate { @@ -14,19 +15,16 @@ export class EntityAggregate { entityType: string, entityAction: string, query: Contracts.ClientPagination, - ): Promise { - const result = await this.#wallet.client().transactions({ - ...query, - // @ts-ignore - TODO: We need to expand the properties that are allowed to be passed to be transaction search methods. - entityType, - entityAction, - senderPublicKey: this.#wallet.publicKey(), - }); - - result.transform((transaction: Contracts.TransactionDataType) => - transformTransactionData(this.#wallet, transaction), + ): Promise { + return transformTransactionDataCollection( + this.#wallet, + await this.#wallet.client().transactions({ + ...query, + // @ts-ignore - TODO: We need to expand the properties that are allowed to be passed to be transaction search methods. + entityType, + entityAction, + senderPublicKey: this.#wallet.publicKey(), + }), ); - - return result; } } diff --git a/packages/platform-sdk-profiles/src/wallets/aggregates/entity-registration-aggregate.ts b/packages/platform-sdk-profiles/src/wallets/aggregates/entity-registration-aggregate.ts index 2d4ee85124..304732cab9 100644 --- a/packages/platform-sdk-profiles/src/wallets/aggregates/entity-registration-aggregate.ts +++ b/packages/platform-sdk-profiles/src/wallets/aggregates/entity-registration-aggregate.ts @@ -1,31 +1,32 @@ -import { Coins, Contracts } from "@arkecosystem/platform-sdk"; +import { Contracts } from "@arkecosystem/platform-sdk"; +import { ExtendedTransactionDataCollection } from "../../dto/transaction-collection"; import { EntityAggregate } from "./entity-aggregate"; export class EntityRegistrationAggregate extends EntityAggregate { - public async all(query: Contracts.ClientPagination = {}): Promise { + public async all(query: Contracts.ClientPagination = {}): Promise { return this.aggregate("all", "register", query); } - public async businesses(query: Contracts.ClientPagination = {}): Promise { + public async businesses(query: Contracts.ClientPagination = {}): Promise { return this.aggregate("business", "register", query); } - public async delegates(query: Contracts.ClientPagination = {}): Promise { + public async delegates(query: Contracts.ClientPagination = {}): Promise { return this.aggregate("delegate", "register", query); } - public async plugins(query: Contracts.ClientPagination = {}): Promise { + public async plugins(query: Contracts.ClientPagination = {}): Promise { return this.aggregate("plugin", "register", query); } - public async corePlugins(query: Contracts.ClientPagination = {}): Promise { + public async corePlugins(query: Contracts.ClientPagination = {}): Promise { return this.aggregate("corePlugin", "register", query); } public async desktopWalletPlugins( query: Contracts.ClientPagination = {}, - ): Promise { + ): Promise { return this.aggregate("desktopWalletPlugin", "register", query); } } diff --git a/packages/platform-sdk-profiles/src/wallets/aggregates/entity-resignation-aggregate.ts b/packages/platform-sdk-profiles/src/wallets/aggregates/entity-resignation-aggregate.ts index 593badfda3..67cf24e070 100644 --- a/packages/platform-sdk-profiles/src/wallets/aggregates/entity-resignation-aggregate.ts +++ b/packages/platform-sdk-profiles/src/wallets/aggregates/entity-resignation-aggregate.ts @@ -1,31 +1,32 @@ -import { Coins, Contracts } from "@arkecosystem/platform-sdk"; +import { Contracts } from "@arkecosystem/platform-sdk"; +import { ExtendedTransactionDataCollection } from "../../dto/transaction-collection"; import { EntityAggregate } from "./entity-aggregate"; export class EntityResignationAggregate extends EntityAggregate { - public async all(query: Contracts.ClientPagination = {}): Promise { + public async all(query: Contracts.ClientPagination = {}): Promise { return this.aggregate("all", "resign", query); } - public async businesses(query: Contracts.ClientPagination = {}): Promise { + public async businesses(query: Contracts.ClientPagination = {}): Promise { return this.aggregate("business", "resign", query); } - public async delegates(query: Contracts.ClientPagination = {}): Promise { + public async delegates(query: Contracts.ClientPagination = {}): Promise { return this.aggregate("delegate", "resign", query); } - public async plugins(query: Contracts.ClientPagination = {}): Promise { + public async plugins(query: Contracts.ClientPagination = {}): Promise { return this.aggregate("plugin", "resign", query); } - public async corePlugins(query: Contracts.ClientPagination = {}): Promise { + public async corePlugins(query: Contracts.ClientPagination = {}): Promise { return this.aggregate("corePlugin", "resign", query); } public async desktopWalletPlugins( query: Contracts.ClientPagination = {}, - ): Promise { + ): Promise { return this.aggregate("desktopWalletPlugin", "resign", query); } } diff --git a/packages/platform-sdk-profiles/src/wallets/aggregates/entity-update-aggregate.ts b/packages/platform-sdk-profiles/src/wallets/aggregates/entity-update-aggregate.ts index e455bdd1b8..e0b8f42eb2 100644 --- a/packages/platform-sdk-profiles/src/wallets/aggregates/entity-update-aggregate.ts +++ b/packages/platform-sdk-profiles/src/wallets/aggregates/entity-update-aggregate.ts @@ -1,31 +1,32 @@ -import { Coins, Contracts } from "@arkecosystem/platform-sdk"; +import { Contracts } from "@arkecosystem/platform-sdk"; +import { ExtendedTransactionDataCollection } from "../../dto/transaction-collection"; import { EntityAggregate } from "./entity-aggregate"; export class EntityUpdateAggregate extends EntityAggregate { - public async all(query: Contracts.ClientPagination = {}): Promise { + public async all(query: Contracts.ClientPagination = {}): Promise { return this.aggregate("all", "update", query); } - public async businesses(query: Contracts.ClientPagination = {}): Promise { + public async businesses(query: Contracts.ClientPagination = {}): Promise { return this.aggregate("business", "update", query); } - public async delegates(query: Contracts.ClientPagination = {}): Promise { + public async delegates(query: Contracts.ClientPagination = {}): Promise { return this.aggregate("delegate", "update", query); } - public async plugins(query: Contracts.ClientPagination = {}): Promise { + public async plugins(query: Contracts.ClientPagination = {}): Promise { return this.aggregate("plugin", "update", query); } - public async corePlugins(query: Contracts.ClientPagination = {}): Promise { + public async corePlugins(query: Contracts.ClientPagination = {}): Promise { return this.aggregate("corePlugin", "update", query); } public async desktopWalletPlugins( query: Contracts.ClientPagination = {}, - ): Promise { + ): Promise { return this.aggregate("desktopWalletPlugin", "update", query); } } diff --git a/packages/platform-sdk-profiles/src/wallets/wallet.models.ts b/packages/platform-sdk-profiles/src/wallets/wallet.models.ts index 41f69188ab..dc80397e6f 100644 --- a/packages/platform-sdk-profiles/src/wallets/wallet.models.ts +++ b/packages/platform-sdk-profiles/src/wallets/wallet.models.ts @@ -1,6 +1,7 @@ import { Coins, Contracts } from "@arkecosystem/platform-sdk"; import { BigNumber } from "@arkecosystem/platform-sdk-support"; +import { ExtendedTransactionDataCollection } from "../dto/transaction-collection"; import { DataRepository } from "../repositories/data-repository"; import { SettingRepository } from "../repositories/setting-repository"; import { EntityRegistrationAggregate } from "./aggregates/entity-registration-aggregate"; @@ -97,9 +98,9 @@ export interface ReadWriteWallet { message(): Contracts.MessageService; peer(): Contracts.PeerService; transaction(): TransactionService; - transactions(query: Contracts.ClientTransactionsInput): Promise; - sentTransactions(query: Contracts.ClientTransactionsInput): Promise; - receivedTransactions(query: Contracts.ClientTransactionsInput): Promise; + transactions(query: Contracts.ClientTransactionsInput): Promise; + sentTransactions(query: Contracts.ClientTransactionsInput): Promise; + receivedTransactions(query: Contracts.ClientTransactionsInput): Promise; votes(): ReadOnlyWallet[]; votesAvailable(): number; votesUsed(): number; diff --git a/packages/platform-sdk-profiles/src/wallets/wallet.ts b/packages/platform-sdk-profiles/src/wallets/wallet.ts index 67fa921068..4ab1502507 100644 --- a/packages/platform-sdk-profiles/src/wallets/wallet.ts +++ b/packages/platform-sdk-profiles/src/wallets/wallet.ts @@ -1,7 +1,7 @@ import { Coins, Contracts } from "@arkecosystem/platform-sdk"; import { BigNumber } from "@arkecosystem/platform-sdk-support"; -import { transformTransactionData } from "../dto/transaction-mapper"; +import { transformTransactionDataCollection } from "../dto/transaction-mapper"; import { makeCoin } from "../environment/container.helpers"; import { Profile } from "../profiles/profile"; import { DataRepository } from "../repositories/data-repository"; @@ -14,6 +14,7 @@ import { DelegateMapper } from "../mappers/delegate-mapper"; import { ReadOnlyWallet } from "./read-only-wallet"; import { TransactionService } from "./wallet-transaction-service"; import { ReadWriteWallet, WalletData, WalletFlag, WalletSetting, WalletStruct } from "./wallet.models"; +import { ExtendedTransactionDataCollection } from "../dto/transaction-collection"; export class Wallet implements ReadWriteWallet { readonly #entityRegistrationAggregate: EntityRegistrationAggregate; @@ -331,19 +332,21 @@ export class Wallet implements ReadWriteWallet { * These methods serve as helpers to interact with the underlying coin. */ - public async transactions(query: Contracts.ClientTransactionsInput = {}): Promise { + public async transactions( + query: Contracts.ClientTransactionsInput = {}, + ): Promise { return this.fetchTransaction({ addresses: [this.address()], ...query }); } public async sentTransactions( query: Contracts.ClientTransactionsInput = {}, - ): Promise { + ): Promise { return this.fetchTransaction({ senderId: this.address(), ...query }); } public async receivedTransactions( query: Contracts.ClientTransactionsInput = {}, - ): Promise { + ): Promise { return this.fetchTransaction({ recipientId: this.address(), ...query }); } @@ -447,7 +450,9 @@ export class Wallet implements ReadWriteWallet { this.data().set(WalletData.ExchangeRate, await this.#profile.getExchangeRate(this.currency())); } - private async fetchTransaction(query: Contracts.ClientTransactionsInput): Promise { + private async fetchTransaction( + query: Contracts.ClientTransactionsInput, + ): Promise { const result = await this.#coin.client().transactions(query); for (const transaction of result.items()) { @@ -455,9 +460,7 @@ export class Wallet implements ReadWriteWallet { transaction.setMeta("publicKey", this.publicKey()); } - result.transform((transaction: Contracts.TransactionDataType) => transformTransactionData(this, transaction)); - - return result; + return transformTransactionDataCollection(this, result); } private restore(): void { diff --git a/packages/platform-sdk/src/coins/collections/index.ts b/packages/platform-sdk/src/coins/collections/index.ts index 1416ec6ab3..7c3fc791fd 100644 --- a/packages/platform-sdk/src/coins/collections/index.ts +++ b/packages/platform-sdk/src/coins/collections/index.ts @@ -1,2 +1,3 @@ +export * from "./paginator"; export * from "./transactions"; export * from "./wallets"; diff --git a/packages/platform-sdk/src/coins/collections/paginator.ts b/packages/platform-sdk/src/coins/collections/paginator.ts index 9b7e9899f2..aa98130287 100644 --- a/packages/platform-sdk/src/coins/collections/paginator.ts +++ b/packages/platform-sdk/src/coins/collections/paginator.ts @@ -50,4 +50,12 @@ export abstract class Paginator { this.#data[i] = callback(this.#data[i]); } } + + public getData(): T[] { + return this.#data; + } + + public getPagination(): MetaPagination { + return this.#pagination; + } } From 7dc13ac99bbbb41f1f77ee6c0689559717d3aa6d Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Mon, 24 Aug 2020 09:16:27 +0300 Subject: [PATCH 2/2] wip --- .../aggregates/transaction-aggregate.test.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/platform-sdk-profiles/src/profiles/aggregates/transaction-aggregate.test.ts b/packages/platform-sdk-profiles/src/profiles/aggregates/transaction-aggregate.test.ts index 5a88b9342f..b9e2dcc135 100644 --- a/packages/platform-sdk-profiles/src/profiles/aggregates/transaction-aggregate.test.ts +++ b/packages/platform-sdk-profiles/src/profiles/aggregates/transaction-aggregate.test.ts @@ -1,11 +1,11 @@ import "jest-extended"; -import { Coins } from "@arkecosystem/platform-sdk"; import { ARK } from "@arkecosystem/platform-sdk-ark"; import { Request } from "@arkecosystem/platform-sdk-http-got"; import nock from "nock"; import { identity } from "../../../test/fixtures/identity"; +import { ExtendedTransactionDataCollection } from "../../dto/transaction-collection"; import { container } from "../../environment/container"; import { Identifiers } from "../../environment/container.models"; import { Profile } from "../profile"; @@ -51,7 +51,7 @@ describe.each(["transactions", "sentTransactions", "receivedTransactions"])("%s" const result = await subject[method](); - expect(result).toBeInstanceOf(Coins.TransactionDataCollection); + expect(result).toBeInstanceOf(ExtendedTransactionDataCollection); expect(result.items()).toHaveLength(100); }); @@ -62,7 +62,7 @@ describe.each(["transactions", "sentTransactions", "receivedTransactions"])("%s" const result = await subject[method](); - expect(result).toBeInstanceOf(Coins.TransactionDataCollection); + expect(result).toBeInstanceOf(ExtendedTransactionDataCollection); expect(result.items()).toHaveLength(100); expect(subject.hasMore(method)).toBeFalse(); }); @@ -72,7 +72,7 @@ describe.each(["transactions", "sentTransactions", "receivedTransactions"])("%s" const result = await subject[method](); - expect(result).toBeInstanceOf(Coins.TransactionDataCollection); + expect(result).toBeInstanceOf(ExtendedTransactionDataCollection); expect(result.items()).toHaveLength(0); expect(subject.hasMore(method)).toBeFalse(); }); @@ -84,7 +84,7 @@ describe.each(["transactions", "sentTransactions", "receivedTransactions"])("%s" const result = await subject[method](); - expect(result).toBeInstanceOf(Coins.TransactionDataCollection); + expect(result).toBeInstanceOf(ExtendedTransactionDataCollection); expect(result.items()).toHaveLength(0); expect(subject.hasMore(method)).toBeFalse(); }); @@ -99,21 +99,21 @@ describe.each(["transactions", "sentTransactions", "receivedTransactions"])("%s" // We receive a response that does contain a "next" cursor const firstRequest = await subject[method](); - expect(firstRequest).toBeInstanceOf(Coins.TransactionDataCollection); + expect(firstRequest).toBeInstanceOf(ExtendedTransactionDataCollection); expect(firstRequest.items()).toHaveLength(100); expect(subject.hasMore(method)).toBeTrue(); // We receive a response that does not contain a "next" cursor const secondRequest = await subject[method](); - expect(secondRequest).toBeInstanceOf(Coins.TransactionDataCollection); + expect(secondRequest).toBeInstanceOf(ExtendedTransactionDataCollection); expect(secondRequest.items()).toHaveLength(100); expect(subject.hasMore(method)).toBeFalse(); // We do not send any requests because no more data is available const thirdRequest = await subject[method](); - expect(thirdRequest).toBeInstanceOf(Coins.TransactionDataCollection); + expect(thirdRequest).toBeInstanceOf(ExtendedTransactionDataCollection); expect(thirdRequest.items()).toHaveLength(0); expect(subject.hasMore(method)).toBeFalse(); });