|
@ -1,3 +1,4 @@ |
|
|
|
|
|
import { OrderService } from '@ghostfolio/api/app/order/order.service'; |
|
|
import { SubscriptionService } from '@ghostfolio/api/app/subscription/subscription.service'; |
|
|
import { SubscriptionService } from '@ghostfolio/api/app/subscription/subscription.service'; |
|
|
import { environment } from '@ghostfolio/api/environments/environment'; |
|
|
import { environment } from '@ghostfolio/api/environments/environment'; |
|
|
import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; |
|
|
import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; |
|
@ -13,11 +14,13 @@ import { |
|
|
PROPERTY_IS_READ_ONLY_MODE, |
|
|
PROPERTY_IS_READ_ONLY_MODE, |
|
|
PROPERTY_IS_USER_SIGNUP_ENABLED |
|
|
PROPERTY_IS_USER_SIGNUP_ENABLED |
|
|
} from '@ghostfolio/common/config'; |
|
|
} from '@ghostfolio/common/config'; |
|
|
|
|
|
import { isCurrency, getCurrencyFromSymbol } from '@ghostfolio/common/helper'; |
|
|
import { |
|
|
import { |
|
|
AdminData, |
|
|
AdminData, |
|
|
AdminMarketData, |
|
|
AdminMarketData, |
|
|
AdminMarketDataDetails, |
|
|
AdminMarketDataDetails, |
|
|
AdminMarketDataItem, |
|
|
AdminMarketDataItem, |
|
|
|
|
|
EnhancedSymbolProfile, |
|
|
Filter, |
|
|
Filter, |
|
|
UniqueAsset |
|
|
UniqueAsset |
|
|
} from '@ghostfolio/common/interfaces'; |
|
|
} from '@ghostfolio/common/interfaces'; |
|
@ -42,6 +45,7 @@ export class AdminService { |
|
|
private readonly dataProviderService: DataProviderService, |
|
|
private readonly dataProviderService: DataProviderService, |
|
|
private readonly exchangeRateDataService: ExchangeRateDataService, |
|
|
private readonly exchangeRateDataService: ExchangeRateDataService, |
|
|
private readonly marketDataService: MarketDataService, |
|
|
private readonly marketDataService: MarketDataService, |
|
|
|
|
|
private readonly orderService: OrderService, |
|
|
private readonly prismaService: PrismaService, |
|
|
private readonly prismaService: PrismaService, |
|
|
private readonly propertyService: PropertyService, |
|
|
private readonly propertyService: PropertyService, |
|
|
private readonly subscriptionService: SubscriptionService, |
|
|
private readonly subscriptionService: SubscriptionService, |
|
@ -295,6 +299,16 @@ export class AdminService { |
|
|
dataSource, |
|
|
dataSource, |
|
|
symbol |
|
|
symbol |
|
|
}: UniqueAsset): Promise<AdminMarketDataDetails> { |
|
|
}: UniqueAsset): Promise<AdminMarketDataDetails> { |
|
|
|
|
|
let activitiesCount: EnhancedSymbolProfile['activitiesCount'] = 0; |
|
|
|
|
|
let currency: EnhancedSymbolProfile['currency'] = '-'; |
|
|
|
|
|
let dateOfFirstActivity: EnhancedSymbolProfile['dateOfFirstActivity']; |
|
|
|
|
|
|
|
|
|
|
|
if (isCurrency(getCurrencyFromSymbol(symbol))) { |
|
|
|
|
|
currency = getCurrencyFromSymbol(symbol); |
|
|
|
|
|
({ activitiesCount, dateOfFirstActivity } = |
|
|
|
|
|
await this.orderService.getStatisticsByCurrency(currency)); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
const [[assetProfile], marketData] = await Promise.all([ |
|
|
const [[assetProfile], marketData] = await Promise.all([ |
|
|
this.symbolProfileService.getSymbolProfiles([ |
|
|
this.symbolProfileService.getSymbolProfiles([ |
|
|
{ |
|
|
{ |
|
@ -322,8 +336,11 @@ export class AdminService { |
|
|
return { |
|
|
return { |
|
|
marketData, |
|
|
marketData, |
|
|
assetProfile: assetProfile ?? { |
|
|
assetProfile: assetProfile ?? { |
|
|
symbol, |
|
|
activitiesCount, |
|
|
currency: '-' |
|
|
currency, |
|
|
|
|
|
dataSource, |
|
|
|
|
|
dateOfFirstActivity, |
|
|
|
|
|
symbol |
|
|
} |
|
|
} |
|
|
}; |
|
|
}; |
|
|
} |
|
|
} |
|
@ -413,19 +430,15 @@ export class AdminService { |
|
|
this.exchangeRateDataService |
|
|
this.exchangeRateDataService |
|
|
.getCurrencyPairs() |
|
|
.getCurrencyPairs() |
|
|
.map(async ({ dataSource, symbol }) => { |
|
|
.map(async ({ dataSource, symbol }) => { |
|
|
const currency = symbol.replace(DEFAULT_CURRENCY, ''); |
|
|
let activitiesCount: EnhancedSymbolProfile['activitiesCount'] = 0; |
|
|
|
|
|
let currency: EnhancedSymbolProfile['currency'] = '-'; |
|
|
|
|
|
let dateOfFirstActivity: EnhancedSymbolProfile['dateOfFirstActivity']; |
|
|
|
|
|
|
|
|
const { _count, _min } = await this.prismaService.order.aggregate({ |
|
|
if (isCurrency(getCurrencyFromSymbol(symbol))) { |
|
|
_count: true, |
|
|
currency = getCurrencyFromSymbol(symbol); |
|
|
_min: { |
|
|
({ activitiesCount, dateOfFirstActivity } = |
|
|
date: true |
|
|
await this.orderService.getStatisticsByCurrency(currency)); |
|
|
}, |
|
|
|
|
|
where: { |
|
|
|
|
|
SymbolProfile: { |
|
|
|
|
|
currency |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
} |
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
const marketDataItemCount = |
|
|
const marketDataItemCount = |
|
|
marketDataItems.find((marketDataItem) => { |
|
|
marketDataItems.find((marketDataItem) => { |
|
@ -436,15 +449,15 @@ export class AdminService { |
|
|
})?._count ?? 0; |
|
|
})?._count ?? 0; |
|
|
|
|
|
|
|
|
return { |
|
|
return { |
|
|
|
|
|
activitiesCount, |
|
|
currency, |
|
|
currency, |
|
|
dataSource, |
|
|
dataSource, |
|
|
marketDataItemCount, |
|
|
marketDataItemCount, |
|
|
symbol, |
|
|
symbol, |
|
|
activitiesCount: _count as number, |
|
|
|
|
|
assetClass: AssetClass.LIQUIDITY, |
|
|
assetClass: AssetClass.LIQUIDITY, |
|
|
assetSubClass: AssetSubClass.CASH, |
|
|
assetSubClass: AssetSubClass.CASH, |
|
|
countriesCount: 0, |
|
|
countriesCount: 0, |
|
|
date: _min.date, |
|
|
date: dateOfFirstActivity, |
|
|
id: undefined, |
|
|
id: undefined, |
|
|
name: symbol, |
|
|
name: symbol, |
|
|
sectorsCount: 0 |
|
|
sectorsCount: 0 |
|
|