From 623916f2abce12e899aafc8213d9c7db921f28c3 Mon Sep 17 00:00:00 2001 From: Traian Anghel Date: Tue, 2 Jul 2024 10:31:35 +0300 Subject: [PATCH] perform nft query only once when fetching transactions with operations (#1286) --- .../tokens/token.transfer.service.ts | 17 --------------- .../transactions/transaction.get.service.ts | 21 +++++++++++++++++++ .../transactions/transaction.service.ts | 4 ++++ 3 files changed, 25 insertions(+), 17 deletions(-) diff --git a/src/endpoints/tokens/token.transfer.service.ts b/src/endpoints/tokens/token.transfer.service.ts index 000fd270a..b5af7431e 100644 --- a/src/endpoints/tokens/token.transfer.service.ts +++ b/src/endpoints/tokens/token.transfer.service.ts @@ -14,10 +14,6 @@ import { TransactionDetailed } from "../transactions/entities/transaction.detail import { BinaryUtils } from "@multiversx/sdk-nestjs-common"; import { CacheService } from "@multiversx/sdk-nestjs-cache"; import { OriginLogger } from "@multiversx/sdk-nestjs-common"; -import { QueryPagination } from "src/common/entities/query.pagination"; -import { NftFilter } from "../nfts/entities/nft.filter"; -import { IndexerService } from "src/common/indexer/indexer.service"; -import { TokenAccount } from "src/common/indexer/entities"; @Injectable() export class TokenTransferService { @@ -28,7 +24,6 @@ export class TokenTransferService { @Inject(forwardRef(() => EsdtService)) private readonly esdtService: EsdtService, private readonly assetsService: AssetsService, - private readonly indexerService: IndexerService, ) { } getTokenTransfer(elasticTransaction: any): { tokenIdentifier: string, tokenAmount: string } | undefined { @@ -157,18 +152,6 @@ export class TokenTransferService { } } - const distinctNftIdentifiers = operations.filter(x => x.type === TransactionOperationType.nft).map(x => x.identifier).distinct(); - if (distinctNftIdentifiers.length > 0) { - const elasticNfts = await this.indexerService.getNfts(new QueryPagination({ from: 0, size: distinctNftIdentifiers.length }), new NftFilter({ identifiers: distinctNftIdentifiers })); - const elasticNftsDict = elasticNfts.toRecord(x => x.identifier); - - for (const operation of operations) { - if (elasticNftsDict[operation.identifier]) { - operation.name = elasticNftsDict[operation.identifier].data?.name ?? operation.name; - } - } - } - return operations; } diff --git a/src/endpoints/transactions/transaction.get.service.ts b/src/endpoints/transactions/transaction.get.service.ts index 4112cf67d..5cf0cb237 100644 --- a/src/endpoints/transactions/transaction.get.service.ts +++ b/src/endpoints/transactions/transaction.get.service.ts @@ -16,6 +16,10 @@ import { MiniBlockType } from "../miniblocks/entities/mini.block.type"; import { TransactionStatus } from "./entities/transaction.status"; import { UsernameUtils } from "../usernames/username.utils"; import { TransactionLogEvent } from "./entities/transaction.log.event"; +import { TransactionOperationType } from "./entities/transaction.operation.type"; +import { QueryPagination } from "src/common/entities/query.pagination"; +import { NftFilter } from "../nfts/entities/nft.filter"; +import { TokenAccount } from "src/common/indexer/entities"; @Injectable() export class TransactionGetService { @@ -123,6 +127,7 @@ export class TransactionGetService { } this.applyUsernamesToDetailedTransaction(transaction, transactionDetailed); + await this.applyNftNameOnTransactionOperations([transactionDetailed]); return ApiUtils.mergeObjects(new TransactionDetailed(), transactionDetailed); } catch (error) { @@ -248,4 +253,20 @@ export class TransactionGetService { return null; } } + + async applyNftNameOnTransactionOperations(transactions: TransactionDetailed[]): Promise { + const operations = transactions.selectMany(x => x.operations ?? []); + + const distinctNftIdentifiers = operations.filter(x => x.type === TransactionOperationType.nft).map(x => x.identifier).distinct(); + if (distinctNftIdentifiers.length > 0) { + const elasticNfts = await this.indexerService.getNfts(new QueryPagination({ from: 0, size: distinctNftIdentifiers.length }), new NftFilter({ identifiers: distinctNftIdentifiers })); + const elasticNftsDict = elasticNfts.toRecord(x => x.identifier); + + for (const operation of operations) { + if (elasticNftsDict[operation.identifier]) { + operation.name = elasticNftsDict[operation.identifier].data?.name ?? operation.name; + } + } + } + } } diff --git a/src/endpoints/transactions/transaction.service.ts b/src/endpoints/transactions/transaction.service.ts index e0721fb0e..54c38d2a4 100644 --- a/src/endpoints/transactions/transaction.service.ts +++ b/src/endpoints/transactions/transaction.service.ts @@ -424,6 +424,8 @@ export class TransactionService { detailedTransactions.push(transactionDetailed); } + await this.transactionGetService.applyNftNameOnTransactionOperations(detailedTransactions); + return detailedTransactions; } @@ -489,6 +491,8 @@ export class TransactionService { } } + await this.transactionGetService.applyNftNameOnTransactionOperations(transactions); + return operations; }