From 2a23282bf9f81db713630283a0add3ca7b7feed3 Mon Sep 17 00:00:00 2001 From: Thomas <4159106+dtslvr@users.noreply.github.com> Date: Sun, 16 Apr 2023 20:15:36 +0200 Subject: [PATCH] Add Yahoo Finance data enhancer --- .../data-enhancer/data-enhancer.module.ts | 23 ++++++-- .../trackinsight/trackinsight.service.ts | 2 + .../yahoo-finance/yahoo-finance.service.ts | 58 +++++++++++++++++++ 3 files changed, 79 insertions(+), 4 deletions(-) create mode 100644 apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.ts diff --git a/apps/api/src/services/data-provider/data-enhancer/data-enhancer.module.ts b/apps/api/src/services/data-provider/data-enhancer/data-enhancer.module.ts index 9d4c0704d..756a99f24 100644 --- a/apps/api/src/services/data-provider/data-enhancer/data-enhancer.module.ts +++ b/apps/api/src/services/data-provider/data-enhancer/data-enhancer.module.ts @@ -1,15 +1,30 @@ +import { ConfigurationModule } from '@ghostfolio/api/services/configuration.module'; +import { CryptocurrencyModule } from '@ghostfolio/api/services/cryptocurrency/cryptocurrency.module'; import { TrackinsightDataEnhancerService } from '@ghostfolio/api/services/data-provider/data-enhancer/trackinsight/trackinsight.service'; +import { YahooFinanceDataEnhancerService } from '@ghostfolio/api/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service'; +import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module'; +import { YahooFinanceService } from '@ghostfolio/api/services/data-provider/yahoo-finance/yahoo-finance.service'; import { Module } from '@nestjs/common'; @Module({ - exports: ['DataEnhancers', TrackinsightDataEnhancerService], + exports: [ + 'DataEnhancers', + TrackinsightDataEnhancerService, + YahooFinanceDataEnhancerService + ], + imports: [ConfigurationModule, CryptocurrencyModule, DataProviderModule], providers: [ + TrackinsightDataEnhancerService, + YahooFinanceDataEnhancerService, { - inject: [TrackinsightDataEnhancerService], + inject: [ + TrackinsightDataEnhancerService, + YahooFinanceDataEnhancerService + ], provide: 'DataEnhancers', - useFactory: (trackinsight) => [trackinsight] + useFactory: (trackinsight, yahooFinance) => [trackinsight, yahooFinance] }, - TrackinsightDataEnhancerService + YahooFinanceService ] }) export class DataEnhancerModule {} diff --git a/apps/api/src/services/data-provider/data-enhancer/trackinsight/trackinsight.service.ts b/apps/api/src/services/data-provider/data-enhancer/trackinsight/trackinsight.service.ts index 4e76d7ed4..ec68dd2eb 100644 --- a/apps/api/src/services/data-provider/data-enhancer/trackinsight/trackinsight.service.ts +++ b/apps/api/src/services/data-provider/data-enhancer/trackinsight/trackinsight.service.ts @@ -1,11 +1,13 @@ import { DataEnhancerInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-enhancer.interface'; import { Country } from '@ghostfolio/common/interfaces/country.interface'; import { Sector } from '@ghostfolio/common/interfaces/sector.interface'; +import { Injectable } from '@nestjs/common'; import { SymbolProfile } from '@prisma/client'; import bent from 'bent'; const getJSON = bent('json'); +@Injectable() export class TrackinsightDataEnhancerService implements DataEnhancerInterface { private static baseUrl = 'https://data.trackinsight.com'; private static countries = require('countries-list/dist/countries.json'); diff --git a/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.ts b/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.ts new file mode 100644 index 000000000..3d119c64e --- /dev/null +++ b/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.ts @@ -0,0 +1,58 @@ +import { DataEnhancerInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-enhancer.interface'; +import { YahooFinanceService } from '@ghostfolio/api/services/data-provider/yahoo-finance/yahoo-finance.service'; +import { Injectable, Logger } from '@nestjs/common'; +import { DataSource, SymbolProfile } from '@prisma/client'; + +@Injectable() +export class YahooFinanceDataEnhancerService implements DataEnhancerInterface { + public constructor( + private readonly yahooFinanceService: YahooFinanceService + ) {} + + public async enhance({ + response, + symbol + }: { + response: Partial; + symbol: string; + }): Promise> { + if (response.dataSource !== 'YAHOO' && !response.isin) { + return response; + } + + try { + let yahooSymbol: string; + + if (response.dataSource === 'YAHOO') { + yahooSymbol = symbol; + } else { + const { items } = await this.yahooFinanceService.search(response.isin); + yahooSymbol = items[0].symbol; + } + + const assetProfile = await this.yahooFinanceService.getAssetProfile( + yahooSymbol + ); + + if (assetProfile.countries) { + response.countries = assetProfile.countries; + } + + if (assetProfile.sectors) { + response.sectors = assetProfile.sectors; + } + + if (assetProfile.url) { + response.url = assetProfile.url; + } + } catch (error) { + Logger.error(error, 'YahooFinanceDataEnhancerService'); + } + + return response; + } + + public getName() { + return DataSource.YAHOO; + } +}