Browse Source

Move data enhancer from data provider to data gathering

pull/437/head
Thomas 4 years ago
parent
commit
faccc97fe9
  1. 8
      apps/api/src/app/cache/cache.module.ts
  2. 2
      apps/api/src/app/info/info.module.ts
  3. 14
      apps/api/src/services/data-gathering.module.ts
  4. 25
      apps/api/src/services/data-gathering.service.ts
  5. 8
      apps/api/src/services/data-provider/data-enhancer/data-enhancer.module.ts
  6. 7
      apps/api/src/services/data-provider/data-provider.module.ts
  7. 18
      apps/api/src/services/data-provider/data-provider.service.ts

8
apps/api/src/app/cache/cache.module.ts

@ -1,6 +1,7 @@
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 { DataGatheringModule } from '@ghostfolio/api/services/data-gathering.module';
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';
@ -10,7 +11,12 @@ import { Module } from '@nestjs/common';
import { CacheController } from './cache.controller';
@Module({
imports: [DataProviderModule, ExchangeRateDataModule, RedisCacheModule],
imports: [
DataGatheringModule,
DataProviderModule,
ExchangeRateDataModule,
RedisCacheModule
],
controllers: [CacheController],
providers: [
CacheService,

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

@ -1,4 +1,5 @@
import { ConfigurationService } from '@ghostfolio/api/services/configuration.service';
import { DataGatheringModule } from '@ghostfolio/api/services/data-gathering.module';
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';
@ -11,6 +12,7 @@ import { InfoService } from './info.service';
@Module({
imports: [
DataGatheringModule,
DataProviderModule,
ExchangeRateDataModule,
JwtModule.register({

14
apps/api/src/services/data-gathering.module.ts

@ -1,19 +1,29 @@
import { ConfigurationModule } from '@ghostfolio/api/services/configuration.module';
import { DataGatheringService } from '@ghostfolio/api/services/data-gathering.service';
import { TrackinsightDataEnhancerService } from '@ghostfolio/api/services/data-provider/data-enhancer/trackinsight/trackinsight.service';
import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module';
import { PrismaModule } from '@ghostfolio/api/services/prisma.module';
import { Module } from '@nestjs/common';
import { DataEnhancerModule } from './data-provider/data-enhancer/data-enhancer.module';
import { ExchangeRateDataModule } from './exchange-rate-data.module';
@Module({
imports: [
ConfigurationModule,
DataEnhancerModule,
DataProviderModule,
ExchangeRateDataModule,
PrismaModule
],
providers: [DataGatheringService],
exports: [DataGatheringService]
providers: [
{
inject: [TrackinsightDataEnhancerService],
provide: 'DataEnhancers',
useFactory: (trackinsight) => [trackinsight]
},
DataGatheringService
],
exports: ['DataEnhancers', DataGatheringService]
})
export class DataGatheringModule {}

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

@ -3,7 +3,7 @@ import {
ghostfolioFearAndGreedIndexSymbol
} from '@ghostfolio/common/config';
import { DATE_FORMAT, resetHours } from '@ghostfolio/common/helper';
import { Injectable } from '@nestjs/common';
import { Inject, Injectable } from '@nestjs/common';
import { DataSource } from '@prisma/client';
import {
differenceInHours,
@ -18,6 +18,7 @@ import {
import { ConfigurationService } from './configuration.service';
import { DataProviderService } from './data-provider/data-provider.service';
import { GhostfolioScraperApiService } from './data-provider/ghostfolio-scraper-api/ghostfolio-scraper-api.service';
import { DataEnhancerInterface } from './data-provider/interfaces/data-enhancer.interface';
import { ExchangeRateDataService } from './exchange-rate-data.service';
import { IDataGatheringItem } from './interfaces/interfaces';
import { PrismaService } from './prisma.service';
@ -26,6 +27,8 @@ import { PrismaService } from './prisma.service';
export class DataGatheringService {
public constructor(
private readonly configurationService: ConfigurationService,
@Inject('DataEnhancers')
private readonly dataEnhancers: DataEnhancerInterface[],
private readonly dataProviderService: DataProviderService,
private readonly exchangeRateDataService: ExchangeRateDataService,
private readonly ghostfolioScraperApi: GhostfolioScraperApiService,
@ -130,9 +133,19 @@ export class DataGatheringService {
const currentData = await this.dataProviderService.get(dataGatheringItems);
for (const [
symbol,
{
for (const [symbol, response] of Object.entries(currentData)) {
for (const dataEnhancer of this.dataEnhancers) {
try {
currentData[symbol] = await dataEnhancer.enhance({
response,
symbol
});
} catch (error) {
console.error(`Failed to enhance data for symbol ${symbol}`, error);
}
}
const {
assetClass,
assetSubClass,
countries,
@ -140,8 +153,8 @@ export class DataGatheringService {
dataSource,
name,
sectors
}
] of Object.entries(currentData)) {
} = currentData[symbol];
try {
await this.prismaService.symbolProfile.upsert({
create: {

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

@ -0,0 +1,8 @@
import { TrackinsightDataEnhancerService } from '@ghostfolio/api/services/data-provider/data-enhancer/trackinsight/trackinsight.service';
import { Module } from '@nestjs/common';
@Module({
exports: [TrackinsightDataEnhancerService],
providers: [TrackinsightDataEnhancerService]
})
export class DataEnhancerModule {}

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

@ -1,6 +1,5 @@
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 { 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';
@ -17,13 +16,7 @@ import { DataProviderService } from './data-provider.service';
DataProviderService,
GhostfolioScraperApiService,
RakutenRapidApiService,
TrackinsightDataEnhancerService,
YahooFinanceService,
{
inject: [TrackinsightDataEnhancerService],
provide: 'DataEnhancers',
useFactory: (trackinsight) => [trackinsight]
},
{
inject: [
AlphaVantageService,

18
apps/api/src/services/data-provider/data-provider.service.ts

@ -1,6 +1,5 @@
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 { DataProviderInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface';
import {
IDataGatheringItem,
@ -19,8 +18,6 @@ import { isEmpty } from 'lodash';
export class DataProviderService {
public constructor(
private readonly configurationService: ConfigurationService,
@Inject('DataEnhancers')
private readonly dataEnhancers: DataEnhancerInterface[],
@Inject('DataProviderInterfaces')
private readonly dataProviderInterfaces: DataProviderInterface[],
private readonly prismaService: PrismaService
@ -42,20 +39,7 @@ export class DataProviderService {
const promises = [];
for (const symbol of Object.keys(response)) {
let promise = Promise.resolve(response[symbol]);
for (const dataEnhancer of this.dataEnhancers) {
promise = promise.then((currentResponse) =>
dataEnhancer
.enhance({ symbol, response: currentResponse })
.catch((error) => {
console.error(
`Failed to enhance data for symbol ${symbol}`,
error
);
return currentResponse;
})
);
}
const promise = Promise.resolve(response[symbol]);
promises.push(
promise.then((currentResponse) => (response[symbol] = currentResponse))
);

Loading…
Cancel
Save