@ -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,10 +541,29 @@ 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 : {
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 ) ;
}
const marketDataPromise : Promise < AdminMarketDataItem > [ ] = currencyPairs . map (
async ( { dataSource , symbol } ) = > {
let activitiesCount : EnhancedSymbolProfile [ 'activitiesCount' ] = 0 ;
let activitiesCount : EnhancedSymbolProfile [ 'activitiesCount' ] = 0 ;
let currency : EnhancedSymbolProfile [ 'currency' ] = '-' ;
let currency : EnhancedSymbolProfile [ 'currency' ] = '-' ;
let dateOfFirstActivity : EnhancedSymbolProfile [ 'dateOfFirstActivity' ] ;
let dateOfFirstActivity : EnhancedSymbolProfile [ 'dateOfFirstActivity' ] ;
@ -537,6 +581,9 @@ export class AdminService {
marketDataItem . symbol === symbol
marketDataItem . symbol === symbol
) ;
) ;
} ) ? . _count ? ? 0 ;
} ) ? . _count ? ? 0 ;
const lastMarketPrice = lastMarketPriceMap . get (
` ${ symbol } _ ${ dataSource } `
) ;
return {
return {
activitiesCount ,
activitiesCount ,
@ -550,9 +597,11 @@ export class AdminService {
date : dateOfFirstActivity ,
date : dateOfFirstActivity ,
id : undefined ,
id : undefined ,
name : symbol ,
name : symbol ,
sectorsCount : 0
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 } ;