Browse Source

#3739 Extending market data endpoint with field 'lastMarketPrice':

- adding field to interface
- adjusting getMarketData and getMarketDataForCurrencies methods in admin service to fetch lastMarketPrice data from the db
pull/3752/head
Verbindolai 12 months ago
parent
commit
4920be5797
  1. 121
      apps/api/src/app/admin/admin.service.ts
  2. 1
      libs/common/src/lib/interfaces/admin-market-data.interface.ts

121
apps/api/src/app/admin/admin.service.ts

@ -261,6 +261,26 @@ export class AdminService {
this.prismaService.symbolProfile.count({ where }) this.prismaService.symbolProfile.count({ where })
]); ]);
const lastMarketPrices = await this.prismaService.marketData.findMany({
select: {
symbol: true,
dataSource: true,
marketPrice: true
},
where: {
symbol: { in: assetProfiles.map(({ symbol }) => symbol) },
dataSource: { in: assetProfiles.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);
}
let marketData: AdminMarketDataItem[] = await Promise.all( let marketData: AdminMarketDataItem[] = await Promise.all(
assetProfiles.map( assetProfiles.map(
async ({ async ({
@ -289,6 +309,9 @@ export class AdminService {
); );
})?._count ?? 0; })?._count ?? 0;
const sectorsCount = sectors ? Object.keys(sectors).length : 0; const sectorsCount = sectors ? Object.keys(sectors).length : 0;
const lastMarketPrice = lastMarketPriceMap.get(
`${symbol}_${dataSource}`
);
return { return {
assetClass, assetClass,
@ -304,7 +327,9 @@ export class AdminService {
sectorsCount, sectorsCount,
activitiesCount: _count.Order, activitiesCount: _count.Order,
date: Order?.[0]?.date, date: Order?.[0]?.date,
isUsedByUsersWithSubscription: await isUsedByUsersWithSubscription isUsedByUsersWithSubscription:
await isUsedByUsersWithSubscription,
lastMarketPrice: lastMarketPrice
}; };
} }
) )
@ -516,43 +541,67 @@ export class AdminService {
by: ['dataSource', 'symbol'] by: ['dataSource', 'symbol']
}); });
const marketDataPromise: Promise<AdminMarketDataItem>[] = const currencyPairs = this.exchangeRateDataService.getCurrencyPairs();
this.exchangeRateDataService // Fetch the last market prices for all currency pairs in one query
.getCurrencyPairs() const lastMarketPrices = await this.prismaService.marketData.findMany({
.map(async ({ dataSource, symbol }) => { select: {
let activitiesCount: EnhancedSymbolProfile['activitiesCount'] = 0; symbol: true,
let currency: EnhancedSymbolProfile['currency'] = '-'; dataSource: true,
let dateOfFirstActivity: EnhancedSymbolProfile['dateOfFirstActivity']; marketPrice: true
},
if (isCurrency(getCurrencyFromSymbol(symbol))) { where: {
currency = getCurrencyFromSymbol(symbol); symbol: { in: currencyPairs.map(({ symbol }) => symbol) },
({ activitiesCount, dateOfFirstActivity } = dataSource: { in: currencyPairs.map(({ dataSource }) => dataSource) }
await this.orderService.getStatisticsByCurrency(currency)); },
} orderBy: { date: 'desc' },
distinct: ['symbol', 'dataSource']
});
const lastMarketPriceMap = new Map<string, number>();
for (const { symbol, dataSource, marketPrice } of lastMarketPrices) {
lastMarketPriceMap.set(`${symbol}_${dataSource}`, marketPrice);
}
const marketDataItemCount = const marketDataPromise: Promise<AdminMarketDataItem>[] = currencyPairs.map(
marketDataItems.find((marketDataItem) => { async ({ dataSource, symbol }) => {
return ( let activitiesCount: EnhancedSymbolProfile['activitiesCount'] = 0;
marketDataItem.dataSource === dataSource && let currency: EnhancedSymbolProfile['currency'] = '-';
marketDataItem.symbol === symbol let dateOfFirstActivity: EnhancedSymbolProfile['dateOfFirstActivity'];
);
})?._count ?? 0;
return { if (isCurrency(getCurrencyFromSymbol(symbol))) {
activitiesCount, currency = getCurrencyFromSymbol(symbol);
currency, ({ activitiesCount, dateOfFirstActivity } =
dataSource, await this.orderService.getStatisticsByCurrency(currency));
marketDataItemCount, }
symbol,
assetClass: AssetClass.LIQUIDITY, const marketDataItemCount =
assetSubClass: AssetSubClass.CASH, marketDataItems.find((marketDataItem) => {
countriesCount: 0, return (
date: dateOfFirstActivity, marketDataItem.dataSource === dataSource &&
id: undefined, marketDataItem.symbol === symbol
name: symbol, );
sectorsCount: 0 })?._count ?? 0;
}; const lastMarketPrice = lastMarketPriceMap.get(
}); `${symbol}_${dataSource}`
);
return {
activitiesCount,
currency,
dataSource,
marketDataItemCount,
symbol,
assetClass: AssetClass.LIQUIDITY,
assetSubClass: AssetSubClass.CASH,
countriesCount: 0,
date: dateOfFirstActivity,
id: undefined,
name: symbol,
sectorsCount: 0,
lastMarketPrice: lastMarketPrice
};
}
);
const marketData = await Promise.all(marketDataPromise); const marketData = await Promise.all(marketDataPromise);
return { marketData, count: marketData.length }; return { marketData, count: marketData.length };

1
libs/common/src/lib/interfaces/admin-market-data.interface.ts

@ -16,6 +16,7 @@ export interface AdminMarketDataItem {
id: string; id: string;
isBenchmark?: boolean; isBenchmark?: boolean;
isUsedByUsersWithSubscription?: boolean; isUsedByUsersWithSubscription?: boolean;
lastMarketPrice: number;
marketDataItemCount: number; marketDataItemCount: number;
name: string; name: string;
sectorsCount: number; sectorsCount: number;

Loading…
Cancel
Save