Browse Source

optimize fetching from multiple data sources

pull/123/head
Valentin Zickner 4 years ago
parent
commit
765f374110
  1. 71
      apps/api/src/services/data-provider.service.ts
  2. 4
      apps/api/src/services/data-provider/alpha-vantage/alpha-vantage.service.ts
  3. 9
      apps/api/src/services/data-provider/ghostfolio-scraper-api/ghostfolio-scraper-api.service.ts
  4. 13
      apps/api/src/services/data-provider/rakuten-rapid-api/rakuten-rapid-api.service.ts
  5. 4
      apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts
  6. 2
      apps/api/src/services/interfaces/data-provider.interface.ts

71
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.');
}

4
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 }> {

9
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 }> {

13
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',

4
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',

2
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(

Loading…
Cancel
Save