From 2f96b4210755821bc3bae29c1481578746c7ebb0 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 21 Jun 2026 09:18:43 +0200 Subject: [PATCH] Task/reuse asset profile identifier (part 2) (#7087) Reuse AssetProfileIdentifier --- .../endpoints/watchlist/watchlist.service.ts | 19 +++++++------------ .../app/portfolio/portfolio.service.spec.ts | 3 ++- .../src/app/portfolio/portfolio.service.ts | 9 +++------ .../events/asset-profile-changed.listener.ts | 8 ++------ .../data-provider/data-provider.service.ts | 4 +--- .../data-gathering/data-gathering.service.ts | 8 ++------ .../responses/export-response.interface.ts | 12 +++--------- libs/ui/src/lib/services/admin.service.ts | 8 ++------ libs/ui/src/lib/services/data.service.ts | 6 +----- 9 files changed, 23 insertions(+), 54 deletions(-) diff --git a/apps/api/src/app/endpoints/watchlist/watchlist.service.ts b/apps/api/src/app/endpoints/watchlist/watchlist.service.ts index 791cc6c69..78786c00b 100644 --- a/apps/api/src/app/endpoints/watchlist/watchlist.service.ts +++ b/apps/api/src/app/endpoints/watchlist/watchlist.service.ts @@ -5,10 +5,13 @@ import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { DataGatheringService } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.service'; import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; import { getAssetProfileIdentifier } from '@ghostfolio/common/helper'; -import { WatchlistResponse } from '@ghostfolio/common/interfaces'; +import { + AssetProfileIdentifier, + WatchlistResponse +} from '@ghostfolio/common/interfaces'; import { BadRequestException, Injectable } from '@nestjs/common'; -import { DataSource, Prisma } from '@prisma/client'; +import { Prisma } from '@prisma/client'; @Injectable() export class WatchlistService { @@ -25,11 +28,7 @@ export class WatchlistService { dataSource, symbol, userId - }: { - dataSource: DataSource; - symbol: string; - userId: string; - }): Promise { + }: { userId: string } & AssetProfileIdentifier): Promise { const symbolProfile = await this.prismaService.symbolProfile.findUnique({ where: { dataSource_symbol: { dataSource, symbol } @@ -73,11 +72,7 @@ export class WatchlistService { dataSource, symbol, userId - }: { - dataSource: DataSource; - symbol: string; - userId: string; - }) { + }: { userId: string } & AssetProfileIdentifier) { await this.prismaService.user.update({ data: { watchlist: { diff --git a/apps/api/src/app/portfolio/portfolio.service.spec.ts b/apps/api/src/app/portfolio/portfolio.service.spec.ts index e0e7a8255..04142c92b 100644 --- a/apps/api/src/app/portfolio/portfolio.service.spec.ts +++ b/apps/api/src/app/portfolio/portfolio.service.spec.ts @@ -11,6 +11,7 @@ import { ImpersonationService } from '@ghostfolio/api/services/impersonation/imp import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; import { UNKNOWN_KEY } from '@ghostfolio/common/config'; import { parseDate } from '@ghostfolio/common/helper'; +import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; import { Account, DataSource } from '@prisma/client'; import { Big } from 'big.js'; @@ -198,7 +199,7 @@ describe('PortfolioService', () => { portfolioService as unknown as { getCashSymbolProfiles: ( aCashDetails: CashDetails - ) => { dataSource: DataSource; symbol: string }[]; + ) => AssetProfileIdentifier[]; } ).getCashSymbolProfiles(cashDetails); diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index c15353521..d6a54b180 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -46,6 +46,7 @@ import { import { AccountsResponse, Activity, + AssetProfileIdentifier, EnhancedSymbolProfile, Filter, HistoricalDataItem, @@ -776,11 +777,9 @@ export class PortfolioService { symbol, userId }: { - dataSource: DataSource; impersonationId: string; - symbol: string; userId: string; - }): Promise { + } & AssetProfileIdentifier): Promise { userId = await this.getUserId(impersonationId, userId); const user = await this.userService.user({ id: userId }); const userCurrency = this.getUserCurrency(user); @@ -1381,12 +1380,10 @@ export class PortfolioService { tags, userId }: { - dataSource: DataSource; impersonationId: string; - symbol: string; tags: Tag[]; userId: string; - }) { + } & AssetProfileIdentifier) { userId = await this.getUserId(impersonationId, userId); await this.activitiesService.assignTags({ diff --git a/apps/api/src/events/asset-profile-changed.listener.ts b/apps/api/src/events/asset-profile-changed.listener.ts index e2aea382e..15c19ff0a 100644 --- a/apps/api/src/events/asset-profile-changed.listener.ts +++ b/apps/api/src/events/asset-profile-changed.listener.ts @@ -5,10 +5,10 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate- import { DataGatheringService } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.service'; import { DEFAULT_CURRENCY } from '@ghostfolio/common/config'; import { getAssetProfileIdentifier } from '@ghostfolio/common/helper'; +import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; import { Injectable, Logger } from '@nestjs/common'; import { OnEvent } from '@nestjs/event-emitter'; -import { DataSource } from '@prisma/client'; import ms from 'ms'; import { AssetProfileChangedEvent } from './asset-profile-changed.event'; @@ -64,11 +64,7 @@ export class AssetProfileChangedListener { currency, dataSource, symbol - }: { - currency: string; - dataSource: DataSource; - symbol: string; - }) { + }: { currency: string } & AssetProfileIdentifier) { this.logger.log(`Asset profile of ${symbol} (${dataSource}) has changed`); if ( diff --git a/apps/api/src/services/data-provider/data-provider.service.ts b/apps/api/src/services/data-provider/data-provider.service.ts index fb9efff44..6780f58f0 100644 --- a/apps/api/src/services/data-provider/data-provider.service.ts +++ b/apps/api/src/services/data-provider/data-provider.service.ts @@ -320,12 +320,10 @@ export class DataProviderService implements OnModuleInit { symbol, to }: { - dataSource: DataSource; from: Date; granularity: Granularity; - symbol: string; to: Date; - }) { + } & AssetProfileIdentifier) { return this.getDataProvider(DataSource[dataSource]).getDividends({ from, granularity, diff --git a/apps/api/src/services/queues/data-gathering/data-gathering.service.ts b/apps/api/src/services/queues/data-gathering/data-gathering.service.ts index 789dea49b..aa6c952ef 100644 --- a/apps/api/src/services/queues/data-gathering/data-gathering.service.ts +++ b/apps/api/src/services/queues/data-gathering/data-gathering.service.ts @@ -28,7 +28,7 @@ import { import { InjectQueue } from '@nestjs/bull'; import { Inject, Injectable, Logger } from '@nestjs/common'; -import { DataSource, Prisma } from '@prisma/client'; +import { Prisma } from '@prisma/client'; import { JobOptions, Queue } from 'bull'; import { format, min, subDays, subMilliseconds, subYears } from 'date-fns'; import { isEmpty } from 'lodash'; @@ -122,11 +122,7 @@ export class DataGatheringService { dataSource, date, symbol - }: { - dataSource: DataSource; - date: Date; - symbol: string; - }) { + }: { date: Date } & AssetProfileIdentifier) { try { const historicalData = await this.dataProviderService.getHistoricalRaw({ assetProfileIdentifiers: [{ dataSource, symbol }], diff --git a/libs/common/src/lib/interfaces/responses/export-response.interface.ts b/libs/common/src/lib/interfaces/responses/export-response.interface.ts index 0e8ba1574..beffad7f1 100644 --- a/libs/common/src/lib/interfaces/responses/export-response.interface.ts +++ b/libs/common/src/lib/interfaces/responses/export-response.interface.ts @@ -1,13 +1,7 @@ -import { - Account, - DataSource, - Order, - Platform, - SymbolProfile, - Tag -} from '@prisma/client'; +import { Account, Order, Platform, SymbolProfile, Tag } from '@prisma/client'; import { AccountBalance } from '../account-balance.interface'; +import { AssetProfileIdentifier } from '../asset-profile-identifier.interface'; import { MarketData } from '../market-data.interface'; import { UserSettings } from '../user-settings.interface'; @@ -24,7 +18,7 @@ export interface ExportResponse { | 'symbolProfileId' | 'updatedAt' | 'userId' - > & { dataSource: DataSource; date: string; symbol: string })[]; + > & { date: string } & AssetProfileIdentifier)[]; assetProfiles: (Omit< SymbolProfile, | 'createdAt' diff --git a/libs/ui/src/lib/services/admin.service.ts b/libs/ui/src/lib/services/admin.service.ts index 90e477f28..acfd15ef5 100644 --- a/libs/ui/src/lib/services/admin.service.ts +++ b/libs/ui/src/lib/services/admin.service.ts @@ -23,7 +23,7 @@ import { GF_ENVIRONMENT } from '@ghostfolio/ui/environment'; import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; import { Injectable, inject } from '@angular/core'; -import { DataSource, MarketData, Platform } from '@prisma/client'; +import { MarketData, Platform } from '@prisma/client'; import { JobStatus } from 'bull'; import { isNumber } from 'lodash'; @@ -171,11 +171,7 @@ export class AdminService { dataSource, dateString, symbol - }: { - dataSource: DataSource; - dateString: string; - symbol: string; - }) { + }: { dateString: string } & AssetProfileIdentifier) { const url = `/api/v1/symbol/${dataSource}/${symbol}/${dateString}`; return this.http.get(url); diff --git a/libs/ui/src/lib/services/data.service.ts b/libs/ui/src/lib/services/data.service.ts index 2e0e212bc..8d16c6d35 100644 --- a/libs/ui/src/lib/services/data.service.ts +++ b/libs/ui/src/lib/services/data.service.ts @@ -850,11 +850,7 @@ export class DataService { dataSource, marketData, symbol - }: { - dataSource: DataSource; - marketData: UpdateBulkMarketDataDto; - symbol: string; - }) { + }: { marketData: UpdateBulkMarketDataDto } & AssetProfileIdentifier) { const url = `/api/v1/market-data/${dataSource}/${symbol}`; return this.http.post(url, marketData);