diff --git a/apps/api/src/services/data-provider.service.ts b/apps/api/src/services/data-provider.service.ts index c38cb5925..c7380dd5f 100644 --- a/apps/api/src/services/data-provider.service.ts +++ b/apps/api/src/services/data-provider.service.ts @@ -133,56 +133,15 @@ export class DataProviderService implements DataProviderInterface { } = {}; for (const { dataSource, symbol } of aDataGatheringItems) { - switch (dataSource) { - case DataSource.ALPHA_VANTAGE: { - if (this.configurationService.get('ALPHA_VANTAGE_API_KEY')) { - const data = await this.alphaVantageService.getHistorical( - [symbol], - undefined, - from, - to - ); - result[symbol] = data?.[symbol]; - } - break; - } - case DataSource.GHOSTFOLIO: { - if (isGhostfolioScraperApiSymbol(symbol)) { - const data = await this.ghostfolioScraperApiService.getHistorical( - [symbol], - undefined, - from, - to - ); - result[symbol] = data?.[symbol]; - } - break; - } - case DataSource.RAKUTEN: { - if ( - isRakutenRapidApiSymbol(symbol) && - this.configurationService.get('RAKUTEN_RAPID_API_KEY') - ) { - const data = await this.rakutenRapidApiService.getHistorical( - [symbol], - undefined, - from, - to - ); - result[symbol] = data?.[symbol]; - } - break; - } - case DataSource.YAHOO: { - const data = await this.yahooFinanceService.getHistorical( - [symbol], - undefined, - from, - to - ); - result[symbol] = data?.[symbol]; - break; - } + const dataProvider = this.getDataProvider(dataSource); + if (dataProvider.hasHistoricalData(symbol)) { + const data = await dataProvider.getHistorical( + [symbol], + undefined, + from, + to + ); + result[symbol] = data?.[symbol]; } } @@ -190,15 +149,21 @@ export class DataProviderService implements DataProviderInterface { } public async search(aSymbol: string) { - return this.getDataProvider().search(aSymbol); + return this.getDataProvider( + this.configurationService.get('DATA_SOURCES')[0] + ).search(aSymbol); } - private getDataProvider() { - switch (this.configurationService.get('DATA_SOURCES')[0]) { + private getDataProvider(providerName: DataSource) { + switch (providerName) { case DataSource.ALPHA_VANTAGE: return this.alphaVantageService; case DataSource.YAHOO: return this.yahooFinanceService; + case DataSource.RAKUTEN: + return this.rakutenRapidApiService; + case DataSource.GHOSTFOLIO: + return this.ghostfolioScraperApiService; default: throw new Error('No data provider has been found.'); } diff --git a/apps/api/src/services/data-provider/alpha-vantage/alpha-vantage.service.ts b/apps/api/src/services/data-provider/alpha-vantage/alpha-vantage.service.ts index 3046737e5..9f58cb384 100644 --- a/apps/api/src/services/data-provider/alpha-vantage/alpha-vantage.service.ts +++ b/apps/api/src/services/data-provider/alpha-vantage/alpha-vantage.service.ts @@ -24,6 +24,10 @@ export class AlphaVantageService implements DataProviderInterface { }); } + public hasHistoricalData(symbol: string) { + return this.configurationService.get('ALPHA_VANTAGE_API_KEY'); + } + public async get( aSymbols: string[] ): Promise<{ [symbol: string]: IDataProviderResponse }> { diff --git a/apps/api/src/services/data-provider/ghostfolio-scraper-api/ghostfolio-scraper-api.service.ts b/apps/api/src/services/data-provider/ghostfolio-scraper-api/ghostfolio-scraper-api.service.ts index b6423f4a2..d2dd4cdec 100644 --- a/apps/api/src/services/data-provider/ghostfolio-scraper-api/ghostfolio-scraper-api.service.ts +++ b/apps/api/src/services/data-provider/ghostfolio-scraper-api/ghostfolio-scraper-api.service.ts @@ -1,4 +1,7 @@ -import { getYesterday } from '@ghostfolio/common/helper'; +import { + getYesterday, + isGhostfolioScraperApiSymbol +} from '@ghostfolio/common/helper'; import { Granularity } from '@ghostfolio/common/types'; import { Injectable } from '@nestjs/common'; import { DataSource } from '@prisma/client'; @@ -21,6 +24,10 @@ export class GhostfolioScraperApiService implements DataProviderInterface { public constructor(private prisma: PrismaService) {} + public hasHistoricalData(symbol: string) { + return isGhostfolioScraperApiSymbol(symbol); + } + public async get( aSymbols: string[] ): Promise<{ [symbol: string]: IDataProviderResponse }> { diff --git a/apps/api/src/services/data-provider/rakuten-rapid-api/rakuten-rapid-api.service.ts b/apps/api/src/services/data-provider/rakuten-rapid-api/rakuten-rapid-api.service.ts index 9f3943a8e..97088125a 100644 --- a/apps/api/src/services/data-provider/rakuten-rapid-api/rakuten-rapid-api.service.ts +++ b/apps/api/src/services/data-provider/rakuten-rapid-api/rakuten-rapid-api.service.ts @@ -1,4 +1,8 @@ -import { getToday, getYesterday } from '@ghostfolio/common/helper'; +import { + getToday, + getYesterday, + isRakutenRapidApiSymbol +} from '@ghostfolio/common/helper'; import { Granularity } from '@ghostfolio/common/types'; import { Injectable } from '@nestjs/common'; import { DataSource } from '@prisma/client'; @@ -54,6 +58,13 @@ export class RakutenRapidApiService implements DataProviderInterface { return {}; } + public hasHistoricalData(symbol: string) { + return ( + isRakutenRapidApiSymbol(symbol) && + this.configurationService.get('RAKUTEN_RAPID_API_KEY') + ); + } + public async getHistorical( aSymbols: string[], aGranularity: Granularity = 'day', diff --git a/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts b/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts index 19a969cbd..7716fe6e6 100644 --- a/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts +++ b/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts @@ -90,6 +90,10 @@ export class YahooFinanceService implements DataProviderInterface { } } + public hasHistoricalData(symbol: string) { + return true; + } + public async getHistorical( aSymbols: string[], aGranularity: Granularity = 'day', diff --git a/apps/api/src/services/interfaces/data-provider.interface.ts b/apps/api/src/services/interfaces/data-provider.interface.ts index cf861ad7b..eae07d557 100644 --- a/apps/api/src/services/interfaces/data-provider.interface.ts +++ b/apps/api/src/services/interfaces/data-provider.interface.ts @@ -7,6 +7,8 @@ import { } from './interfaces'; export interface DataProviderInterface { + hasHistoricalData(symbol: string): boolean; + get(aSymbols: string[]): Promise<{ [symbol: string]: IDataProviderResponse }>; getHistorical(