From bb073433364608b71c3f2fee22114bc97ad5bb69 Mon Sep 17 00:00:00 2001 From: Attila Cseh Date: Wed, 16 Jul 2025 08:16:32 +0200 Subject: [PATCH] code review changes --- apps/api/src/app/export/export.module.ts | 2 ++ apps/api/src/app/export/export.service.ts | 34 ++++++++++++++++--- .../src/lib/interfaces/export.interface.ts | 4 ++- 3 files changed, 34 insertions(+), 6 deletions(-) diff --git a/apps/api/src/app/export/export.module.ts b/apps/api/src/app/export/export.module.ts index 424e83617..4f40cc417 100644 --- a/apps/api/src/app/export/export.module.ts +++ b/apps/api/src/app/export/export.module.ts @@ -2,6 +2,7 @@ import { AccountModule } from '@ghostfolio/api/app/account/account.module'; import { OrderModule } from '@ghostfolio/api/app/order/order.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'; +import { MarketDataModule } from '@ghostfolio/api/services/market-data/market-data.module'; import { TagModule } from '@ghostfolio/api/services/tag/tag.module'; import { Module } from '@nestjs/common'; @@ -14,6 +15,7 @@ import { ExportService } from './export.service'; imports: [ AccountModule, ApiModule, + MarketDataModule, OrderModule, TagModule, TransformDataSourceInRequestModule diff --git a/apps/api/src/app/export/export.service.ts b/apps/api/src/app/export/export.service.ts index 6f8c62012..004c26f39 100644 --- a/apps/api/src/app/export/export.service.ts +++ b/apps/api/src/app/export/export.service.ts @@ -1,6 +1,7 @@ import { AccountService } from '@ghostfolio/api/app/account/account.service'; import { OrderService } from '@ghostfolio/api/app/order/order.service'; import { environment } from '@ghostfolio/api/environments/environment'; +import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; import { TagService } from '@ghostfolio/api/services/tag/tag.service'; import { Filter, Export } from '@ghostfolio/common/interfaces'; @@ -12,6 +13,7 @@ import { groupBy, uniqBy } from 'lodash'; export class ExportService { public constructor( private readonly accountService: AccountService, + private readonly marketDataService: MarketDataService, private readonly orderService: OrderService, private readonly tagService: TagService ) {} @@ -108,15 +110,36 @@ export class ExportService { } ); - const assetProfiles = uniqBy( - activities.map(({ SymbolProfile }) => { - return SymbolProfile; - }), + const customAssetProfiles = uniqBy( + activities + .map(({ SymbolProfile }) => { + return SymbolProfile; + }) + .filter(({ userId: assetProfileUserId }) => { + return assetProfileUserId === userId; + }), ({ id }) => { return id; } ); + const marketDataByAssetProfile = Object.fromEntries( + await Promise.all( + customAssetProfiles.map(async ({ dataSource, id, symbol }) => { + const marketData = ( + await this.marketDataService.marketDataItems({ + where: { dataSource, symbol } + }) + ).map(({ date, marketPrice }) => ({ + date: date.toISOString(), + marketPrice + })); + + return [id, marketData] as const; + }) + ) + ); + const tags = (await this.tagService.getTagsForUser(userId)) .filter( ({ id, isUsed }) => @@ -137,7 +160,7 @@ export class ExportService { return { meta: { date: new Date().toISOString(), version: environment.version }, accounts, - assetProfiles: assetProfiles.map( + assetProfiles: customAssetProfiles.map( ({ assetClass, assetSubClass, @@ -175,6 +198,7 @@ export class ExportService { id, isActive, isin, + marketData: marketDataByAssetProfile[id], name, scraperConfiguration: scraperConfiguration as unknown as Prisma.JsonArray, diff --git a/libs/common/src/lib/interfaces/export.interface.ts b/libs/common/src/lib/interfaces/export.interface.ts index 41c66b694..2bc400b29 100644 --- a/libs/common/src/lib/interfaces/export.interface.ts +++ b/libs/common/src/lib/interfaces/export.interface.ts @@ -16,7 +16,9 @@ export interface Export { | 'updatedAt' | 'userId' > & { assetProfileId?: string; date: string; symbol: string })[]; - assetProfiles: Omit[]; + assetProfiles: (Omit & { + marketData: { date: string; marketPrice: number }[]; + })[]; meta: { date: string; version: string;