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 4185b2e37..3d07c833b 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 @@ -20,10 +20,7 @@ import Big from 'big.js'; import { countries } from 'countries-list'; import { addDays, format, isSameDay } from 'date-fns'; import yahooFinance from 'yahoo-finance2'; -import type { - Price, - QuoteSummaryResult -} from 'yahoo-finance2/dist/esm/src/modules/quoteSummary-iface'; +import type { Price } from 'yahoo-finance2/dist/esm/src/modules/quoteSummary-iface'; @Injectable() export class YahooFinanceService implements DataProviderInterface { @@ -92,7 +89,12 @@ export class YahooFinanceService implements DataProviderInterface { response.assetSubClass = assetSubClass; response.currency = assetProfile.price.currency; response.dataSource = this.getName(); - response.name = this.formatName(assetProfile); + response.name = this.formatName({ + longName: assetProfile.price.longName, + quoteType: assetProfile.price.quoteType, + shortName: assetProfile.price.shortName, + symbol: assetProfile.price.symbol + }); response.symbol = aSymbol; if ( @@ -264,6 +266,9 @@ export class YahooFinanceService implements DataProviderInterface { // 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(baseCurrency); + } else if (quoteType === 'FUTURE') { + // Allow GC=F, but not MGC=F + return symbol.length === 4; } return true; @@ -288,7 +293,12 @@ export class YahooFinanceService implements DataProviderInterface { symbol, currency: marketDataItem.currency, dataSource: this.getName(), - name: quote?.longname || quote?.shortname || symbol + name: this.formatName({ + longName: quote.longname, + quoteType: quote.quoteType, + shortName: quote.shortname, + symbol: quote.symbol + }) }); } } catch (error) { @@ -298,8 +308,18 @@ export class YahooFinanceService implements DataProviderInterface { return { items }; } - private formatName(aAssetProfile: QuoteSummaryResult) { - let name = aAssetProfile.price.longName; + private formatName({ + longName, + quoteType, + shortName, + symbol + }: { + longName: Price['longName']; + quoteType: Price['quoteType']; + shortName: Price['shortName']; + symbol: Price['symbol']; + }) { + let name = longName; if (name) { name = name.replace('iShares ETF (CH) - ', ''); @@ -314,7 +334,12 @@ export class YahooFinanceService implements DataProviderInterface { name = name.replace('Xtrackers (IE) Plc - ', ''); } - return name || aAssetProfile.price.shortName || aAssetProfile.price.symbol; + if (quoteType === 'FUTURE') { + // "Gold Jun 22" -> "Gold" + name = shortName?.slice(0, -6); + } + + return name || shortName || symbol; } private parseAssetClass(aPrice: Price): { @@ -339,6 +364,7 @@ export class YahooFinanceService implements DataProviderInterface { break; case 'future': assetClass = AssetClass.COMMODITY; + assetSubClass = AssetSubClass.COMMODITY; break; case 'mutualfund': assetClass = AssetClass.EQUITY;