diff --git a/src/endpoints/transactions/transaction.price.service.ts b/src/endpoints/transactions/transaction.price.service.ts new file mode 100644 index 000000000..870f179b0 --- /dev/null +++ b/src/endpoints/transactions/transaction.price.service.ts @@ -0,0 +1,60 @@ +import { Injectable } from "@nestjs/common"; +import { ApiConfigService } from "src/common/api.config.service"; +import { CachingService } from "src/common/caching.service"; +import { DataApiService } from "src/common/data.api.service"; +import { DataQuoteType } from "src/common/entities/data.quote.type"; +import { Constants } from "src/utils/constants"; +import { TransactionDetailed } from "./entities/transaction.detailed"; + +@Injectable() +export class TransactionPriceService { + + constructor( + private readonly cachingService: CachingService, + private readonly apiConfigService: ApiConfigService, + private readonly dataApiService: DataApiService, + ) { } + + async getTransactionPrice(transaction: TransactionDetailed): Promise { + let dataUrl = this.apiConfigService.getDataUrl(); + if (!dataUrl) { + return undefined; + } + + let transactionDate = transaction.getDate(); + if (!transactionDate) { + return undefined; + } + + let price = await this.getTransactionPriceForDate(transactionDate); + if (price) { + price = Number(price).toRounded(2); + } + + return price; + } + + private async getTransactionPriceForDate(date: Date): Promise { + if (date.isToday()) { + return await this.getTransactionPriceToday(); + } + + return await this.getTransactionPriceHistorical(date); + } + + private async getTransactionPriceToday(): Promise { + return await this.cachingService.getOrSetCache( + 'currentPrice', + async () => await this.dataApiService.getQuotesHistoricalLatest(DataQuoteType.price), + Constants.oneHour() + ); + } + + private async getTransactionPriceHistorical(date: Date): Promise { + return await this.cachingService.getOrSetCache( + `price:${date.toISODateString()}`, + async () => await this.dataApiService.getQuotesHistoricalTimestamp(DataQuoteType.price, date.getTime() / 1000), + Constants.oneDay() * 7 + ); + } +} \ No newline at end of file diff --git a/src/endpoints/transactions/transaction.service.ts b/src/endpoints/transactions/transaction.service.ts index 62832abc3..aba0620b9 100644 --- a/src/endpoints/transactions/transaction.service.ts +++ b/src/endpoints/transactions/transaction.service.ts @@ -1,8 +1,5 @@ import { Injectable, Logger } from '@nestjs/common'; import { ApiConfigService } from 'src/common/api.config.service'; -import { CachingService } from 'src/common/caching.service'; -import { DataApiService } from 'src/common/data.api.service'; -import { DataQuoteType } from 'src/common/entities/data.quote.type'; import { AbstractQuery } from 'src/common/entities/elastic/abstract.query'; import { ElasticPagination } from 'src/common/entities/elastic/elastic.pagination'; import { ElasticQuery } from 'src/common/entities/elastic/elastic.query'; @@ -14,7 +11,6 @@ import { GatewayService } from 'src/common/gateway.service'; import { AddressUtils } from 'src/utils/address.utils'; import { ApiUtils } from 'src/utils/api.utils'; import { BinaryUtils } from 'src/utils/binary.utils'; -import { Constants } from 'src/utils/constants'; import { ElasticService } from '../../common/elastic.service'; import { SmartContractResult } from './entities/smart.contract.result'; import { Transaction } from './entities/transaction'; @@ -32,6 +28,7 @@ import { TransactionOperationAction } from './entities/transaction.operation.act import { QueryOperator } from 'src/common/entities/elastic/query.operator'; import { TransactionScamCheckService } from './scam-check/transaction-scam-check.service'; import { TransactionScamInfo } from './entities/transaction-scam-info'; +import { TransactionPriceService } from './transaction.price.service'; @Injectable() export class TransactionService { @@ -39,10 +36,9 @@ export class TransactionService { constructor( private readonly elasticService: ElasticService, - private readonly cachingService: CachingService, private readonly gatewayService: GatewayService, private readonly apiConfigService: ApiConfigService, - private readonly dataApiService: DataApiService, + private readonly transactionPriceService: TransactionPriceService, private readonly transactionScamCheckService: TransactionScamCheckService, ) { this.logger = new Logger(TransactionService.name); @@ -192,7 +188,7 @@ export class TransactionService { if (transaction !== null) { try { const [price, scamInfo] = await Promise.all([ - this.getTransactionPrice(transaction), + this.transactionPriceService.getTransactionPrice(transaction), this.getScamInfo(transaction), ]); @@ -207,49 +203,6 @@ export class TransactionService { return transaction; } - private async getTransactionPrice(transaction: TransactionDetailed): Promise { - let dataUrl = this.apiConfigService.getDataUrl(); - if (!dataUrl) { - return undefined; - } - - let transactionDate = transaction.getDate(); - if (!transactionDate) { - return undefined; - } - - let price = await this.getTransactionPriceForDate(transactionDate); - if (price) { - price = Number(price).toRounded(2); - } - - return price; - } - - private async getTransactionPriceForDate(date: Date): Promise { - if (date.isToday()) { - return await this.getTransactionPriceToday(); - } - - return await this.getTransactionPriceHistorical(date); - } - - private async getTransactionPriceToday(): Promise { - return await this.cachingService.getOrSetCache( - 'currentPrice', - async () => await this.dataApiService.getQuotesHistoricalLatest(DataQuoteType.price), - Constants.oneHour() - ); - } - - private async getTransactionPriceHistorical(date: Date): Promise { - return await this.cachingService.getOrSetCache( - `price:${date.toISODateString()}`, - async () => await this.dataApiService.getQuotesHistoricalTimestamp(DataQuoteType.price, date.getTime() / 1000), - Constants.oneDay() * 7 - ); - } - private async tryGetTransactionFromElasticBySenderAndNonce(sender: string, nonce: number): Promise { const query: ElasticQuery = new ElasticQuery(); query.pagination = { from: 0, size: 1 }; diff --git a/src/public.app.module.ts b/src/public.app.module.ts index acf286670..136501aa1 100644 --- a/src/public.app.module.ts +++ b/src/public.app.module.ts @@ -63,6 +63,7 @@ import "./utils/extensions/date.extensions"; import "./utils/extensions/number.extensions"; import { NftThumbnailService } from './common/nft.thumbnail.service'; import { NftExtendedAttributesService } from './common/nft.extendedattributes.service'; +import { TransactionPriceService } from './endpoints/transactions/transaction.price.service'; @Module({ imports: [ @@ -103,6 +104,7 @@ import { NftExtendedAttributesService } from './common/nft.extendedattributes.se DelegationService, CacheConfigService, CachingInterceptor, ShardService, MetricsService, IdentitiesService, TokenAssetService, DataApiService, KeysService, WaitingListService, BlsService, TagService, ExtrasApiService, TransactionScamCheckService, PotentialScamTransactionChecker, NftThumbnailService, NftExtendedAttributesService, + TransactionPriceService, ], exports: [ ApiConfigService, RoundService, CachingService, TransactionService, GatewayService, MetricsService, NodeService,