diff --git a/CHANGELOG.md b/CHANGELOG.md index 741481dec2..a311e9ab5f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### Changed + +- Improved the performance of the historical market data table of the admin control panel by loading only the latest market price per asset profile + ## 3.80.2 - 2026-10-06 ### Added diff --git a/apps/api/src/app/endpoints/asset-profiles/asset-profiles.service.ts b/apps/api/src/app/endpoints/asset-profiles/asset-profiles.service.ts index 4a2507e697..2aefc4535e 100644 --- a/apps/api/src/app/endpoints/asset-profiles/asset-profiles.service.ts +++ b/apps/api/src/app/endpoints/asset-profiles/asset-profiles.service.ts @@ -334,37 +334,6 @@ export class AssetProfilesService { const symbolProfiles = symbolProfileResult[0]; let count = symbolProfileResult[1]; - const lastMarketPrices = await this.prismaService.marketData.findMany({ - distinct: ['dataSource', 'symbol'], - orderBy: { date: 'desc' }, - select: { - dataSource: true, - marketPrice: true, - symbol: true - }, - where: { - dataSource: { - in: symbolProfiles.map(({ dataSource }) => { - return dataSource; - }) - }, - symbol: { - in: symbolProfiles.map(({ symbol }) => { - return symbol; - }) - } - } - }); - - const lastMarketPriceMap = new Map(); - - for (const { dataSource, marketPrice, symbol } of lastMarketPrices) { - lastMarketPriceMap.set( - getAssetProfileIdentifier({ dataSource, symbol }), - marketPrice - ); - } - const dataProviderInfoMap = new Map( [ ...new Set( @@ -405,9 +374,9 @@ export class AssetProfilesService { const countriesCount = countries ? Object.keys(countries).length : 0; - const lastMarketPrice = lastMarketPriceMap.get( - getAssetProfileIdentifier({ dataSource, symbol }) - ); + const lastMarketPrice = ( + await this.marketDataService.getLatest({ dataSource, symbol }) + )?.marketPrice; const marketDataItemCount = marketDataItems.find((marketDataItem) => { @@ -552,42 +521,10 @@ export class AssetProfilesService { private async getAssetProfilesForCurrencies(): Promise { const currencyPairs = this.exchangeRateDataService.getCurrencyPairs(); - const [lastMarketPrices, marketDataItems] = await Promise.all([ - this.prismaService.marketData.findMany({ - distinct: ['dataSource', 'symbol'], - orderBy: { date: 'desc' }, - select: { - dataSource: true, - marketPrice: true, - symbol: true - }, - where: { - dataSource: { - in: currencyPairs.map(({ dataSource }) => { - return dataSource; - }) - }, - symbol: { - in: currencyPairs.map(({ symbol }) => { - return symbol; - }) - } - } - }), - this.prismaService.marketData.groupBy({ - _count: true, - by: ['dataSource', 'symbol'] - }) - ]); - - const lastMarketPriceMap = new Map(); - - for (const { dataSource, marketPrice, symbol } of lastMarketPrices) { - lastMarketPriceMap.set( - getAssetProfileIdentifier({ dataSource, symbol }), - marketPrice - ); - } + const marketDataItems = await this.prismaService.marketData.groupBy({ + _count: true, + by: ['dataSource', 'symbol'] + }); const assetProfilePromises: Promise[] = currencyPairs.map( async ({ dataSource, symbol }) => { @@ -601,9 +538,9 @@ export class AssetProfilesService { await this.activitiesService.getStatisticsByCurrency(currency)); } - const lastMarketPrice = lastMarketPriceMap.get( - getAssetProfileIdentifier({ dataSource, symbol }) - ); + const lastMarketPrice = ( + await this.marketDataService.getLatest({ dataSource, symbol }) + )?.marketPrice; const marketDataItemCount = marketDataItems.find((marketDataItem) => {