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 454a99652..53b882fda 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 @@ -1,12 +1,17 @@ import { LookupItem } from '@ghostfolio/api/app/symbol/interfaces/lookup-item.interface'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; -import { DataProviderInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; +import { + DataProviderInterface, + GetDividendsParams, + GetHistoricalParams, + GetQuotesParams, + GetSearchParams +} from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; import { IDataProviderHistoricalResponse, IDataProviderResponse } from '@ghostfolio/api/services/interfaces/interfaces'; import { DATE_FORMAT } from '@ghostfolio/common/helper'; -import { Granularity } from '@ghostfolio/common/types'; import { Injectable } from '@nestjs/common'; import { DataSource, SymbolProfile } from '@prisma/client'; import * as Alphavantage from 'alphavantage'; @@ -39,31 +44,17 @@ export class AlphaVantageService implements DataProviderInterface { }; } - public async getDividends({ - from, - granularity = 'day', - symbol, - to - }: { - from: Date; - granularity: Granularity; - symbol: string; - to: Date; - }) { + public async getDividends({}: GetDividendsParams) { return {}; } - public async getHistorical( - aSymbol: string, - aGranularity: Granularity = 'day', - from: Date, - to: Date, - requestTimeout = this.configurationService.get('REQUEST_TIMEOUT') - ): Promise<{ + public async getHistorical({ + from, + symbol, + to + }: GetHistoricalParams): Promise<{ [symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; }> { - const symbol = aSymbol; - try { const historicalData: { [symbol: string]: IAlphaVantageHistoricalResponse[]; @@ -94,7 +85,7 @@ export class AlphaVantageService implements DataProviderInterface { return response; } catch (error) { throw new Error( - `Could not get historical market data for ${aSymbol} (${this.getName()}) from ${format( + `Could not get historical market data for ${symbol} (${this.getName()}) from ${format( from, DATE_FORMAT )} to ${format(to, DATE_FORMAT)}: [${error.name}] ${error.message}` @@ -106,13 +97,9 @@ export class AlphaVantageService implements DataProviderInterface { return DataSource.ALPHA_VANTAGE; } - public async getQuotes({ - requestTimeout = this.configurationService.get('REQUEST_TIMEOUT'), - symbols - }: { - requestTimeout?: number; - symbols: string[]; - }): Promise<{ [symbol: string]: IDataProviderResponse }> { + public async getQuotes({}: GetQuotesParams): Promise<{ + [symbol: string]: IDataProviderResponse; + }> { return {}; } @@ -121,12 +108,8 @@ export class AlphaVantageService implements DataProviderInterface { } public async search({ - includeIndices = false, query - }: { - includeIndices?: boolean; - query: string; - }): Promise<{ items: LookupItem[] }> { + }: GetSearchParams): Promise<{ items: LookupItem[] }> { const result = await this.alphaVantage.data.search(query); return { diff --git a/apps/api/src/services/data-provider/coingecko/coingecko.service.ts b/apps/api/src/services/data-provider/coingecko/coingecko.service.ts index d132cd15e..bf69dbdc7 100644 --- a/apps/api/src/services/data-provider/coingecko/coingecko.service.ts +++ b/apps/api/src/services/data-provider/coingecko/coingecko.service.ts @@ -1,6 +1,12 @@ import { LookupItem } from '@ghostfolio/api/app/symbol/interfaces/lookup-item.interface'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; -import { DataProviderInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; +import { + DataProviderInterface, + GetDividendsParams, + GetHistoricalParams, + GetQuotesParams, + GetSearchParams +} from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; import { IDataProviderHistoricalResponse, IDataProviderResponse @@ -8,7 +14,6 @@ import { import { DEFAULT_CURRENCY } from '@ghostfolio/common/config'; import { DATE_FORMAT } from '@ghostfolio/common/helper'; import { DataProviderInfo } from '@ghostfolio/common/interfaces'; -import { Granularity } from '@ghostfolio/common/types'; import { Injectable, Logger } from '@nestjs/common'; import { AssetClass, @@ -86,27 +91,16 @@ export class CoinGeckoService implements DataProviderInterface { return response; } - public async getDividends({ - from, - granularity = 'day', - symbol, - to - }: { - from: Date; - granularity: Granularity; - symbol: string; - to: Date; - }) { + public async getDividends({}: GetDividendsParams) { return {}; } - public async getHistorical( - aSymbol: string, - aGranularity: Granularity = 'day', - from: Date, - to: Date, - requestTimeout = this.configurationService.get('REQUEST_TIMEOUT') - ): Promise<{ + public async getHistorical({ + from, + requestTimeout = this.configurationService.get('REQUEST_TIMEOUT'), + symbol, + to + }: GetHistoricalParams): Promise<{ [symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; }> { try { @@ -119,7 +113,7 @@ export class CoinGeckoService implements DataProviderInterface { const { prices } = await got( `${ this.apiUrl - }/coins/${aSymbol}/market_chart/range?vs_currency=${DEFAULT_CURRENCY.toLowerCase()}&from=${getUnixTime( + }/coins/${symbol}/market_chart/range?vs_currency=${DEFAULT_CURRENCY.toLowerCase()}&from=${getUnixTime( from )}&to=${getUnixTime(to)}`, { @@ -132,11 +126,11 @@ export class CoinGeckoService implements DataProviderInterface { const result: { [symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; } = { - [aSymbol]: {} + [symbol]: {} }; for (const [timestamp, marketPrice] of prices) { - result[aSymbol][format(fromUnixTime(timestamp / 1000), DATE_FORMAT)] = { + result[symbol][format(fromUnixTime(timestamp / 1000), DATE_FORMAT)] = { marketPrice }; } @@ -144,7 +138,7 @@ export class CoinGeckoService implements DataProviderInterface { return result; } catch (error) { throw new Error( - `Could not get historical market data for ${aSymbol} (${this.getName()}) from ${format( + `Could not get historical market data for ${symbol} (${this.getName()}) from ${format( from, DATE_FORMAT )} to ${format(to, DATE_FORMAT)}: [${error.name}] ${error.message}` @@ -163,10 +157,7 @@ export class CoinGeckoService implements DataProviderInterface { public async getQuotes({ requestTimeout = this.configurationService.get('REQUEST_TIMEOUT'), symbols - }: { - requestTimeout?: number; - symbols: string[]; - }): Promise<{ [symbol: string]: IDataProviderResponse }> { + }: GetQuotesParams): Promise<{ [symbol: string]: IDataProviderResponse }> { const response: { [symbol: string]: IDataProviderResponse } = {}; if (symbols.length <= 0) { @@ -220,12 +211,8 @@ export class CoinGeckoService implements DataProviderInterface { } public async search({ - includeIndices = false, query - }: { - includeIndices?: boolean; - query: string; - }): Promise<{ items: LookupItem[] }> { + }: GetSearchParams): Promise<{ items: LookupItem[] }> { let items: LookupItem[] = []; try { 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 a8f47f0d4..aee33d729 100644 --- a/apps/api/src/services/data-provider/data-provider.service.ts +++ b/apps/api/src/services/data-provider/data-provider.service.ts @@ -218,7 +218,12 @@ export class DataProviderService { if (dataProvider.canHandle(symbol)) { promises.push( dataProvider - .getHistorical(symbol, undefined, from, to, ms('30 seconds')) + .getHistorical({ + from, + symbol, + to, + requestTimeout: ms('30 seconds') + }) .then((data) => ({ data: data?.[symbol], symbol })) ); } diff --git a/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts b/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts index d2943692b..173994df7 100644 --- a/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts +++ b/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts @@ -1,13 +1,18 @@ import { LookupItem } from '@ghostfolio/api/app/symbol/interfaces/lookup-item.interface'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; -import { DataProviderInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; +import { + DataProviderInterface, + GetDividendsParams, + GetHistoricalParams, + GetQuotesParams, + GetSearchParams +} from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; import { IDataProviderHistoricalResponse, IDataProviderResponse } from '@ghostfolio/api/services/interfaces/interfaces'; import { DEFAULT_CURRENCY } from '@ghostfolio/common/config'; import { DATE_FORMAT, isCurrency } from '@ghostfolio/common/helper'; -import { Granularity } from '@ghostfolio/common/types'; import { Injectable, Logger } from '@nestjs/common'; import { AssetClass, @@ -50,30 +55,20 @@ export class EodHistoricalDataService implements DataProviderInterface { }; } - public async getDividends({ + public async getDividends({}: GetDividendsParams) { + return {}; + } + + public async getHistorical({ from, granularity = 'day', + requestTimeout = this.configurationService.get('REQUEST_TIMEOUT'), symbol, to - }: { - from: Date; - granularity: Granularity; - symbol: string; - to: Date; - }) { - return {}; - } - - public async getHistorical( - aSymbol: string, - aGranularity: Granularity = 'day', - from: Date, - to: Date, - requestTimeout = this.configurationService.get('REQUEST_TIMEOUT') - ): Promise<{ + }: GetHistoricalParams): Promise<{ [symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; }> { - const symbol = this.convertToEodSymbol(aSymbol); + symbol = this.convertToEodSymbol(symbol); try { const abortController = new AbortController(); @@ -88,7 +83,7 @@ export class EodHistoricalDataService implements DataProviderInterface { }&fmt=json&from=${format(from, DATE_FORMAT)}&to=${format( to, DATE_FORMAT - )}&period=${aGranularity}`, + )}&period=${granularity}`, { // @ts-ignore signal: abortController.signal @@ -99,7 +94,7 @@ export class EodHistoricalDataService implements DataProviderInterface { (result, historicalItem, index, array) => { result[this.convertFromEodSymbol(symbol)][historicalItem.date] = { marketPrice: this.getConvertedValue({ - symbol: aSymbol, + symbol: symbol, value: historicalItem.close }) }; @@ -110,7 +105,7 @@ export class EodHistoricalDataService implements DataProviderInterface { ); } catch (error) { throw new Error( - `Could not get historical market data for ${aSymbol} (${this.getName()}) from ${format( + `Could not get historical market data for ${symbol} (${this.getName()}) from ${format( from, DATE_FORMAT )} to ${format(to, DATE_FORMAT)}: [${error.name}] ${error.message}` @@ -131,10 +126,7 @@ export class EodHistoricalDataService implements DataProviderInterface { public async getQuotes({ requestTimeout = this.configurationService.get('REQUEST_TIMEOUT'), symbols - }: { - requestTimeout?: number; - symbols: string[]; - }): Promise<{ [symbol: string]: IDataProviderResponse }> { + }: GetQuotesParams): Promise<{ [symbol: string]: IDataProviderResponse }> { let response: { [symbol: string]: IDataProviderResponse } = {}; if (symbols.length <= 0) { @@ -267,12 +259,8 @@ export class EodHistoricalDataService implements DataProviderInterface { } public async search({ - includeIndices = false, query - }: { - includeIndices?: boolean; - query: string; - }): Promise<{ items: LookupItem[] }> { + }: GetSearchParams): Promise<{ items: LookupItem[] }> { const searchResult = await this.getSearchResult(query); return { diff --git a/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts b/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts index 623df7a25..b22907559 100644 --- a/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts +++ b/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts @@ -1,6 +1,12 @@ import { LookupItem } from '@ghostfolio/api/app/symbol/interfaces/lookup-item.interface'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; -import { DataProviderInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; +import { + DataProviderInterface, + GetDividendsParams, + GetHistoricalParams, + GetQuotesParams, + GetSearchParams +} from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; import { IDataProviderHistoricalResponse, IDataProviderResponse @@ -8,7 +14,6 @@ import { import { DEFAULT_CURRENCY } from '@ghostfolio/common/config'; import { DATE_FORMAT, parseDate } from '@ghostfolio/common/helper'; import { DataProviderInfo } from '@ghostfolio/common/interfaces'; -import { Granularity } from '@ghostfolio/common/types'; import { Injectable, Logger } from '@nestjs/common'; import { DataSource, SymbolProfile } from '@prisma/client'; import { format, isAfter, isBefore, isSameDay } from 'date-fns'; @@ -40,27 +45,16 @@ export class FinancialModelingPrepService implements DataProviderInterface { }; } - public async getDividends({ - from, - granularity = 'day', - symbol, - to - }: { - from: Date; - granularity: Granularity; - symbol: string; - to: Date; - }) { + public async getDividends({}: GetDividendsParams) { return {}; } - public async getHistorical( - aSymbol: string, - aGranularity: Granularity = 'day', - from: Date, - to: Date, - requestTimeout = this.configurationService.get('REQUEST_TIMEOUT') - ): Promise<{ + public async getHistorical({ + from, + requestTimeout = this.configurationService.get('REQUEST_TIMEOUT'), + symbol, + to + }: GetHistoricalParams): Promise<{ [symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; }> { try { @@ -71,7 +65,7 @@ export class FinancialModelingPrepService implements DataProviderInterface { }, requestTimeout); const { historical } = await got( - `${this.URL}/historical-price-full/${aSymbol}?apikey=${this.apiKey}`, + `${this.URL}/historical-price-full/${symbol}?apikey=${this.apiKey}`, { // @ts-ignore signal: abortController.signal @@ -81,7 +75,7 @@ export class FinancialModelingPrepService implements DataProviderInterface { const result: { [symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; } = { - [aSymbol]: {} + [symbol]: {} }; for (const { close, date } of historical) { @@ -90,7 +84,7 @@ export class FinancialModelingPrepService implements DataProviderInterface { isAfter(parseDate(date), from)) && isBefore(parseDate(date), to) ) { - result[aSymbol][date] = { + result[symbol][date] = { marketPrice: close }; } @@ -99,7 +93,7 @@ export class FinancialModelingPrepService implements DataProviderInterface { return result; } catch (error) { throw new Error( - `Could not get historical market data for ${aSymbol} (${this.getName()}) from ${format( + `Could not get historical market data for ${symbol} (${this.getName()}) from ${format( from, DATE_FORMAT )} to ${format(to, DATE_FORMAT)}: [${error.name}] ${error.message}` @@ -114,10 +108,7 @@ export class FinancialModelingPrepService implements DataProviderInterface { public async getQuotes({ requestTimeout = this.configurationService.get('REQUEST_TIMEOUT'), symbols - }: { - requestTimeout?: number; - symbols: string[]; - }): Promise<{ [symbol: string]: IDataProviderResponse }> { + }: GetQuotesParams): Promise<{ [symbol: string]: IDataProviderResponse }> { const response: { [symbol: string]: IDataProviderResponse } = {}; if (symbols.length <= 0) { @@ -168,12 +159,8 @@ export class FinancialModelingPrepService implements DataProviderInterface { } public async search({ - includeIndices = false, query - }: { - includeIndices?: boolean; - query: string; - }): Promise<{ items: LookupItem[] }> { + }: GetSearchParams): Promise<{ items: LookupItem[] }> { let items: LookupItem[] = []; try { diff --git a/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts b/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts index 5a5357feb..d52d09adf 100644 --- a/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts +++ b/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts @@ -1,6 +1,12 @@ import { LookupItem } from '@ghostfolio/api/app/symbol/interfaces/lookup-item.interface'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; -import { DataProviderInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; +import { + DataProviderInterface, + GetDividendsParams, + GetHistoricalParams, + GetQuotesParams, + GetSearchParams +} from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; import { IDataProviderHistoricalResponse, IDataProviderResponse @@ -8,7 +14,6 @@ import { import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; import { DATE_FORMAT, parseDate } from '@ghostfolio/common/helper'; -import { Granularity } from '@ghostfolio/common/types'; import { Injectable, Logger } from '@nestjs/common'; import { DataSource, SymbolProfile } from '@prisma/client'; import { format } from 'date-fns'; @@ -35,32 +40,18 @@ export class GoogleSheetsService implements DataProviderInterface { }; } - public async getDividends({ - from, - granularity = 'day', - symbol, - to - }: { - from: Date; - granularity: Granularity; - symbol: string; - to: Date; - }) { + public async getDividends({}: GetDividendsParams) { return {}; } - public async getHistorical( - aSymbol: string, - aGranularity: Granularity = 'day', - from: Date, - to: Date, - requestTimeout = this.configurationService.get('REQUEST_TIMEOUT') - ): Promise<{ + public async getHistorical({ + from, + symbol, + to + }: GetHistoricalParams): Promise<{ [symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; }> { try { - const symbol = aSymbol; - const sheet = await this.getSheet({ symbol, sheetId: this.configurationService.get('GOOGLE_SHEETS_ID') @@ -88,7 +79,7 @@ export class GoogleSheetsService implements DataProviderInterface { }; } catch (error) { throw new Error( - `Could not get historical market data for ${aSymbol} (${this.getName()}) from ${format( + `Could not get historical market data for ${symbol} (${this.getName()}) from ${format( from, DATE_FORMAT )} to ${format(to, DATE_FORMAT)}: [${error.name}] ${error.message}` @@ -101,12 +92,8 @@ export class GoogleSheetsService implements DataProviderInterface { } public async getQuotes({ - requestTimeout = this.configurationService.get('REQUEST_TIMEOUT'), symbols - }: { - requestTimeout?: number; - symbols: string[]; - }): Promise<{ [symbol: string]: IDataProviderResponse }> { + }: GetQuotesParams): Promise<{ [symbol: string]: IDataProviderResponse }> { const response: { [symbol: string]: IDataProviderResponse } = {}; if (symbols.length <= 0) { @@ -159,12 +146,8 @@ export class GoogleSheetsService implements DataProviderInterface { } public async search({ - includeIndices = false, query - }: { - includeIndices?: boolean; - query: string; - }): Promise<{ items: LookupItem[] }> { + }: GetSearchParams): Promise<{ items: LookupItem[] }> { const items = await this.prismaService.symbolProfile.findMany({ select: { assetClass: true, diff --git a/apps/api/src/services/data-provider/interfaces/data-provider.interface.ts b/apps/api/src/services/data-provider/interfaces/data-provider.interface.ts index b2562d362..72365f990 100644 --- a/apps/api/src/services/data-provider/interfaces/data-provider.interface.ts +++ b/apps/api/src/services/data-provider/interfaces/data-provider.interface.ts @@ -11,25 +11,17 @@ export interface DataProviderInterface { getAssetProfile(aSymbol: string): Promise>; - getDividends({ + getDividends({ from, granularity, symbol, to }: GetDividendsParams): Promise<{ + [date: string]: IDataProviderHistoricalResponse; + }>; + + getHistorical({ from, granularity, + requestTimeout, symbol, to - }: { - from: Date; - granularity: Granularity; - symbol: string; - to: Date; - }): Promise<{ [date: string]: IDataProviderHistoricalResponse }>; - - getHistorical( - aSymbol: string, - aGranularity: Granularity, - from: Date, - to: Date, - requestTimeout?: number - ): Promise<{ + }: GetHistoricalParams): Promise<{ [symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; }>; // TODO: Return only one symbol @@ -40,18 +32,37 @@ export interface DataProviderInterface { getQuotes({ requestTimeout, symbols - }: { - requestTimeout?: number; - symbols: string[]; - }): Promise<{ [symbol: string]: IDataProviderResponse }>; + }: GetQuotesParams): Promise<{ [symbol: string]: IDataProviderResponse }>; getTestSymbol(): string; search({ includeIndices, query - }: { - includeIndices?: boolean; - query: string; - }): Promise<{ items: LookupItem[] }>; + }: GetSearchParams): Promise<{ items: LookupItem[] }>; +} + +export interface GetDividendsParams { + from: Date; + granularity?: Granularity; + symbol: string; + to: Date; +} + +export interface GetHistoricalParams { + from: Date; + granularity?: Granularity; + requestTimeout?: number; + symbol: string; + to: Date; +} + +export interface GetQuotesParams { + requestTimeout?: number; + symbols: string[]; +} + +export interface GetSearchParams { + includeIndices?: boolean; + query: string; } diff --git a/apps/api/src/services/data-provider/manual/manual.service.ts b/apps/api/src/services/data-provider/manual/manual.service.ts index decaf1212..f5b285016 100644 --- a/apps/api/src/services/data-provider/manual/manual.service.ts +++ b/apps/api/src/services/data-provider/manual/manual.service.ts @@ -1,6 +1,12 @@ import { LookupItem } from '@ghostfolio/api/app/symbol/interfaces/lookup-item.interface'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; -import { DataProviderInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; +import { + DataProviderInterface, + GetDividendsParams, + GetHistoricalParams, + GetQuotesParams, + GetSearchParams +} from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; import { IDataProviderHistoricalResponse, IDataProviderResponse @@ -13,7 +19,6 @@ import { getYesterday } from '@ghostfolio/common/helper'; import { ScraperConfiguration } from '@ghostfolio/common/interfaces'; -import { Granularity } from '@ghostfolio/common/types'; import { Injectable, Logger } from '@nestjs/common'; import { DataSource, SymbolProfile } from '@prisma/client'; import * as cheerio from 'cheerio'; @@ -43,32 +48,18 @@ export class ManualService implements DataProviderInterface { }; } - public async getDividends({ - from, - granularity = 'day', - symbol, - to - }: { - from: Date; - granularity: Granularity; - symbol: string; - to: Date; - }) { + public async getDividends({}: GetDividendsParams) { return {}; } - public async getHistorical( - aSymbol: string, - aGranularity: Granularity = 'day', - from: Date, - to: Date, - requestTimeout = this.configurationService.get('REQUEST_TIMEOUT') - ): Promise<{ + public async getHistorical({ + from, + symbol, + to + }: GetHistoricalParams): Promise<{ [symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; }> { try { - const symbol = aSymbol; - const [symbolProfile] = await this.symbolProfileService.getSymbolProfiles( [{ symbol, dataSource: this.getName() }] ); @@ -111,7 +102,7 @@ export class ManualService implements DataProviderInterface { }; } catch (error) { throw new Error( - `Could not get historical market data for ${aSymbol} (${this.getName()}) from ${format( + `Could not get historical market data for ${symbol} (${this.getName()}) from ${format( from, DATE_FORMAT )} to ${format(to, DATE_FORMAT)}: [${error.name}] ${error.message}` @@ -124,12 +115,8 @@ export class ManualService implements DataProviderInterface { } public async getQuotes({ - requestTimeout = this.configurationService.get('REQUEST_TIMEOUT'), symbols - }: { - requestTimeout?: number; - symbols: string[]; - }): Promise<{ [symbol: string]: IDataProviderResponse }> { + }: GetQuotesParams): Promise<{ [symbol: string]: IDataProviderResponse }> { const response: { [symbol: string]: IDataProviderResponse } = {}; if (symbols.length <= 0) { @@ -180,12 +167,8 @@ export class ManualService implements DataProviderInterface { } public async search({ - includeIndices = false, query - }: { - includeIndices?: boolean; - query: string; - }): Promise<{ items: LookupItem[] }> { + }: GetSearchParams): Promise<{ items: LookupItem[] }> { let items = await this.prismaService.symbolProfile.findMany({ select: { assetClass: true, diff --git a/apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts b/apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts index c1be20d2d..d9b4bd0e4 100644 --- a/apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts +++ b/apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts @@ -1,13 +1,18 @@ import { LookupItem } from '@ghostfolio/api/app/symbol/interfaces/lookup-item.interface'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; -import { DataProviderInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; +import { + DataProviderInterface, + GetDividendsParams, + GetHistoricalParams, + GetQuotesParams, + GetSearchParams +} from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; import { IDataProviderHistoricalResponse, IDataProviderResponse } from '@ghostfolio/api/services/interfaces/interfaces'; import { ghostfolioFearAndGreedIndexSymbol } from '@ghostfolio/common/config'; import { DATE_FORMAT, getYesterday } from '@ghostfolio/common/helper'; -import { Granularity } from '@ghostfolio/common/types'; import { Injectable, Logger } from '@nestjs/common'; import { DataSource, SymbolProfile } from '@prisma/client'; import { format } from 'date-fns'; @@ -32,32 +37,18 @@ export class RapidApiService implements DataProviderInterface { }; } - public async getDividends({ - from, - granularity = 'day', - symbol, - to - }: { - from: Date; - granularity: Granularity; - symbol: string; - to: Date; - }) { + public async getDividends({}: GetDividendsParams) { return {}; } - public async getHistorical( - aSymbol: string, - aGranularity: Granularity = 'day', - from: Date, - to: Date, - requestTimeout = this.configurationService.get('REQUEST_TIMEOUT') - ): Promise<{ + public async getHistorical({ + from, + symbol, + to + }: GetHistoricalParams): Promise<{ [symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; }> { try { - const symbol = aSymbol; - if (symbol === ghostfolioFearAndGreedIndexSymbol) { const fgi = await this.getFearAndGreedIndex(); @@ -71,7 +62,7 @@ export class RapidApiService implements DataProviderInterface { } } catch (error) { throw new Error( - `Could not get historical market data for ${aSymbol} (${this.getName()}) from ${format( + `Could not get historical market data for ${symbol} (${this.getName()}) from ${format( from, DATE_FORMAT )} to ${format(to, DATE_FORMAT)}: [${error.name}] ${error.message}` @@ -86,12 +77,8 @@ export class RapidApiService implements DataProviderInterface { } public async getQuotes({ - requestTimeout = this.configurationService.get('REQUEST_TIMEOUT'), symbols - }: { - requestTimeout?: number; - symbols: string[]; - }): Promise<{ [symbol: string]: IDataProviderResponse }> { + }: GetQuotesParams): Promise<{ [symbol: string]: IDataProviderResponse }> { if (symbols.length <= 0) { return {}; } @@ -122,13 +109,7 @@ export class RapidApiService implements DataProviderInterface { return undefined; } - public async search({ - includeIndices = false, - query - }: { - includeIndices?: boolean; - query: string; - }): Promise<{ items: LookupItem[] }> { + public async search({}: GetSearchParams): Promise<{ items: LookupItem[] }> { return { items: [] }; } 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 edce72abe..e027c227f 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 @@ -1,15 +1,19 @@ import { LookupItem } from '@ghostfolio/api/app/symbol/interfaces/lookup-item.interface'; -import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { CryptocurrencyService } from '@ghostfolio/api/services/cryptocurrency/cryptocurrency.service'; import { YahooFinanceDataEnhancerService } from '@ghostfolio/api/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service'; -import { DataProviderInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; +import { + DataProviderInterface, + GetDividendsParams, + GetHistoricalParams, + GetQuotesParams, + GetSearchParams +} from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; import { IDataProviderHistoricalResponse, IDataProviderResponse } from '@ghostfolio/api/services/interfaces/interfaces'; import { DEFAULT_CURRENCY } from '@ghostfolio/common/config'; import { DATE_FORMAT } from '@ghostfolio/common/helper'; -import { Granularity } from '@ghostfolio/common/types'; import { Injectable, Logger } from '@nestjs/common'; import { DataSource, SymbolProfile } from '@prisma/client'; import Big from 'big.js'; @@ -20,7 +24,6 @@ import { Quote } from 'yahoo-finance2/dist/esm/src/modules/quote'; @Injectable() export class YahooFinanceService implements DataProviderInterface { public constructor( - private readonly configurationService: ConfigurationService, private readonly cryptocurrencyService: CryptocurrencyService, private readonly yahooFinanceDataEnhancerService: YahooFinanceDataEnhancerService ) {} @@ -50,12 +53,7 @@ export class YahooFinanceService implements DataProviderInterface { granularity = 'day', symbol, to - }: { - from: Date; - granularity: Granularity; - symbol: string; - to: Date; - }) { + }: GetDividendsParams) { if (isSameDay(from, to)) { to = addDays(to, 1); } @@ -100,13 +98,11 @@ export class YahooFinanceService implements DataProviderInterface { } } - public async getHistorical( - aSymbol: string, - aGranularity: Granularity = 'day', - from: Date, - to: Date, - requestTimeout = this.configurationService.get('REQUEST_TIMEOUT') - ): Promise<{ + public async getHistorical({ + from, + symbol, + to + }: GetHistoricalParams): Promise<{ [symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; }> { if (isSameDay(from, to)) { @@ -116,7 +112,7 @@ export class YahooFinanceService implements DataProviderInterface { try { const historicalResult = await yahooFinance.historical( this.yahooFinanceDataEnhancerService.convertToYahooFinanceSymbol( - aSymbol + symbol ), { interval: '1d', @@ -129,12 +125,12 @@ export class YahooFinanceService implements DataProviderInterface { [symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; } = {}; - response[aSymbol] = {}; + response[symbol] = {}; for (const historicalItem of historicalResult) { - response[aSymbol][format(historicalItem.date, DATE_FORMAT)] = { + response[symbol][format(historicalItem.date, DATE_FORMAT)] = { marketPrice: this.getConvertedValue({ - symbol: aSymbol, + symbol: symbol, value: historicalItem.close }) }; @@ -143,7 +139,7 @@ export class YahooFinanceService implements DataProviderInterface { return response; } catch (error) { throw new Error( - `Could not get historical market data for ${aSymbol} (${this.getName()}) from ${format( + `Could not get historical market data for ${symbol} (${this.getName()}) from ${format( from, DATE_FORMAT )} to ${format(to, DATE_FORMAT)}: [${error.name}] ${error.message}` @@ -160,12 +156,8 @@ export class YahooFinanceService implements DataProviderInterface { } public async getQuotes({ - requestTimeout = this.configurationService.get('REQUEST_TIMEOUT'), symbols - }: { - requestTimeout?: number; - symbols: string[]; - }): Promise<{ [symbol: string]: IDataProviderResponse }> { + }: GetQuotesParams): Promise<{ [symbol: string]: IDataProviderResponse }> { const response: { [symbol: string]: IDataProviderResponse } = {}; if (symbols.length <= 0) { @@ -280,10 +272,7 @@ export class YahooFinanceService implements DataProviderInterface { public async search({ includeIndices = false, query - }: { - includeIndices?: boolean; - query: string; - }): Promise<{ items: LookupItem[] }> { + }: GetSearchParams): Promise<{ items: LookupItem[] }> { const items: LookupItem[] = []; try {