|
|
@ -15,7 +15,7 @@ import { |
|
|
|
PROPERTY_IS_READ_ONLY_MODE, |
|
|
|
PROPERTY_IS_USER_SIGNUP_ENABLED |
|
|
|
} from '@ghostfolio/common/config'; |
|
|
|
import { isCurrency, getCurrencyFromSymbol } from '@ghostfolio/common/helper'; |
|
|
|
import { isCurrency, getCurrencyFromSymbol, getAssetProfileIdentifier } from '@ghostfolio/common/helper'; |
|
|
|
import { |
|
|
|
AdminData, |
|
|
|
AdminMarketData, |
|
|
@ -278,7 +278,7 @@ export class AdminService { |
|
|
|
const lastMarketPriceMap = new Map<string, number>(); |
|
|
|
|
|
|
|
for (const { symbol, dataSource, marketPrice } of lastMarketPrices) { |
|
|
|
lastMarketPriceMap.set(`${symbol}_${dataSource}`, marketPrice); |
|
|
|
lastMarketPriceMap.set(getAssetProfileIdentifier({dataSource, symbol}), marketPrice); |
|
|
|
} |
|
|
|
|
|
|
|
let marketData: AdminMarketDataItem[] = await Promise.all( |
|
|
@ -310,7 +310,7 @@ export class AdminService { |
|
|
|
})?._count ?? 0; |
|
|
|
const sectorsCount = sectors ? Object.keys(sectors).length : 0; |
|
|
|
const lastMarketPrice = lastMarketPriceMap.get( |
|
|
|
`${symbol}_${dataSource}` |
|
|
|
getAssetProfileIdentifier({dataSource, symbol}) |
|
|
|
); |
|
|
|
|
|
|
|
return { |
|
|
@ -321,6 +321,7 @@ export class AdminService { |
|
|
|
countriesCount, |
|
|
|
dataSource, |
|
|
|
id, |
|
|
|
lastMarketPrice, |
|
|
|
name, |
|
|
|
symbol, |
|
|
|
marketDataItemCount, |
|
|
@ -328,8 +329,7 @@ export class AdminService { |
|
|
|
activitiesCount: _count.Order, |
|
|
|
date: Order?.[0]?.date, |
|
|
|
isUsedByUsersWithSubscription: |
|
|
|
await isUsedByUsersWithSubscription, |
|
|
|
lastMarketPrice: lastMarketPrice |
|
|
|
await isUsedByUsersWithSubscription |
|
|
|
}; |
|
|
|
} |
|
|
|
) |
|
|
@ -536,30 +536,31 @@ export class AdminService { |
|
|
|
} |
|
|
|
|
|
|
|
private async getMarketDataForCurrencies(): Promise<AdminMarketData> { |
|
|
|
const marketDataItems = await this.prismaService.marketData.groupBy({ |
|
|
|
_count: true, |
|
|
|
by: ['dataSource', 'symbol'] |
|
|
|
}); |
|
|
|
|
|
|
|
const currencyPairs = this.exchangeRateDataService.getCurrencyPairs(); |
|
|
|
// Fetch the last market prices for all currency pairs in one query
|
|
|
|
const lastMarketPrices = await this.prismaService.marketData.findMany({ |
|
|
|
select: { |
|
|
|
symbol: true, |
|
|
|
dataSource: true, |
|
|
|
marketPrice: true |
|
|
|
}, |
|
|
|
where: { |
|
|
|
symbol: { in: currencyPairs.map(({ symbol }) => symbol) }, |
|
|
|
dataSource: { in: currencyPairs.map(({ dataSource }) => dataSource) } |
|
|
|
}, |
|
|
|
orderBy: { date: 'desc' }, |
|
|
|
distinct: ['symbol', 'dataSource'] |
|
|
|
}); |
|
|
|
|
|
|
|
const [marketDataItems, lastMarketPrices] = await Promise.all([ |
|
|
|
this.prismaService.marketData.groupBy({ |
|
|
|
_count: true, |
|
|
|
by: ['dataSource', 'symbol'] |
|
|
|
}), |
|
|
|
this.prismaService.marketData.findMany({ |
|
|
|
select: { |
|
|
|
symbol: true, |
|
|
|
dataSource: true, |
|
|
|
marketPrice: true |
|
|
|
}, |
|
|
|
where: { |
|
|
|
symbol: { in: currencyPairs.map(({ symbol }) => symbol) }, |
|
|
|
dataSource: { in: currencyPairs.map(({ dataSource }) => dataSource) } |
|
|
|
}, |
|
|
|
orderBy: { date: 'desc' }, |
|
|
|
distinct: ['symbol', 'dataSource'] |
|
|
|
}) |
|
|
|
]); |
|
|
|
|
|
|
|
const lastMarketPriceMap = new Map<string, number>(); |
|
|
|
for (const { symbol, dataSource, marketPrice } of lastMarketPrices) { |
|
|
|
lastMarketPriceMap.set(`${symbol}_${dataSource}`, marketPrice); |
|
|
|
lastMarketPriceMap.set(getAssetProfileIdentifier({dataSource, symbol}), marketPrice); |
|
|
|
} |
|
|
|
|
|
|
|
const marketDataPromise: Promise<AdminMarketDataItem>[] = currencyPairs.map( |
|
|
@ -582,7 +583,7 @@ export class AdminService { |
|
|
|
); |
|
|
|
})?._count ?? 0; |
|
|
|
const lastMarketPrice = lastMarketPriceMap.get( |
|
|
|
`${symbol}_${dataSource}` |
|
|
|
getAssetProfileIdentifier({dataSource, symbol}) |
|
|
|
); |
|
|
|
|
|
|
|
return { |
|
|
@ -596,9 +597,9 @@ export class AdminService { |
|
|
|
countriesCount: 0, |
|
|
|
date: dateOfFirstActivity, |
|
|
|
id: undefined, |
|
|
|
lastMarketPrice, |
|
|
|
name: symbol, |
|
|
|
sectorsCount: 0, |
|
|
|
lastMarketPrice: lastMarketPrice |
|
|
|
sectorsCount: 0 |
|
|
|
}; |
|
|
|
} |
|
|
|
); |
|
|
|