diff --git a/apps/api/src/app/admin/admin.module.ts b/apps/api/src/app/admin/admin.module.ts index d39fd5126..de9aecf3b 100644 --- a/apps/api/src/app/admin/admin.module.ts +++ b/apps/api/src/app/admin/admin.module.ts @@ -1,3 +1,4 @@ +import { OrderModule } from '@ghostfolio/api/app/order/order.module'; import { SubscriptionModule } from '@ghostfolio/api/app/subscription/subscription.module'; import { TransformDataSourceInRequestModule } from '@ghostfolio/api/interceptors/transform-data-source-in-request/transform-data-source-in-request.module'; import { ApiModule } from '@ghostfolio/api/services/api/api.module'; @@ -12,7 +13,6 @@ 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'; diff --git a/apps/api/src/app/admin/admin.service.ts b/apps/api/src/app/admin/admin.service.ts index 538f6e6b4..21f0253ee 100644 --- a/apps/api/src/app/admin/admin.service.ts +++ b/apps/api/src/app/admin/admin.service.ts @@ -1,3 +1,4 @@ +import { OrderService } from '@ghostfolio/api/app/order/order.service'; import { SubscriptionService } from '@ghostfolio/api/app/subscription/subscription.service'; import { environment } from '@ghostfolio/api/environments/environment'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; @@ -13,7 +14,7 @@ import { PROPERTY_IS_READ_ONLY_MODE, PROPERTY_IS_USER_SIGNUP_ENABLED } from '@ghostfolio/common/config'; -import { isCurrency } from '@ghostfolio/common/helper'; +import { isCurrency, getCurrencyFromSymbol } from '@ghostfolio/common/helper'; import { AdminData, AdminMarketData, @@ -37,8 +38,6 @@ import { import { differenceInDays } from 'date-fns'; import { groupBy } from 'lodash'; -import { OrderService } from '../order/order.service'; - @Injectable() export class AdminService { public constructor( @@ -301,11 +300,11 @@ export class AdminService { symbol }: UniqueAsset): Promise { let activitiesCount: EnhancedSymbolProfile['activitiesCount'] = 0; - let dateOfFirstActivity: EnhancedSymbolProfile['dateOfFirstActivity']; let currency: EnhancedSymbolProfile['currency'] = '-'; + let dateOfFirstActivity: EnhancedSymbolProfile['dateOfFirstActivity']; - if (isCurrency(symbol.replace(DEFAULT_CURRENCY, ''))) { - currency = symbol.replace(DEFAULT_CURRENCY, ''); + if (isCurrency(getCurrencyFromSymbol(symbol))) { + currency = getCurrencyFromSymbol(symbol); ({ activitiesCount, dateOfFirstActivity } = await this.orderService.getStatisticsByCurrency(currency)); } @@ -340,8 +339,8 @@ export class AdminService { activitiesCount, currency, dataSource, - symbol, - dateOfFirstActivity + dateOfFirstActivity, + symbol } }; } @@ -432,11 +431,11 @@ export class AdminService { .getCurrencyPairs() .map(async ({ dataSource, symbol }) => { let activitiesCount: EnhancedSymbolProfile['activitiesCount'] = 0; - let dateOfFirstActivity: EnhancedSymbolProfile['dateOfFirstActivity']; let currency: EnhancedSymbolProfile['currency'] = '-'; + let dateOfFirstActivity: EnhancedSymbolProfile['dateOfFirstActivity']; - if (isCurrency(symbol.replace(DEFAULT_CURRENCY, ''))) { - currency = symbol.replace(DEFAULT_CURRENCY, ''); + if (isCurrency(getCurrencyFromSymbol(symbol))) { + currency = getCurrencyFromSymbol(symbol); ({ activitiesCount, dateOfFirstActivity } = await this.orderService.getStatisticsByCurrency(currency)); } diff --git a/apps/api/src/app/order/order.service.ts b/apps/api/src/app/order/order.service.ts index c1e3934ac..7a4dd5a4a 100644 --- a/apps/api/src/app/order/order.service.ts +++ b/apps/api/src/app/order/order.service.ts @@ -433,6 +433,26 @@ export class OrderService { return { activities, count }; } + public async getStatisticsByCurrency( + currency: EnhancedSymbolProfile['currency'] + ): Promise<{ + activitiesCount: EnhancedSymbolProfile['activitiesCount']; + dateOfFirstActivity: EnhancedSymbolProfile['dateOfFirstActivity']; + }> { + const { _count, _min } = await this.prismaService.order.aggregate({ + _count: true, + _min: { + date: true + }, + where: { SymbolProfile: { currency } } + }); + + return { + activitiesCount: _count as number, + dateOfFirstActivity: _min.date + }; + } + public async order( orderWhereUniqueInput: Prisma.OrderWhereUniqueInput ): Promise { @@ -545,21 +565,4 @@ export class OrderService { where }); } - - public async getStatisticsByCurrency( - currency: EnhancedSymbolProfile['currency'] - ): Promise<{ activitiesCount: number; dateOfFirstActivity: 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 }; - } } diff --git a/libs/common/src/lib/helper.ts b/libs/common/src/lib/helper.ts index e03ea1a1f..f01fec772 100644 --- a/libs/common/src/lib/helper.ts +++ b/libs/common/src/lib/helper.ts @@ -13,7 +13,12 @@ import { } from 'date-fns'; import { de, es, fr, it, nl, pl, pt, tr, zhCN } from 'date-fns/locale'; -import { ghostfolioScraperApiSymbolPrefix, locale } from './config'; +import { + DEFAULT_CURRENCY, + DERIVED_CURRENCIES, + ghostfolioScraperApiSymbolPrefix, + locale +} from './config'; import { Benchmark, UniqueAsset } from './interfaces'; import { BenchmarkTrend, ColorScheme } from './types'; @@ -161,6 +166,10 @@ export function getCssVariable(aCssVariable: string) { ); } +export function getCurrencyFromSymbol(aSymbol = '') { + return aSymbol.replace(DEFAULT_CURRENCY, ''); +} + export function getDateFnsLocale(aLanguageCode: string) { if (aLanguageCode === 'de') { return de; @@ -322,8 +331,18 @@ export function interpolate(template: string, context: any) { }); } -export function isCurrency(aSymbol = '') { - return currencies[aSymbol]; +export function isCurrency(aCurrency = '') { + return currencies[aCurrency] || isDerivedCurrency(aCurrency); +} + +export function isDerivedCurrency(aCurrency: string) { + if (aCurrency === 'USX') { + return true; + } + + return DERIVED_CURRENCIES.find(({ currency }) => { + return currency === aCurrency; + }); } export function parseDate(date: string): Date | null {