Browse Source

Bugfix/fix asset class parsing in Financial Modeling Prep service for exchange rates (#4559)

* Fix the asset class parsing

* Update changelog
pull/4561/head
Thomas Kaul 4 days ago
committed by GitHub
parent
commit
b6f87e46a7
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 1
      CHANGELOG.md
  2. 5
      apps/api/src/services/data-provider/alpha-vantage/alpha-vantage.service.ts
  3. 23
      apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts

1
CHANGELOG.md

@ -17,6 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Fixed ### Fixed
- Fixed the functionality to open an asset profile of a custom currency in the admin control panel - Fixed the functionality to open an asset profile of a custom currency in the admin control panel
- Fixed the asset class parsing in the _Financial Modeling Prep_ service for exchange rates
## 2.152.1 - 2025-04-17 ## 2.152.1 - 2025-04-17

5
apps/api/src/services/data-provider/alpha-vantage/alpha-vantage.service.ts

@ -11,6 +11,7 @@ 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,
@ -72,7 +73,9 @@ export class AlphaVantageService implements DataProviderInterface {
const historicalData: { const historicalData: {
[symbol: string]: IAlphaVantageHistoricalResponse[]; [symbol: string]: IAlphaVantageHistoricalResponse[];
} = await this.alphaVantage.crypto.daily( } = await this.alphaVantage.crypto.daily(
symbol.substring(0, symbol.length - 3).toLowerCase(), symbol
.substring(0, symbol.length - DEFAULT_CURRENCY.length)
.toLowerCase(),
'usd' 'usd'
); );

23
apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts

@ -12,8 +12,11 @@ import {
IDataProviderHistoricalResponse, IDataProviderHistoricalResponse,
IDataProviderResponse IDataProviderResponse
} from '@ghostfolio/api/services/interfaces/interfaces'; } from '@ghostfolio/api/services/interfaces/interfaces';
import { REPLACE_NAME_PARTS } from '@ghostfolio/common/config'; import {
import { DATE_FORMAT, parseDate } from '@ghostfolio/common/helper'; DEFAULT_CURRENCY,
REPLACE_NAME_PARTS
} from '@ghostfolio/common/config';
import { DATE_FORMAT, isCurrency, parseDate } from '@ghostfolio/common/helper';
import { import {
DataProviderInfo, DataProviderInfo,
LookupItem, LookupItem,
@ -67,7 +70,15 @@ export class FinancialModelingPrepService implements DataProviderInterface {
}; };
try { try {
if (this.cryptocurrencyService.isCryptocurrency(symbol)) { if (
isCurrency(symbol.substring(0, symbol.length - DEFAULT_CURRENCY.length))
) {
response.assetClass = AssetClass.LIQUIDITY;
response.assetSubClass = AssetSubClass.CASH;
response.currency = symbol.substring(
symbol.length - DEFAULT_CURRENCY.length
);
} else if (this.cryptocurrencyService.isCryptocurrency(symbol)) {
const [quote] = await fetch( const [quote] = await fetch(
`${this.URL}/quote/${symbol}?apikey=${this.apiKey}`, `${this.URL}/quote/${symbol}?apikey=${this.apiKey}`,
{ {
@ -77,7 +88,9 @@ export class FinancialModelingPrepService implements DataProviderInterface {
response.assetClass = AssetClass.LIQUIDITY; response.assetClass = AssetClass.LIQUIDITY;
response.assetSubClass = AssetSubClass.CRYPTOCURRENCY; response.assetSubClass = AssetSubClass.CRYPTOCURRENCY;
response.currency = symbol.substring(symbol.length - 3); response.currency = symbol.substring(
symbol.length - DEFAULT_CURRENCY.length
);
response.name = quote.name; response.name = quote.name;
} else { } else {
const [assetProfile] = await fetch( const [assetProfile] = await fetch(
@ -472,6 +485,7 @@ export class FinancialModelingPrepService implements DataProviderInterface {
let assetClass: AssetClass; let assetClass: AssetClass;
let assetSubClass: AssetSubClass; let assetSubClass: AssetSubClass;
if (profile) {
if (profile.isEtf) { if (profile.isEtf) {
assetClass = AssetClass.EQUITY; assetClass = AssetClass.EQUITY;
assetSubClass = AssetSubClass.ETF; assetSubClass = AssetSubClass.ETF;
@ -482,6 +496,7 @@ export class FinancialModelingPrepService implements DataProviderInterface {
assetClass = AssetClass.EQUITY; assetClass = AssetClass.EQUITY;
assetSubClass = AssetSubClass.STOCK; assetSubClass = AssetSubClass.STOCK;
} }
}
return { assetClass, assetSubClass }; return { assetClass, assetSubClass };
} }

Loading…
Cancel
Save