diff --git a/apps/api/src/app/cache/cache.module.ts b/apps/api/src/app/cache/cache.module.ts index 7c6d78108..663d9926b 100644 --- a/apps/api/src/app/cache/cache.module.ts +++ b/apps/api/src/app/cache/cache.module.ts @@ -2,12 +2,12 @@ import { CacheService } from '@ghostfolio/api/app/cache/cache.service'; import { RedisCacheModule } from '@ghostfolio/api/app/redis-cache/redis-cache.module'; import { ConfigurationService } from '@ghostfolio/api/services/configuration.service'; import { DataGatheringService } from '@ghostfolio/api/services/data-gathering.service'; +import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module'; import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data.module'; import { PrismaService } from '@ghostfolio/api/services/prisma.service'; import { Module } from '@nestjs/common'; import { CacheController } from './cache.controller'; -import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module'; @Module({ imports: [DataProviderModule, ExchangeRateDataModule, RedisCacheModule], diff --git a/apps/api/src/app/info/info.module.ts b/apps/api/src/app/info/info.module.ts index 69f005316..d2fb4ff38 100644 --- a/apps/api/src/app/info/info.module.ts +++ b/apps/api/src/app/info/info.module.ts @@ -1,5 +1,6 @@ import { ConfigurationService } from '@ghostfolio/api/services/configuration.service'; import { DataGatheringService } from '@ghostfolio/api/services/data-gathering.service'; +import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module'; import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data.module'; import { PrismaService } from '@ghostfolio/api/services/prisma.service'; import { Module } from '@nestjs/common'; @@ -7,7 +8,6 @@ import { JwtModule } from '@nestjs/jwt'; import { InfoController } from './info.controller'; import { InfoService } from './info.service'; -import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module'; @Module({ imports: [ diff --git a/apps/api/src/services/data-gathering.service.ts b/apps/api/src/services/data-gathering.service.ts index 35a9a4e63..4ce7de255 100644 --- a/apps/api/src/services/data-gathering.service.ts +++ b/apps/api/src/services/data-gathering.service.ts @@ -130,6 +130,10 @@ export class DataGatheringService { const currentData = await this.dataProviderService.get(dataGatheringItems); + Object.entries(currentData).forEach((symbol) => { + console.log(symbol[0], symbol[1]); + }); + for (const [ symbol, { 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 670c56e2c..6482c4522 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 @@ -6,11 +6,11 @@ import { Injectable } from '@nestjs/common'; import { DataSource } from '@prisma/client'; import { isAfter, isBefore, parse } from 'date-fns'; -import { DataProviderInterface } from '../interfaces/data-provider.interface'; import { IDataProviderHistoricalResponse, IDataProviderResponse } from '../../interfaces/interfaces'; +import { DataProviderInterface } from '../interfaces/data-provider.interface'; import { IAlphaVantageHistoricalResponse } from './interfaces/interfaces'; @Injectable() diff --git a/apps/api/src/services/data-provider/trackinsight-enhancer/trackinsight-enhancer.service.ts b/apps/api/src/services/data-provider/data-enhancer/trackinsight/trackinsight.service.ts similarity index 65% rename from apps/api/src/services/data-provider/trackinsight-enhancer/trackinsight-enhancer.service.ts rename to apps/api/src/services/data-provider/data-enhancer/trackinsight/trackinsight.service.ts index 6a7afbaec..c2ea5e72f 100644 --- a/apps/api/src/services/data-provider/trackinsight-enhancer/trackinsight-enhancer.service.ts +++ b/apps/api/src/services/data-provider/data-enhancer/trackinsight/trackinsight.service.ts @@ -2,21 +2,24 @@ import { DataEnhancerInterface } from '@ghostfolio/api/services/data-provider/in import { IDataProviderResponse } from '@ghostfolio/api/services/interfaces/interfaces'; import bent from 'bent'; -const countries = require('countries-list/dist/countries.json'); const getJSON = bent('json'); -const sectorsMapping = { - 'Consumer Discretionary': 'Consumer Cyclical', - 'Consumer Defensive': 'Consumer Staples', - 'Health Care': 'Healthcare', - 'Information Technology': 'Technology' -}; +export class TrackinsightDataEnhancerService implements DataEnhancerInterface { + private static countries = require('countries-list/dist/countries.json'); + private static sectorsMapping = { + 'Consumer Discretionary': 'Consumer Cyclical', + 'Consumer Defensive': 'Consumer Staples', + 'Health Care': 'Healthcare', + 'Information Technology': 'Technology' + }; -export class TrackinsightEnhancerService implements DataEnhancerInterface { - public async enhance( - symbol: string, - response: IDataProviderResponse - ): Promise { + public async enhance({ + response, + symbol + }: { + response: IDataProviderResponse; + symbol: string; + }): Promise { if ( !(response.assetClass === 'EQUITY' && response.assetSubClass === 'ETF') ) { @@ -36,7 +39,9 @@ export class TrackinsightEnhancerService implements DataEnhancerInterface { for (const [name, value] of Object.entries(holdings.countries)) { let countryCode: string; - for (const [key, country] of Object.entries(countries)) { + for (const [key, country] of Object.entries( + TrackinsightDataEnhancerService.countries + )) { if (country.name === name) { countryCode = key; break; @@ -54,7 +59,7 @@ export class TrackinsightEnhancerService implements DataEnhancerInterface { response.sectors = []; for (const [name, value] of Object.entries(holdings.sectors)) { response.sectors.push({ - name: sectorsMapping[name] ?? name, + name: TrackinsightDataEnhancerService.sectorsMapping[name] ?? name, weight: value.weight }); } diff --git a/apps/api/src/services/data-provider/data-provider.module.ts b/apps/api/src/services/data-provider/data-provider.module.ts index e430a0d9b..9e3e57fd4 100644 --- a/apps/api/src/services/data-provider/data-provider.module.ts +++ b/apps/api/src/services/data-provider/data-provider.module.ts @@ -1,4 +1,5 @@ import { ConfigurationModule } from '@ghostfolio/api/services/configuration.module'; +import { TrackinsightDataEnhancerService } from '@ghostfolio/api/services/data-provider/data-enhancer/trackinsight/trackinsight.service'; import { GhostfolioScraperApiService } from '@ghostfolio/api/services/data-provider/ghostfolio-scraper-api/ghostfolio-scraper-api.service'; import { RakutenRapidApiService } from '@ghostfolio/api/services/data-provider/rakuten-rapid-api/rakuten-rapid-api.service'; import { YahooFinanceService } from '@ghostfolio/api/services/data-provider/yahoo-finance/yahoo-finance.service'; @@ -7,7 +8,6 @@ import { Module } from '@nestjs/common'; import { AlphaVantageService } from './alpha-vantage/alpha-vantage.service'; import { DataProviderService } from './data-provider.service'; -import { TrackinsightEnhancerService } from '@ghostfolio/api/services/data-provider/trackinsight-enhancer/trackinsight-enhancer.service'; @Module({ imports: [ConfigurationModule, PrismaModule], @@ -16,12 +16,12 @@ import { TrackinsightEnhancerService } from '@ghostfolio/api/services/data-provi DataProviderService, GhostfolioScraperApiService, RakutenRapidApiService, - TrackinsightEnhancerService, + TrackinsightDataEnhancerService, YahooFinanceService, { + inject: [TrackinsightDataEnhancerService], provide: 'DataEnhancers', - useFactory: (trackinsight) => [trackinsight], - inject: [TrackinsightEnhancerService] + useFactory: (trackinsight) => [trackinsight] } ], exports: [DataProviderService, GhostfolioScraperApiService] 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 43e0ab8f9..e00c6d48b 100644 --- a/apps/api/src/services/data-provider/data-provider.service.ts +++ b/apps/api/src/services/data-provider/data-provider.service.ts @@ -1,5 +1,6 @@ import { LookupItem } from '@ghostfolio/api/app/symbol/interfaces/lookup-item.interface'; import { ConfigurationService } from '@ghostfolio/api/services/configuration.service'; +import { DataEnhancerInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-enhancer.interface'; import { IDataGatheringItem, IDataProviderHistoricalResponse, @@ -17,7 +18,6 @@ import { AlphaVantageService } from './alpha-vantage/alpha-vantage.service'; import { GhostfolioScraperApiService } from './ghostfolio-scraper-api/ghostfolio-scraper-api.service'; import { RakutenRapidApiService } from './rakuten-rapid-api/rakuten-rapid-api.service'; import { YahooFinanceService } from './yahoo-finance/yahoo-finance.service'; -import { DataEnhancerInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-enhancer.interface'; @Injectable() export class DataProviderService { @@ -52,14 +52,21 @@ export class DataProviderService { for (const symbol of Object.keys(response)) { let promise = Promise.resolve(response[symbol]); for (const dataEnhancer of this.dataEnhancers) { - promise = promise.then((r) => - dataEnhancer.enhance(symbol, r).catch((e) => { - console.error(`Failed to enhance data for symbol ${symbol}`, e); - return r; - }) + promise = promise.then((currentResponse) => + dataEnhancer + .enhance({ symbol, response: currentResponse }) + .catch((error) => { + console.error( + `Failed to enhance data for symbol ${symbol}`, + error + ); + return currentResponse; + }) ); } - promises.push(promise.then((r) => (response[symbol] = r))); + promises.push( + promise.then((currentResponse) => (response[symbol] = currentResponse)) + ); } await Promise.all(promises); 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 b51ad654f..dd240e8b3 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 @@ -12,13 +12,13 @@ import * as bent from 'bent'; import * as cheerio from 'cheerio'; import { format } from 'date-fns'; -import { DataProviderInterface } from '../interfaces/data-provider.interface'; import { IDataGatheringItem, IDataProviderHistoricalResponse, IDataProviderResponse, MarketState } from '../../interfaces/interfaces'; +import { DataProviderInterface } from '../interfaces/data-provider.interface'; import { ScraperConfig } from './interfaces/scraper-config.interface'; @Injectable() diff --git a/apps/api/src/services/data-provider/interfaces/data-enhancer.interface.ts b/apps/api/src/services/data-provider/interfaces/data-enhancer.interface.ts index 89a28d4e3..1a0d4f87a 100644 --- a/apps/api/src/services/data-provider/interfaces/data-enhancer.interface.ts +++ b/apps/api/src/services/data-provider/interfaces/data-enhancer.interface.ts @@ -1,8 +1,11 @@ import { IDataProviderResponse } from '@ghostfolio/api/services/interfaces/interfaces'; export interface DataEnhancerInterface { - enhance( - symbol: string, - response: IDataProviderResponse - ): Promise; + enhance({ + response, + symbol + }: { + response: IDataProviderResponse; + symbol: string; + }): Promise; } 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 9102d53de..b6b5642b6 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 @@ -14,12 +14,12 @@ import { DataSource } from '@prisma/client'; import * as bent from 'bent'; import { format, subMonths, subWeeks, subYears } from 'date-fns'; -import { DataProviderInterface } from '../interfaces/data-provider.interface'; import { IDataProviderHistoricalResponse, IDataProviderResponse, MarketState } from '../../interfaces/interfaces'; +import { DataProviderInterface } from '../interfaces/data-provider.interface'; @Injectable() export class RakutenRapidApiService implements DataProviderInterface { 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 eb7d220ca..b0dd64f5d 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 @@ -10,12 +10,12 @@ import { countries } from 'countries-list'; import { format } from 'date-fns'; import * as yahooFinance from 'yahoo-finance'; -import { DataProviderInterface } from '../interfaces/data-provider.interface'; import { IDataProviderHistoricalResponse, IDataProviderResponse, MarketState } from '../../interfaces/interfaces'; +import { DataProviderInterface } from '../interfaces/data-provider.interface'; import { IYahooFinanceHistoricalResponse, IYahooFinancePrice,