diff --git a/apps/api/src/app/admin/admin.module.ts b/apps/api/src/app/admin/admin.module.ts index 82d03395b..d39fd5126 100644 --- a/apps/api/src/app/admin/admin.module.ts +++ b/apps/api/src/app/admin/admin.module.ts @@ -12,6 +12,7 @@ import { SymbolProfileModule } from '@ghostfolio/api/services/symbol-profile/sym import { Module } from '@nestjs/common'; +import { OrderModule } from '../order/order.module'; import { AdminController } from './admin.controller'; import { AdminService } from './admin.service'; import { QueueModule } from './queue/queue.module'; @@ -24,6 +25,7 @@ import { QueueModule } from './queue/queue.module'; DataProviderModule, ExchangeRateDataModule, MarketDataModule, + OrderModule, PrismaModule, PropertyModule, QueueModule, diff --git a/apps/api/src/app/admin/admin.service.ts b/apps/api/src/app/admin/admin.service.ts index 6dfedc32a..dc396bbd4 100644 --- a/apps/api/src/app/admin/admin.service.ts +++ b/apps/api/src/app/admin/admin.service.ts @@ -34,10 +34,11 @@ import { Property, SymbolProfile } from '@prisma/client'; -import { isNumber } from 'class-validator'; import { differenceInDays } from 'date-fns'; import { groupBy } from 'lodash'; +import { OrderService } from '../order/order.service'; + @Injectable() export class AdminService { public constructor( @@ -45,6 +46,7 @@ export class AdminService { private readonly dataProviderService: DataProviderService, private readonly exchangeRateDataService: ExchangeRateDataService, private readonly marketDataService: MarketDataService, + private readonly orderService: OrderService, private readonly prismaService: PrismaService, private readonly propertyService: PropertyService, private readonly subscriptionService: SubscriptionService, @@ -304,19 +306,8 @@ export class AdminService { if (isCurrency(symbol.replace(DEFAULT_CURRENCY, ''))) { currency = symbol.replace(DEFAULT_CURRENCY, ''); - const { _count, _min } = await this.prismaService.order.aggregate({ - _count: true, - _min: { - date: true - }, - where: { - SymbolProfile: { - currency - } - } - }); - activitiesCount = _count as number; - dateOfFirstActivity = _min.date; + [activitiesCount, dateOfFirstActivity] = + await this.orderService.getCountAndDateMin(currency); } const [[assetProfile], marketData] = await Promise.all([ @@ -346,14 +337,15 @@ export class AdminService { return { marketData, assetProfile: assetProfile ?? { + activitiesCount, + dateOfFirstActivity, currency, dataSource, - symbol, - activitiesCount, - dateOfFirstActivity + symbol } }; } + public async patchAssetProfileData({ assetClass, assetSubClass, @@ -439,19 +431,15 @@ export class AdminService { this.exchangeRateDataService .getCurrencyPairs() .map(async ({ dataSource, symbol }) => { - const currency = symbol.replace(DEFAULT_CURRENCY, ''); - - const { _count, _min } = await this.prismaService.order.aggregate({ - _count: true, - _min: { - date: true - }, - where: { - SymbolProfile: { - currency - } - } - }); + let activitiesCount: EnhancedSymbolProfile['activitiesCount'] = 0; + let dateOfFirstActivity: EnhancedSymbolProfile['dateOfFirstActivity']; + let currency: EnhancedSymbolProfile['currency'] = '-'; + + if (isCurrency(symbol.replace(DEFAULT_CURRENCY, ''))) { + currency = symbol.replace(DEFAULT_CURRENCY, ''); + [activitiesCount, dateOfFirstActivity] = + await this.orderService.getCountAndDateMin(currency); + } const marketDataItemCount = marketDataItems.find((marketDataItem) => { @@ -466,11 +454,11 @@ export class AdminService { dataSource, marketDataItemCount, symbol, - activitiesCount: _count as number, + activitiesCount, assetClass: AssetClass.LIQUIDITY, assetSubClass: AssetSubClass.CASH, countriesCount: 0, - date: _min.date, + date: dateOfFirstActivity, id: undefined, name: symbol, sectorsCount: 0 diff --git a/apps/api/src/app/order/order.service.ts b/apps/api/src/app/order/order.service.ts index 4174a9f8d..21247e105 100644 --- a/apps/api/src/app/order/order.service.ts +++ b/apps/api/src/app/order/order.service.ts @@ -10,7 +10,11 @@ import { GATHER_ASSET_PROFILE_PROCESS_OPTIONS } from '@ghostfolio/common/config'; import { getAssetProfileIdentifier } from '@ghostfolio/common/helper'; -import { Filter, UniqueAsset } from '@ghostfolio/common/interfaces'; +import { + EnhancedSymbolProfile, + Filter, + UniqueAsset +} from '@ghostfolio/common/interfaces'; import { OrderWithAccount } from '@ghostfolio/common/types'; import { Injectable } from '@nestjs/common'; @@ -541,4 +545,21 @@ export class OrderService { where }); } + + public async getCountAndDateMin( + currency: EnhancedSymbolProfile['currency'] + ): Promise<[number, Date]> { + const { _count, _min } = await this.prismaService.order.aggregate({ + _count: true, + _min: { + date: true + }, + where: { SymbolProfile: { currency } } + }); + const activitiesCount: EnhancedSymbolProfile['activitiesCount'] = + _count as number; + const dateOfFirstActivity: EnhancedSymbolProfile['dateOfFirstActivity'] = + _min.date; + return [activitiesCount, dateOfFirstActivity]; + } }