Browse Source

Add support to import by isin

pull/2593/head
Thomas 2 years ago
parent
commit
daca1e6859
  1. 27
      apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.ts
  2. 38
      apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts

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

@ -10,6 +10,7 @@ import {
Prisma, Prisma,
SymbolProfile SymbolProfile
} from '@prisma/client'; } from '@prisma/client';
import { isISIN } from 'class-validator';
import { countries } from 'countries-list'; import { countries } from 'countries-list';
import yahooFinance from 'yahoo-finance2'; import yahooFinance from 'yahoo-finance2';
import type { Price } from 'yahoo-finance2/dist/esm/src/modules/quoteSummary-iface'; import type { Price } from 'yahoo-finance2/dist/esm/src/modules/quoteSummary-iface';
@ -20,8 +21,18 @@ export class YahooFinanceDataEnhancerService implements DataEnhancerInterface {
private readonly cryptocurrencyService: CryptocurrencyService private readonly cryptocurrencyService: CryptocurrencyService
) {} ) {}
public convertFromYahooFinanceSymbol(aYahooFinanceSymbol: string) { public convertFromYahooFinanceSymbol({
let symbol = aYahooFinanceSymbol.replace( yahooFinanceSymbol,
yahooFinanceSymbolMap = {}
}: {
yahooFinanceSymbol: string;
yahooFinanceSymbolMap?: { [yahooFinanceSymbol: string]: string };
}) {
if (yahooFinanceSymbolMap[yahooFinanceSymbol]) {
return yahooFinanceSymbolMap[yahooFinanceSymbol];
}
let symbol = yahooFinanceSymbol.replace(
new RegExp(`-${DEFAULT_CURRENCY}$`), new RegExp(`-${DEFAULT_CURRENCY}$`),
DEFAULT_CURRENCY DEFAULT_CURRENCY
); );
@ -36,11 +47,12 @@ export class YahooFinanceDataEnhancerService implements DataEnhancerInterface {
/** /**
* Converts a symbol to a Yahoo Finance symbol * Converts a symbol to a Yahoo Finance symbol
* *
* Currency: USDCHF -> USDCHF=X
* Cryptocurrency: BTCUSD -> BTC-USD * Cryptocurrency: BTCUSD -> BTC-USD
* DOGEUSD -> DOGE-USD * DOGEUSD -> DOGE-USD
* Currency: USDCHF -> USDCHF=X
* ISIN: US30303M1027 -> META
*/ */
public convertToYahooFinanceSymbol(aSymbol: string) { public async convertToYahooFinanceSymbol(aSymbol: string) {
if ( if (
aSymbol.includes(DEFAULT_CURRENCY) && aSymbol.includes(DEFAULT_CURRENCY) &&
aSymbol.length > DEFAULT_CURRENCY.length aSymbol.length > DEFAULT_CURRENCY.length
@ -65,6 +77,11 @@ export class YahooFinanceDataEnhancerService implements DataEnhancerInterface {
`-${DEFAULT_CURRENCY}` `-${DEFAULT_CURRENCY}`
); );
} }
} else if (isISIN(aSymbol)) {
try {
const { quotes } = await yahooFinance.search(aSymbol);
return quotes[0].symbol;
} catch {}
} }
return aSymbol; return aSymbol;
@ -156,7 +173,7 @@ export class YahooFinanceDataEnhancerService implements DataEnhancerInterface {
const response: Partial<SymbolProfile> = {}; const response: Partial<SymbolProfile> = {};
try { try {
const symbol = this.convertToYahooFinanceSymbol(aSymbol); const symbol = await this.convertToYahooFinanceSymbol(aSymbol);
const assetProfile = await yahooFinance.quoteSummary(symbol, { const assetProfile = await yahooFinance.quoteSummary(symbol, {
modules: ['price', 'summaryProfile', 'topHoldings'] modules: ['price', 'summaryProfile', 'topHoldings']
}); });

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

@ -30,16 +30,17 @@ export class YahooFinanceService implements DataProviderInterface {
public async getAssetProfile( public async getAssetProfile(
aSymbol: string aSymbol: string
): Promise<Partial<SymbolProfile>> { ): Promise<Partial<SymbolProfile>> {
const { assetClass, assetSubClass, currency, name } = let symbol = aSymbol;
await this.yahooFinanceDataEnhancerService.getAssetProfile(aSymbol); let { assetClass, assetSubClass, currency, name } =
await this.yahooFinanceDataEnhancerService.getAssetProfile(symbol);
return { return {
assetClass, assetClass,
assetSubClass, assetSubClass,
currency, currency,
name, name,
dataSource: this.getName(), symbol,
symbol: aSymbol dataSource: this.getName()
}; };
} }
@ -60,7 +61,7 @@ export class YahooFinanceService implements DataProviderInterface {
try { try {
const historicalResult = await yahooFinance.historical( const historicalResult = await yahooFinance.historical(
this.yahooFinanceDataEnhancerService.convertToYahooFinanceSymbol( await this.yahooFinanceDataEnhancerService.convertToYahooFinanceSymbol(
symbol symbol
), ),
{ {
@ -112,7 +113,7 @@ export class YahooFinanceService implements DataProviderInterface {
try { try {
const historicalResult = await yahooFinance.historical( const historicalResult = await yahooFinance.historical(
this.yahooFinanceDataEnhancerService.convertToYahooFinanceSymbol( await this.yahooFinanceDataEnhancerService.convertToYahooFinanceSymbol(
aSymbol aSymbol
), ),
{ {
@ -167,9 +168,17 @@ export class YahooFinanceService implements DataProviderInterface {
return response; return response;
} }
const yahooFinanceSymbols = symbols.map((symbol) => const yahooFinanceSymbols: string[] = [];
this.yahooFinanceDataEnhancerService.convertToYahooFinanceSymbol(symbol) const yahooFinanceSymbolMap: { [yahooFinanceSymbol: string]: string } = {};
for (const symbol of symbols) {
const yahooFinanceSymbol =
await this.yahooFinanceDataEnhancerService.convertToYahooFinanceSymbol(
symbol
); );
yahooFinanceSymbolMap[yahooFinanceSymbol] = symbol;
yahooFinanceSymbols.push(yahooFinanceSymbol);
}
try { try {
let quotes: Pick< let quotes: Pick<
@ -193,9 +202,10 @@ export class YahooFinanceService implements DataProviderInterface {
for (const quote of quotes) { for (const quote of quotes) {
// Convert symbols back // Convert symbols back
const symbol = const symbol =
this.yahooFinanceDataEnhancerService.convertFromYahooFinanceSymbol( this.yahooFinanceDataEnhancerService.convertFromYahooFinanceSymbol({
quote.symbol yahooFinanceSymbolMap,
); yahooFinanceSymbol: quote.symbol
});
response[symbol] = { response[symbol] = {
currency: quote.currency, currency: quote.currency,
@ -332,9 +342,9 @@ export class YahooFinanceService implements DataProviderInterface {
}); });
const symbol = const symbol =
this.yahooFinanceDataEnhancerService.convertFromYahooFinanceSymbol( this.yahooFinanceDataEnhancerService.convertFromYahooFinanceSymbol({
marketDataItem.symbol yahooFinanceSymbol: marketDataItem.symbol
); });
const { assetClass, assetSubClass } = const { assetClass, assetSubClass } =
this.yahooFinanceDataEnhancerService.parseAssetClass({ this.yahooFinanceDataEnhancerService.parseAssetClass({

Loading…
Cancel
Save