From 71b195a8df9ebf594ad5ad71b16cff15390d9a4b Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 18 Feb 2024 14:13:43 +0100 Subject: [PATCH] Handle premium data provider in getQuotes() --- apps/api/src/app/portfolio/current-rate.service.ts | 9 ++++++--- apps/api/src/app/portfolio/portfolio.service.ts | 6 ++++-- .../services/data-provider/data-provider.service.ts | 12 +++++++++++- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/apps/api/src/app/portfolio/current-rate.service.ts b/apps/api/src/app/portfolio/current-rate.service.ts index ecc00eb9d..501e2c062 100644 --- a/apps/api/src/app/portfolio/current-rate.service.ts +++ b/apps/api/src/app/portfolio/current-rate.service.ts @@ -6,8 +6,10 @@ import { ResponseError, UniqueAsset } from '@ghostfolio/common/interfaces'; +import { RequestWithUser } from '@ghostfolio/common/types'; -import { Injectable } from '@nestjs/common'; +import { Inject, Injectable } from '@nestjs/common'; +import { REQUEST } from '@nestjs/core'; import { isBefore, isToday } from 'date-fns'; import { flatten, isEmpty, uniqBy } from 'lodash'; @@ -19,7 +21,8 @@ import { GetValuesParams } from './interfaces/get-values-params.interface'; export class CurrentRateService { public constructor( private readonly dataProviderService: DataProviderService, - private readonly marketDataService: MarketDataService + private readonly marketDataService: MarketDataService, + @Inject(REQUEST) private readonly request: RequestWithUser ) {} public async getValues({ @@ -40,7 +43,7 @@ export class CurrentRateService { if (includeToday) { promises.push( this.dataProviderService - .getQuotes({ items: dataGatheringItems }) + .getQuotes({ items: dataGatheringItems, user: this.request.user }) .then((dataResultProvider) => { const result: GetValueObject[] = []; diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index 68fce7977..9c70c404b 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -420,7 +420,7 @@ export class PortfolioService { ); const [dataProviderResponses, symbolProfiles] = await Promise.all([ - this.dataProviderService.getQuotes({ items: dataGatheringItems }), + this.dataProviderService.getQuotes({ user, items: dataGatheringItems }), this.symbolProfileService.getSymbolProfiles(dataGatheringItems) ]); @@ -861,6 +861,7 @@ export class PortfolioService { }; } else { const currentData = await this.dataProviderService.getQuotes({ + user, items: [{ dataSource: DataSource.YAHOO, symbol: aSymbol }] }); const marketPrice = currentData[aSymbol]?.marketPrice; @@ -939,6 +940,7 @@ export class PortfolioService { return type === 'SEARCH_QUERY'; })?.id; const userId = await this.getUserId(impersonationId, this.request.user.id); + const user = await this.userService.user({ id: userId }); const { portfolioOrders, transactionPoints } = await this.getTransactionPoints({ @@ -979,7 +981,7 @@ export class PortfolioService { }); const [dataProviderResponses, symbolProfiles] = await Promise.all([ - this.dataProviderService.getQuotes({ items: dataGatheringItems }), + this.dataProviderService.getQuotes({ user, items: dataGatheringItems }), this.symbolProfileService.getSymbolProfiles( positions.map(({ dataSource, symbol }) => { return { dataSource, symbol }; 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 e16c40a54..127af3f0d 100644 --- a/apps/api/src/services/data-provider/data-provider.service.ts +++ b/apps/api/src/services/data-provider/data-provider.service.ts @@ -335,11 +335,13 @@ export class DataProviderService { public async getQuotes({ items, requestTimeout, - useCache = true + useCache = true, + user }: { items: UniqueAsset[]; requestTimeout?: number; useCache?: boolean; + user?: UserWithSettings; }): Promise<{ [symbol: string]: IDataProviderResponse; }> { @@ -405,6 +407,14 @@ export class DataProviderService { )) { const dataProvider = this.getDataProvider(DataSource[dataSource]); + if ( + dataProvider.getDataProviderInfo().isPremium && + this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION') && + user?.subscription.type === 'Basic' + ) { + continue; + } + const symbols = dataGatheringItems.map((dataGatheringItem) => { return dataGatheringItem.symbol; });