Browse Source

Yahoo Finance: Allow searching for cryptocurrencies in the user configured currencies

pull/4290/head
enen92 2 months ago
parent
commit
e6ef2f5289
  1. 1
      apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.module.ts
  2. 12
      apps/api/src/services/cryptocurrency/cryptocurrency.service.ts
  3. 2
      apps/api/src/services/data-provider/data-provider.module.ts
  4. 20
      apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts

1
apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.module.ts

@ -26,6 +26,7 @@ import { GhostfolioService } from './ghostfolio.service';
@Module({ @Module({
controllers: [GhostfolioController], controllers: [GhostfolioController],
imports: [ imports: [
CurrencyModule,
CryptocurrencyModule, CryptocurrencyModule,
DataProviderModule, DataProviderModule,
MarketDataModule, MarketDataModule,

12
apps/api/src/services/cryptocurrency/cryptocurrency.service.ts

@ -1,5 +1,3 @@
import { DEFAULT_CURRENCY } from '@ghostfolio/common/config';
import { Injectable } from '@nestjs/common'; import { Injectable } from '@nestjs/common';
const cryptocurrencies = require('../../assets/cryptocurrencies/cryptocurrencies.json'); const cryptocurrencies = require('../../assets/cryptocurrencies/cryptocurrencies.json');
@ -10,12 +8,10 @@ export class CryptocurrencyService {
private combinedCryptocurrencies: string[]; private combinedCryptocurrencies: string[];
public isCryptocurrency(aSymbol = '') { public isCryptocurrency(aSymbol = '') {
const cryptocurrencySymbol = aSymbol.substring(0, aSymbol.length - 3); const cryptocurrencySymbol = aSymbol.includes('-')
? aSymbol.split('-')[0]
return ( : aSymbol;
aSymbol.endsWith(DEFAULT_CURRENCY) && return this.getCryptocurrencies().includes(cryptocurrencySymbol);
this.getCryptocurrencies().includes(cryptocurrencySymbol)
);
} }
private getCryptocurrencies() { private getCryptocurrencies() {

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

@ -1,6 +1,7 @@
import { RedisCacheModule } from '@ghostfolio/api/app/redis-cache/redis-cache.module'; import { RedisCacheModule } from '@ghostfolio/api/app/redis-cache/redis-cache.module';
import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module';
import { CryptocurrencyModule } from '@ghostfolio/api/services/cryptocurrency/cryptocurrency.module'; import { CryptocurrencyModule } from '@ghostfolio/api/services/cryptocurrency/cryptocurrency.module';
import { CurrencyModule } from '@ghostfolio/api/services/currency/currency.module';
import { AlphaVantageService } from '@ghostfolio/api/services/data-provider/alpha-vantage/alpha-vantage.service'; import { AlphaVantageService } from '@ghostfolio/api/services/data-provider/alpha-vantage/alpha-vantage.service';
import { CoinGeckoService } from '@ghostfolio/api/services/data-provider/coingecko/coingecko.service'; import { CoinGeckoService } from '@ghostfolio/api/services/data-provider/coingecko/coingecko.service';
import { EodHistoricalDataService } from '@ghostfolio/api/services/data-provider/eod-historical-data/eod-historical-data.service'; import { EodHistoricalDataService } from '@ghostfolio/api/services/data-provider/eod-historical-data/eod-historical-data.service';
@ -24,6 +25,7 @@ import { DataProviderService } from './data-provider.service';
@Module({ @Module({
imports: [ imports: [
ConfigurationModule, ConfigurationModule,
CurrencyModule,
CryptocurrencyModule, CryptocurrencyModule,
DataEnhancerModule, DataEnhancerModule,
MarketDataModule, MarketDataModule,

20
apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts

@ -1,4 +1,5 @@
import { CryptocurrencyService } from '@ghostfolio/api/services/cryptocurrency/cryptocurrency.service'; import { CryptocurrencyService } from '@ghostfolio/api/services/cryptocurrency/cryptocurrency.service';
import { CurrencyService } from '@ghostfolio/api/services/currency/currency.service';
import { YahooFinanceDataEnhancerService } from '@ghostfolio/api/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service'; import { YahooFinanceDataEnhancerService } from '@ghostfolio/api/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service';
import { import {
DataProviderInterface, DataProviderInterface,
@ -11,7 +12,6 @@ import {
IDataProviderHistoricalResponse, IDataProviderHistoricalResponse,
IDataProviderResponse IDataProviderResponse
} from '@ghostfolio/api/services/interfaces/interfaces'; } from '@ghostfolio/api/services/interfaces/interfaces';
import { DEFAULT_CURRENCY } from '@ghostfolio/common/config';
import { DATE_FORMAT } from '@ghostfolio/common/helper'; import { DATE_FORMAT } from '@ghostfolio/common/helper';
import { import {
DataProviderInfo, DataProviderInfo,
@ -33,6 +33,7 @@ import { Quote } from 'yahoo-finance2/dist/esm/src/modules/quote';
@Injectable() @Injectable()
export class YahooFinanceService implements DataProviderInterface { export class YahooFinanceService implements DataProviderInterface {
public constructor( public constructor(
private readonly currencyService: CurrencyService,
private readonly cryptocurrencyService: CryptocurrencyService, private readonly cryptocurrencyService: CryptocurrencyService,
private readonly yahooFinanceDataEnhancerService: YahooFinanceDataEnhancerService private readonly yahooFinanceDataEnhancerService: YahooFinanceDataEnhancerService
) {} ) {}
@ -247,21 +248,16 @@ export class YahooFinanceService implements DataProviderInterface {
.filter(({ quoteType, symbol }) => { .filter(({ quoteType, symbol }) => {
return ( return (
(quoteType === 'CRYPTOCURRENCY' && (quoteType === 'CRYPTOCURRENCY' &&
this.cryptocurrencyService.isCryptocurrency( this.currencyService.getCurrencies().some((currency) => {
symbol.replace( return this.cryptocurrencyService.isCryptocurrency(
new RegExp(`-${DEFAULT_CURRENCY}$`), symbol.replace(new RegExp(`-${currency}$`), '')
DEFAULT_CURRENCY );
) })) ||
)) ||
quoteTypes.includes(quoteType) quoteTypes.includes(quoteType)
); );
}) })
.filter(({ quoteType, symbol }) => { .filter(({ quoteType, symbol }) => {
if (quoteType === 'CRYPTOCURRENCY') { if (quoteType === 'FUTURE') {
// Only allow cryptocurrencies in base currency to avoid having redundancy in the database.
// Transactions need to be converted manually to the base currency before
return symbol.includes(DEFAULT_CURRENCY);
} else if (quoteType === 'FUTURE') {
// Allow GC=F, but not MGC=F // Allow GC=F, but not MGC=F
return symbol.length === 4; return symbol.length === 4;
} }

Loading…
Cancel
Save