Browse Source

Clean up

Co-Authored-By: Valentin Zickner <valentin@coderworks.de>
pull/410/head
Thomas 4 years ago
parent
commit
f68ee2cdb7
  1. 2
      apps/api/src/app/cache/cache.module.ts
  2. 2
      apps/api/src/app/info/info.module.ts
  3. 4
      apps/api/src/services/data-gathering.service.ts
  4. 2
      apps/api/src/services/data-provider/alpha-vantage/alpha-vantage.service.ts
  5. 25
      apps/api/src/services/data-provider/data-enhancer/trackinsight/trackinsight.service.ts
  6. 8
      apps/api/src/services/data-provider/data-provider.module.ts
  7. 19
      apps/api/src/services/data-provider/data-provider.service.ts
  8. 2
      apps/api/src/services/data-provider/ghostfolio-scraper-api/ghostfolio-scraper-api.service.ts
  9. 11
      apps/api/src/services/data-provider/interfaces/data-enhancer.interface.ts
  10. 2
      apps/api/src/services/data-provider/rakuten-rapid-api/rakuten-rapid-api.service.ts
  11. 2
      apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts

2
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 { RedisCacheModule } from '@ghostfolio/api/app/redis-cache/redis-cache.module';
import { ConfigurationService } from '@ghostfolio/api/services/configuration.service'; import { ConfigurationService } from '@ghostfolio/api/services/configuration.service';
import { DataGatheringService } from '@ghostfolio/api/services/data-gathering.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 { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data.module';
import { PrismaService } from '@ghostfolio/api/services/prisma.service'; import { PrismaService } from '@ghostfolio/api/services/prisma.service';
import { Module } from '@nestjs/common'; import { Module } from '@nestjs/common';
import { CacheController } from './cache.controller'; import { CacheController } from './cache.controller';
import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module';
@Module({ @Module({
imports: [DataProviderModule, ExchangeRateDataModule, RedisCacheModule], imports: [DataProviderModule, ExchangeRateDataModule, RedisCacheModule],

2
apps/api/src/app/info/info.module.ts

@ -1,5 +1,6 @@
import { ConfigurationService } from '@ghostfolio/api/services/configuration.service'; import { ConfigurationService } from '@ghostfolio/api/services/configuration.service';
import { DataGatheringService } from '@ghostfolio/api/services/data-gathering.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 { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data.module';
import { PrismaService } from '@ghostfolio/api/services/prisma.service'; import { PrismaService } from '@ghostfolio/api/services/prisma.service';
import { Module } from '@nestjs/common'; import { Module } from '@nestjs/common';
@ -7,7 +8,6 @@ import { JwtModule } from '@nestjs/jwt';
import { InfoController } from './info.controller'; import { InfoController } from './info.controller';
import { InfoService } from './info.service'; import { InfoService } from './info.service';
import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module';
@Module({ @Module({
imports: [ imports: [

4
apps/api/src/services/data-gathering.service.ts

@ -130,6 +130,10 @@ export class DataGatheringService {
const currentData = await this.dataProviderService.get(dataGatheringItems); const currentData = await this.dataProviderService.get(dataGatheringItems);
Object.entries(currentData).forEach((symbol) => {
console.log(symbol[0], symbol[1]);
});
for (const [ for (const [
symbol, symbol,
{ {

2
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 { DataSource } from '@prisma/client';
import { isAfter, isBefore, parse } from 'date-fns'; import { isAfter, isBefore, parse } from 'date-fns';
import { DataProviderInterface } from '../interfaces/data-provider.interface';
import { import {
IDataProviderHistoricalResponse, IDataProviderHistoricalResponse,
IDataProviderResponse IDataProviderResponse
} from '../../interfaces/interfaces'; } from '../../interfaces/interfaces';
import { DataProviderInterface } from '../interfaces/data-provider.interface';
import { IAlphaVantageHistoricalResponse } from './interfaces/interfaces'; import { IAlphaVantageHistoricalResponse } from './interfaces/interfaces';
@Injectable() @Injectable()

25
apps/api/src/services/data-provider/trackinsight-enhancer/trackinsight-enhancer.service.ts → 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 { IDataProviderResponse } from '@ghostfolio/api/services/interfaces/interfaces';
import bent from 'bent'; import bent from 'bent';
const countries = require('countries-list/dist/countries.json');
const getJSON = bent('json'); const getJSON = bent('json');
const sectorsMapping = { export class TrackinsightDataEnhancerService implements DataEnhancerInterface {
private static countries = require('countries-list/dist/countries.json');
private static sectorsMapping = {
'Consumer Discretionary': 'Consumer Cyclical', 'Consumer Discretionary': 'Consumer Cyclical',
'Consumer Defensive': 'Consumer Staples', 'Consumer Defensive': 'Consumer Staples',
'Health Care': 'Healthcare', 'Health Care': 'Healthcare',
'Information Technology': 'Technology' 'Information Technology': 'Technology'
}; };
export class TrackinsightEnhancerService implements DataEnhancerInterface { public async enhance({
public async enhance( response,
symbol: string, symbol
response: IDataProviderResponse }: {
): Promise<IDataProviderResponse> { response: IDataProviderResponse;
symbol: string;
}): Promise<IDataProviderResponse> {
if ( if (
!(response.assetClass === 'EQUITY' && response.assetSubClass === 'ETF') !(response.assetClass === 'EQUITY' && response.assetSubClass === 'ETF')
) { ) {
@ -36,7 +39,9 @@ export class TrackinsightEnhancerService implements DataEnhancerInterface {
for (const [name, value] of Object.entries<any>(holdings.countries)) { for (const [name, value] of Object.entries<any>(holdings.countries)) {
let countryCode: string; let countryCode: string;
for (const [key, country] of Object.entries<any>(countries)) { for (const [key, country] of Object.entries<any>(
TrackinsightDataEnhancerService.countries
)) {
if (country.name === name) { if (country.name === name) {
countryCode = key; countryCode = key;
break; break;
@ -54,7 +59,7 @@ export class TrackinsightEnhancerService implements DataEnhancerInterface {
response.sectors = []; response.sectors = [];
for (const [name, value] of Object.entries<any>(holdings.sectors)) { for (const [name, value] of Object.entries<any>(holdings.sectors)) {
response.sectors.push({ response.sectors.push({
name: sectorsMapping[name] ?? name, name: TrackinsightDataEnhancerService.sectorsMapping[name] ?? name,
weight: value.weight weight: value.weight
}); });
} }

8
apps/api/src/services/data-provider/data-provider.module.ts

@ -1,4 +1,5 @@
import { ConfigurationModule } from '@ghostfolio/api/services/configuration.module'; 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 { 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 { 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'; 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 { AlphaVantageService } from './alpha-vantage/alpha-vantage.service';
import { DataProviderService } from './data-provider.service'; import { DataProviderService } from './data-provider.service';
import { TrackinsightEnhancerService } from '@ghostfolio/api/services/data-provider/trackinsight-enhancer/trackinsight-enhancer.service';
@Module({ @Module({
imports: [ConfigurationModule, PrismaModule], imports: [ConfigurationModule, PrismaModule],
@ -16,12 +16,12 @@ import { TrackinsightEnhancerService } from '@ghostfolio/api/services/data-provi
DataProviderService, DataProviderService,
GhostfolioScraperApiService, GhostfolioScraperApiService,
RakutenRapidApiService, RakutenRapidApiService,
TrackinsightEnhancerService, TrackinsightDataEnhancerService,
YahooFinanceService, YahooFinanceService,
{ {
inject: [TrackinsightDataEnhancerService],
provide: 'DataEnhancers', provide: 'DataEnhancers',
useFactory: (trackinsight) => [trackinsight], useFactory: (trackinsight) => [trackinsight]
inject: [TrackinsightEnhancerService]
} }
], ],
exports: [DataProviderService, GhostfolioScraperApiService] exports: [DataProviderService, GhostfolioScraperApiService]

19
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 { LookupItem } from '@ghostfolio/api/app/symbol/interfaces/lookup-item.interface';
import { ConfigurationService } from '@ghostfolio/api/services/configuration.service'; import { ConfigurationService } from '@ghostfolio/api/services/configuration.service';
import { DataEnhancerInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-enhancer.interface';
import { import {
IDataGatheringItem, IDataGatheringItem,
IDataProviderHistoricalResponse, IDataProviderHistoricalResponse,
@ -17,7 +18,6 @@ import { AlphaVantageService } from './alpha-vantage/alpha-vantage.service';
import { GhostfolioScraperApiService } from './ghostfolio-scraper-api/ghostfolio-scraper-api.service'; import { GhostfolioScraperApiService } from './ghostfolio-scraper-api/ghostfolio-scraper-api.service';
import { RakutenRapidApiService } from './rakuten-rapid-api/rakuten-rapid-api.service'; import { RakutenRapidApiService } from './rakuten-rapid-api/rakuten-rapid-api.service';
import { YahooFinanceService } from './yahoo-finance/yahoo-finance.service'; import { YahooFinanceService } from './yahoo-finance/yahoo-finance.service';
import { DataEnhancerInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-enhancer.interface';
@Injectable() @Injectable()
export class DataProviderService { export class DataProviderService {
@ -52,14 +52,21 @@ export class DataProviderService {
for (const symbol of Object.keys(response)) { for (const symbol of Object.keys(response)) {
let promise = Promise.resolve(response[symbol]); let promise = Promise.resolve(response[symbol]);
for (const dataEnhancer of this.dataEnhancers) { for (const dataEnhancer of this.dataEnhancers) {
promise = promise.then((r) => promise = promise.then((currentResponse) =>
dataEnhancer.enhance(symbol, r).catch((e) => { dataEnhancer
console.error(`Failed to enhance data for symbol ${symbol}`, e); .enhance({ symbol, response: currentResponse })
return r; .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); await Promise.all(promises);

2
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 * as cheerio from 'cheerio';
import { format } from 'date-fns'; import { format } from 'date-fns';
import { DataProviderInterface } from '../interfaces/data-provider.interface';
import { import {
IDataGatheringItem, IDataGatheringItem,
IDataProviderHistoricalResponse, IDataProviderHistoricalResponse,
IDataProviderResponse, IDataProviderResponse,
MarketState MarketState
} from '../../interfaces/interfaces'; } from '../../interfaces/interfaces';
import { DataProviderInterface } from '../interfaces/data-provider.interface';
import { ScraperConfig } from './interfaces/scraper-config.interface'; import { ScraperConfig } from './interfaces/scraper-config.interface';
@Injectable() @Injectable()

11
apps/api/src/services/data-provider/interfaces/data-enhancer.interface.ts

@ -1,8 +1,11 @@
import { IDataProviderResponse } from '@ghostfolio/api/services/interfaces/interfaces'; import { IDataProviderResponse } from '@ghostfolio/api/services/interfaces/interfaces';
export interface DataEnhancerInterface { export interface DataEnhancerInterface {
enhance( enhance({
symbol: string, response,
response: IDataProviderResponse symbol
): Promise<IDataProviderResponse>; }: {
response: IDataProviderResponse;
symbol: string;
}): Promise<IDataProviderResponse>;
} }

2
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 * as bent from 'bent';
import { format, subMonths, subWeeks, subYears } from 'date-fns'; import { format, subMonths, subWeeks, subYears } from 'date-fns';
import { DataProviderInterface } from '../interfaces/data-provider.interface';
import { import {
IDataProviderHistoricalResponse, IDataProviderHistoricalResponse,
IDataProviderResponse, IDataProviderResponse,
MarketState MarketState
} from '../../interfaces/interfaces'; } from '../../interfaces/interfaces';
import { DataProviderInterface } from '../interfaces/data-provider.interface';
@Injectable() @Injectable()
export class RakutenRapidApiService implements DataProviderInterface { export class RakutenRapidApiService implements DataProviderInterface {

2
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 { format } from 'date-fns';
import * as yahooFinance from 'yahoo-finance'; import * as yahooFinance from 'yahoo-finance';
import { DataProviderInterface } from '../interfaces/data-provider.interface';
import { import {
IDataProviderHistoricalResponse, IDataProviderHistoricalResponse,
IDataProviderResponse, IDataProviderResponse,
MarketState MarketState
} from '../../interfaces/interfaces'; } from '../../interfaces/interfaces';
import { DataProviderInterface } from '../interfaces/data-provider.interface';
import { import {
IYahooFinanceHistoricalResponse, IYahooFinanceHistoricalResponse,
IYahooFinancePrice, IYahooFinancePrice,

Loading…
Cancel
Save