From 1d011747c729607a21eabe70ba7ac691e67d05fa Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Sat, 29 Nov 2025 16:54:05 +0100
Subject: [PATCH 1/8] Task/improve usability of actions in various tables
(#5992)
* Improve usability of actions
---
.../access-table/access-table.component.html | 2 +-
.../app/components/admin-jobs/admin-jobs.html | 6 ++++--
.../admin-market-data/admin-market-data.html | 2 +-
.../admin-platform.component.html | 2 +-
.../admin-tag/admin-tag.component.html | 2 +-
.../components/admin-users/admin-users.html | 4 +++-
.../accounts-table.component.html | 6 +++---
.../activities-table.component.html | 18 +++++++++++-------
8 files changed, 25 insertions(+), 17 deletions(-)
diff --git a/apps/client/src/app/components/access-table/access-table.component.html b/apps/client/src/app/components/access-table/access-table.component.html
index abeda6de8..cb41904d3 100644
--- a/apps/client/src/app/components/access-table/access-table.component.html
+++ b/apps/client/src/app/components/access-table/access-table.component.html
@@ -73,7 +73,7 @@
}
diff --git a/apps/client/src/app/components/admin-jobs/admin-jobs.html b/apps/client/src/app/components/admin-jobs/admin-jobs.html
index 14f1b211b..a82294001 100644
--- a/apps/client/src/app/components/admin-jobs/admin-jobs.html
+++ b/apps/client/src/app/components/admin-jobs/admin-jobs.html
@@ -205,14 +205,16 @@
@if (hasPermissionToImpersonateAllUsers) {
diff --git a/libs/ui/src/lib/accounts-table/accounts-table.component.html b/libs/ui/src/lib/accounts-table/accounts-table.component.html
index c5ebaa657..d127b4bf3 100644
--- a/libs/ui/src/lib/accounts-table/accounts-table.component.html
+++ b/libs/ui/src/lib/accounts-table/accounts-table.component.html
@@ -7,7 +7,7 @@
(click)="onTransferBalance()"
>
- Transfer Cash Balance...
+ Transfer Cash Balance...
}
@@ -304,13 +304,13 @@
- View Details
+ View Details...
- Edit
+ Edit...
diff --git a/libs/ui/src/lib/activities-table/activities-table.component.html b/libs/ui/src/lib/activities-table/activities-table.component.html
index e9bebaa16..b8e1882d4 100644
--- a/libs/ui/src/lib/activities-table/activities-table.component.html
+++ b/libs/ui/src/lib/activities-table/activities-table.component.html
@@ -6,7 +6,7 @@
(click)="onImport()"
>
- Import Activities...
+ Import Activities...
@if (hasPermissionToExportActivities) {
- Import Dividends...
+ Import Dividends...
@if (hasPermissionToExportActivities) {
@@ -379,7 +379,9 @@
>
- Import Activities...
+ Import Activities...
}
@@ -391,7 +393,9 @@
>
- Import Dividends...
+ Import Dividends...
}
@@ -443,20 +447,20 @@
- View Holding
+ View Holding...
}
- Edit
+ Edit...
- Clone
+ Clone...
Date: Sat, 29 Nov 2025 17:10:53 +0100
Subject: [PATCH 2/8] Task/upgrade prettier to version 3.7.2 (#5999)
* Upgrade prettier to version 3.7.2
* Update changelog
---
CHANGELOG.md | 1 +
package-lock.json | 8 ++++----
package.json | 2 +-
3 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4236570c3..21a104ea4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Removed the _Cypress_ testing setup
- Eliminated `uuid` in favor of using `randomUUID` from `node:crypto`
- Upgraded `color` from version `5.0.0` to `5.0.3`
+- Upgraded `prettier` from version `3.6.2` to `3.7.2`
### Fixed
diff --git a/package-lock.json b/package-lock.json
index f765b52fd..8b847c349 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -140,7 +140,7 @@
"jest-environment-jsdom": "29.7.0",
"jest-preset-angular": "14.6.0",
"nx": "21.5.1",
- "prettier": "3.6.2",
+ "prettier": "3.7.2",
"prettier-plugin-organize-attributes": "1.0.0",
"prisma": "6.19.0",
"react": "18.2.0",
@@ -35749,9 +35749,9 @@
}
},
"node_modules/prettier": {
- "version": "3.6.2",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz",
- "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==",
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.2.tgz",
+ "integrity": "sha512-n3HV2J6QhItCXndGa3oMWvWFAgN1ibnS7R9mt6iokScBOC0Ul9/iZORmU2IWUMcyAQaMPjTlY3uT34TqocUxMA==",
"dev": true,
"license": "MIT",
"bin": {
diff --git a/package.json b/package.json
index 85b1ed48b..0cfcf3bb0 100644
--- a/package.json
+++ b/package.json
@@ -184,7 +184,7 @@
"jest-environment-jsdom": "29.7.0",
"jest-preset-angular": "14.6.0",
"nx": "21.5.1",
- "prettier": "3.6.2",
+ "prettier": "3.7.2",
"prettier-plugin-organize-attributes": "1.0.0",
"prisma": "6.19.0",
"react": "18.2.0",
From 81cde56add62441d93df9c49ad9462e4998f8782 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Sat, 29 Nov 2025 17:13:09 +0100
Subject: [PATCH 3/8] Release 2.220.0 (#6001)
---
CHANGELOG.md | 2 +-
package-lock.json | 4 ++--
package.json | 2 +-
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 21a104ea4..4cbc42211 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
-## Unreleased
+## 2.220.0 - 2025-11-29
### Changed
diff --git a/package-lock.json b/package-lock.json
index 8b847c349..9eb7103d0 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "ghostfolio",
- "version": "2.219.0",
+ "version": "2.220.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "ghostfolio",
- "version": "2.219.0",
+ "version": "2.220.0",
"hasInstallScript": true,
"license": "AGPL-3.0",
"dependencies": {
diff --git a/package.json b/package.json
index 0cfcf3bb0..a3bab9ab1 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "ghostfolio",
- "version": "2.219.0",
+ "version": "2.220.0",
"homepage": "https://ghostfol.io",
"license": "AGPL-3.0",
"repository": "https://github.com/ghostfolio/ghostfolio",
From 418237663688e5b0945a29e6c30904140a8284e3 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Sat, 29 Nov 2025 20:23:52 +0100
Subject: [PATCH 4/8] Feature/extend Storybook story of portfolio proportion
chart component by story in percentage (#6007)
* Extend Storybook story
* Update changelog
---
CHANGELOG.md | 6 +++
...olio-proportion-chart.component.stories.ts | 46 ++++++++++++++++++-
2 files changed, 51 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4cbc42211..cb145bb14 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+## Unreleased
+
+### Changed
+
+- Extended the _Storybook_ stories of the portfolio proportion chart component by a story using percentage values
+
## 2.220.0 - 2025-11-29
### Changed
diff --git a/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.stories.ts b/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.stories.ts
index 37010954a..b5a3d6819 100644
--- a/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.stories.ts
+++ b/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.stories.ts
@@ -22,7 +22,7 @@ export default {
type Story = StoryObj;
-export const Simple: Story = {
+export const Default: Story = {
args: {
baseCurrency: 'USD',
data: {
@@ -37,3 +37,47 @@ export const Simple: Story = {
locale: 'en-US'
}
};
+
+export const InPercentage: Story = {
+ args: {
+ data: {
+ US: { name: 'United States', value: 0.6515000000000001 },
+ NL: { name: 'Netherlands', value: 0.006 },
+ DE: { name: 'Germany', value: 0.0031 },
+ GB: { name: 'United Kingdom', value: 0.0124 },
+ CA: { name: 'Canada', value: 0.0247 },
+ IE: { name: 'Ireland', value: 0.0112 },
+ SE: { name: 'Sweden', value: 0.0016 },
+ ES: { name: 'Spain', value: 0.0042 },
+ AU: { name: 'Australia', value: 0.0022 },
+ FR: { name: 'France', value: 0.0012 },
+ UY: { name: 'Uruguay', value: 0.0012 },
+ CH: { name: 'Switzerland', value: 0.004099999999999999 },
+ LU: { name: 'Luxembourg', value: 0.0012 },
+ BR: { name: 'Brazil', value: 0.0006 },
+ HK: { name: 'Hong Kong', value: 0.0006 },
+ IT: { name: 'Italy', value: 0.0005 },
+ CN: { name: 'China', value: 0.002 },
+ KR: { name: 'South Korea', value: 0.0006 },
+ BM: { name: 'Bermuda', value: 0.0011 },
+ ZA: { name: 'South Africa', value: 0.0004 },
+ SG: { name: 'Singapore', value: 0.0003 },
+ IL: { name: 'Israel', value: 0.001 },
+ DK: { name: 'Denmark', value: 0.0002 },
+ PE: { name: 'Peru', value: 0.0002 },
+ NO: { name: 'Norway', value: 0.0002 },
+ KY: { name: 'Cayman Islands', value: 0.0001 },
+ IN: { name: 'India', value: 0.0001 },
+ TW: { name: 'Taiwan', value: 0.0002 },
+ GR: { name: 'Greece', value: 0.0001 },
+ CL: { name: 'Chile', value: 0.0001 },
+ MX: { name: 'Mexico', value: 0 },
+ RU: { name: 'Russia', value: 0 },
+ IS: { name: 'Iceland', value: 0 },
+ JP: { name: 'Japan', value: 0 },
+ BE: { name: 'Belgium', value: 0 }
+ },
+ isInPercent: true,
+ keys: ['name']
+ }
+};
From a2498a54a6ac213637bfb08c2ac0df4fbdd2aa6a Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Sun, 30 Nov 2025 09:18:55 +0100
Subject: [PATCH 5/8] Bugfix/countries in FMP service (#6005)
* Introduce countries mapping
* Update changelog
---
CHANGELOG.md | 4 ++++
.../financial-modeling-prep.service.ts | 22 ++++++++++++++-----
2 files changed, 21 insertions(+), 5 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index cb145bb14..f60d2434c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -11,6 +11,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Extended the _Storybook_ stories of the portfolio proportion chart component by a story using percentage values
+### Fixed
+
+- Improved the country weightings in the _Financial Modeling Prep_ service
+
## 2.220.0 - 2025-11-29
### Changed
diff --git a/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts b/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts
index 6fe928d7a..fe8c4ecd6 100644
--- a/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts
+++ b/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts
@@ -44,6 +44,12 @@ import {
@Injectable()
export class FinancialModelingPrepService implements DataProviderInterface {
+ private static countriesMapping = {
+ 'Korea (the Republic of)': 'South Korea',
+ 'Russian Federation': 'Russia',
+ 'Taiwan (Province of China)': 'Taiwan'
+ };
+
private apiKey: string;
public constructor(
@@ -121,12 +127,19 @@ export class FinancialModelingPrepService implements DataProviderInterface {
}
).then((res) => res.json());
- response.countries = etfCountryWeightings.map(
- ({ country: countryName, weightPercentage }) => {
+ response.countries = etfCountryWeightings
+ .filter(({ country: countryName }) => {
+ return countryName.toLowerCase() !== 'other';
+ })
+ .map(({ country: countryName, weightPercentage }) => {
let countryCode: string;
for (const [code, country] of Object.entries(countries)) {
- if (country.name === countryName) {
+ if (
+ country.name === countryName ||
+ country.name ===
+ FinancialModelingPrepService.countriesMapping[countryName]
+ ) {
countryCode = code;
break;
}
@@ -136,8 +149,7 @@ export class FinancialModelingPrepService implements DataProviderInterface {
code: countryCode,
weight: parseFloat(weightPercentage.slice(0, -1)) / 100
};
- }
- );
+ });
const etfHoldings = await fetch(
`${this.getUrl({ version: 'stable' })}/etf/holdings?symbol=${symbol}&apikey=${this.apiKey}`,
From ea442cc55f7ed6fa1a25f3548a3972d3d522cf02 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Sun, 30 Nov 2025 10:26:06 +0100
Subject: [PATCH 6/8] Task/upgrade @internationalized/number to version 3.6.5
(#6000)
* Upgrade @internationalized/number to version 3.6.5
* Update changelog
---
CHANGELOG.md | 1 +
package-lock.json | 8 ++++----
package.json | 2 +-
3 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index f60d2434c..ae3f8d8f2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed
- Extended the _Storybook_ stories of the portfolio proportion chart component by a story using percentage values
+- Upgraded `@internationalized/number` from version `3.6.3` to `3.6.5`
### Fixed
diff --git a/package-lock.json b/package-lock.json
index 9eb7103d0..f3f9f3824 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -23,7 +23,7 @@
"@angular/service-worker": "20.2.4",
"@codewithdan/observable-store": "2.2.15",
"@date-fns/utc": "2.1.0",
- "@internationalized/number": "3.6.3",
+ "@internationalized/number": "3.6.5",
"@ionic/angular": "8.7.8",
"@keyv/redis": "4.4.0",
"@nestjs/bull": "11.0.4",
@@ -6031,9 +6031,9 @@
}
},
"node_modules/@internationalized/number": {
- "version": "3.6.3",
- "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.6.3.tgz",
- "integrity": "sha512-p+Zh1sb6EfrfVaS86jlHGQ9HA66fJhV9x5LiE5vCbZtXEHAuhcmUZUdZ4WrFpUBfNalr2OkAJI5AcKEQF+Lebw==",
+ "version": "3.6.5",
+ "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.6.5.tgz",
+ "integrity": "sha512-6hY4Kl4HPBvtfS62asS/R22JzNNy8vi/Ssev7x6EobfCp+9QIB2hKvI2EtbdJ0VSQacxVNtqhE/NmF/NZ0gm6g==",
"license": "Apache-2.0",
"dependencies": {
"@swc/helpers": "^0.5.0"
diff --git a/package.json b/package.json
index a3bab9ab1..6cf778ee2 100644
--- a/package.json
+++ b/package.json
@@ -67,7 +67,7 @@
"@angular/service-worker": "20.2.4",
"@codewithdan/observable-store": "2.2.15",
"@date-fns/utc": "2.1.0",
- "@internationalized/number": "3.6.3",
+ "@internationalized/number": "3.6.5",
"@ionic/angular": "8.7.8",
"@keyv/redis": "4.4.0",
"@nestjs/bull": "11.0.4",
From 388f82974140ef5bbae93df887944e5911c24218 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Sun, 30 Nov 2025 10:43:00 +0100
Subject: [PATCH 7/8] Task/refactor query parameters in data provider services
(#6011)
* Refactor query parameters
* Update changelog
---
CHANGELOG.md | 1 +
.../coingecko/coingecko.service.ts | 36 ++++++----
.../eod-historical-data.service.ts | 45 ++++++++-----
.../financial-modeling-prep.service.ts | 65 +++++++++++++++----
.../ghostfolio/ghostfolio.service.ts | 34 +++++++---
5 files changed, 132 insertions(+), 49 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ae3f8d8f2..2c1d50d91 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed
+- Refactored the API query parameters in various data provider services
- Extended the _Storybook_ stories of the portfolio proportion chart component by a story using percentage values
- Upgraded `@internationalized/number` from version `3.6.3` to `3.6.5`
diff --git a/apps/api/src/services/data-provider/coingecko/coingecko.service.ts b/apps/api/src/services/data-provider/coingecko/coingecko.service.ts
index 4123cc6cc..d0d96acac 100644
--- a/apps/api/src/services/data-provider/coingecko/coingecko.service.ts
+++ b/apps/api/src/services/data-provider/coingecko/coingecko.service.ts
@@ -110,12 +110,14 @@ export class CoinGeckoService implements DataProviderInterface {
[symbol: string]: { [date: string]: DataProviderHistoricalResponse };
}> {
try {
+ const queryParams = new URLSearchParams({
+ from: getUnixTime(from).toString(),
+ to: getUnixTime(to).toString(),
+ vs_currency: DEFAULT_CURRENCY.toLowerCase()
+ });
+
const { error, prices, status } = await fetch(
- `${
- this.apiUrl
- }/coins/${symbol}/market_chart/range?vs_currency=${DEFAULT_CURRENCY.toLowerCase()}&from=${getUnixTime(
- from
- )}&to=${getUnixTime(to)}`,
+ `${this.apiUrl}/coins/${symbol}/market_chart/range?${queryParams.toString()}`,
{
headers: this.headers,
signal: AbortSignal.timeout(requestTimeout)
@@ -172,10 +174,13 @@ export class CoinGeckoService implements DataProviderInterface {
}
try {
+ const queryParams = new URLSearchParams({
+ ids: symbols.join(','),
+ vs_currencies: DEFAULT_CURRENCY.toLowerCase()
+ });
+
const quotes = await fetch(
- `${this.apiUrl}/simple/price?ids=${symbols.join(
- ','
- )}&vs_currencies=${DEFAULT_CURRENCY.toLowerCase()}`,
+ `${this.apiUrl}/simple/price?${queryParams.toString()}`,
{
headers: this.headers,
signal: AbortSignal.timeout(requestTimeout)
@@ -219,10 +224,17 @@ export class CoinGeckoService implements DataProviderInterface {
let items: LookupItem[] = [];
try {
- const { coins } = await fetch(`${this.apiUrl}/search?query=${query}`, {
- headers: this.headers,
- signal: AbortSignal.timeout(requestTimeout)
- }).then((res) => res.json());
+ const queryParams = new URLSearchParams({
+ query
+ });
+
+ const { coins } = await fetch(
+ `${this.apiUrl}/search?${queryParams.toString()}`,
+ {
+ headers: this.headers,
+ signal: AbortSignal.timeout(requestTimeout)
+ }
+ ).then((res) => res.json());
items = coins.map(({ id: symbol, name }) => {
return {
diff --git a/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts b/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts
index b93ca492a..cd20fca44 100644
--- a/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts
+++ b/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts
@@ -96,17 +96,19 @@ export class EodHistoricalDataService implements DataProviderInterface {
}
try {
+ const queryParams = new URLSearchParams({
+ api_token: this.apiKey,
+ fmt: 'json',
+ from: format(from, DATE_FORMAT),
+ to: format(to, DATE_FORMAT)
+ });
+
const response: {
[date: string]: DataProviderHistoricalResponse;
} = {};
const historicalResult = await fetch(
- `${this.URL}/div/${symbol}?api_token=${
- this.apiKey
- }&fmt=json&from=${format(from, DATE_FORMAT)}&to=${format(
- to,
- DATE_FORMAT
- )}`,
+ `${this.URL}/div/${symbol}?${queryParams.toString()}`,
{
signal: AbortSignal.timeout(requestTimeout)
}
@@ -144,13 +146,16 @@ export class EodHistoricalDataService implements DataProviderInterface {
symbol = this.convertToEodSymbol(symbol);
try {
+ const queryParams = new URLSearchParams({
+ api_token: this.apiKey,
+ fmt: 'json',
+ from: format(from, DATE_FORMAT),
+ period: granularity,
+ to: format(to, DATE_FORMAT)
+ });
+
const response = await fetch(
- `${this.URL}/eod/${symbol}?api_token=${
- this.apiKey
- }&fmt=json&from=${format(from, DATE_FORMAT)}&to=${format(
- to,
- DATE_FORMAT
- )}&period=${granularity}`,
+ `${this.URL}/eod/${symbol}?${queryParams.toString()}`,
{
signal: AbortSignal.timeout(requestTimeout)
}
@@ -208,10 +213,14 @@ export class EodHistoricalDataService implements DataProviderInterface {
});
try {
+ const queryParams = new URLSearchParams({
+ api_token: this.apiKey,
+ fmt: 'json',
+ s: eodHistoricalDataSymbols.join(',')
+ });
+
const realTimeResponse = await fetch(
- `${this.URL}/real-time/${eodHistoricalDataSymbols[0]}?api_token=${
- this.apiKey
- }&fmt=json&s=${eodHistoricalDataSymbols.join(',')}`,
+ `${this.URL}/real-time/${eodHistoricalDataSymbols[0]}?${queryParams.toString()}`,
{
signal: AbortSignal.timeout(requestTimeout)
}
@@ -413,8 +422,12 @@ export class EodHistoricalDataService implements DataProviderInterface {
})[] = [];
try {
+ const queryParams = new URLSearchParams({
+ api_token: this.apiKey
+ });
+
const response = await fetch(
- `${this.URL}/search/${query}?api_token=${this.apiKey}`,
+ `${this.URL}/search/${query}?${queryParams.toString()}`,
{
signal: AbortSignal.timeout(requestTimeout)
}
diff --git a/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts b/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts
index fe8c4ecd6..27f462c90 100644
--- a/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts
+++ b/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts
@@ -85,8 +85,13 @@ export class FinancialModelingPrepService implements DataProviderInterface {
symbol.length - DEFAULT_CURRENCY.length
);
} else if (this.cryptocurrencyService.isCryptocurrency(symbol)) {
+ const queryParams = new URLSearchParams({
+ symbol,
+ apikey: this.apiKey
+ });
+
const [quote] = await fetch(
- `${this.getUrl({ version: 'stable' })}/quote?symbol=${symbol}&apikey=${this.apiKey}`,
+ `${this.getUrl({ version: 'stable' })}/quote?${queryParams.toString()}`,
{
signal: AbortSignal.timeout(requestTimeout)
}
@@ -99,8 +104,13 @@ export class FinancialModelingPrepService implements DataProviderInterface {
);
response.name = quote.name;
} else {
+ const queryParams = new URLSearchParams({
+ symbol,
+ apikey: this.apiKey
+ });
+
const [assetProfile] = await fetch(
- `${this.getUrl({ version: 'stable' })}/profile?symbol=${symbol}&apikey=${this.apiKey}`,
+ `${this.getUrl({ version: 'stable' })}/profile?${queryParams.toString()}`,
{
signal: AbortSignal.timeout(requestTimeout)
}
@@ -120,8 +130,13 @@ export class FinancialModelingPrepService implements DataProviderInterface {
assetSubClass === AssetSubClass.ETF ||
assetSubClass === AssetSubClass.MUTUALFUND
) {
+ const queryParams = new URLSearchParams({
+ symbol,
+ apikey: this.apiKey
+ });
+
const etfCountryWeightings = await fetch(
- `${this.getUrl({ version: 'stable' })}/etf/country-weightings?symbol=${symbol}&apikey=${this.apiKey}`,
+ `${this.getUrl({ version: 'stable' })}/etf/country-weightings?${queryParams.toString()}`,
{
signal: AbortSignal.timeout(requestTimeout)
}
@@ -152,7 +167,7 @@ export class FinancialModelingPrepService implements DataProviderInterface {
});
const etfHoldings = await fetch(
- `${this.getUrl({ version: 'stable' })}/etf/holdings?symbol=${symbol}&apikey=${this.apiKey}`,
+ `${this.getUrl({ version: 'stable' })}/etf/holdings?${queryParams.toString()}`,
{
signal: AbortSignal.timeout(requestTimeout)
}
@@ -171,7 +186,7 @@ export class FinancialModelingPrepService implements DataProviderInterface {
);
const [etfInformation] = await fetch(
- `${this.getUrl({ version: 'stable' })}/etf/info?symbol=${symbol}&apikey=${this.apiKey}`,
+ `${this.getUrl({ version: 'stable' })}/etf/info?${queryParams.toString()}`,
{
signal: AbortSignal.timeout(requestTimeout)
}
@@ -182,7 +197,7 @@ export class FinancialModelingPrepService implements DataProviderInterface {
}
const etfSectorWeightings = await fetch(
- `${this.getUrl({ version: 'stable' })}/etf/sector-weightings?symbol=${symbol}&apikey=${this.apiKey}`,
+ `${this.getUrl({ version: 'stable' })}/etf/sector-weightings?${queryParams.toString()}`,
{
signal: AbortSignal.timeout(requestTimeout)
}
@@ -254,12 +269,17 @@ export class FinancialModelingPrepService implements DataProviderInterface {
}
try {
+ const queryParams = new URLSearchParams({
+ symbol,
+ apikey: this.apiKey
+ });
+
const response: {
[date: string]: DataProviderHistoricalResponse;
} = {};
const dividends = await fetch(
- `${this.getUrl({ version: 'stable' })}/dividends?symbol=${symbol}&apikey=${this.apiKey}`,
+ `${this.getUrl({ version: 'stable' })}/dividends?${queryParams.toString()}`,
{
signal: AbortSignal.timeout(requestTimeout)
}
@@ -319,8 +339,15 @@ export class FinancialModelingPrepService implements DataProviderInterface {
? addYears(currentFrom, MAX_YEARS_PER_REQUEST)
: to;
+ const queryParams = new URLSearchParams({
+ symbol,
+ apikey: this.apiKey,
+ from: format(currentFrom, DATE_FORMAT),
+ to: format(currentTo, DATE_FORMAT)
+ });
+
const historical = await fetch(
- `${this.getUrl({ version: 'stable' })}/historical-price-eod/full?symbol=${symbol}&apikey=${this.apiKey}&from=${format(currentFrom, DATE_FORMAT)}&to=${format(currentTo, DATE_FORMAT)}`,
+ `${this.getUrl({ version: 'stable' })}/historical-price-eod/full?${queryParams.toString()}`,
{
signal: AbortSignal.timeout(requestTimeout)
}
@@ -375,6 +402,11 @@ export class FinancialModelingPrepService implements DataProviderInterface {
[symbol: string]: Pick;
} = {};
+ const queryParams = new URLSearchParams({
+ symbols: symbols.join(','),
+ apikey: this.apiKey
+ });
+
const [assetProfileResolutions, quotes] = await Promise.all([
this.prismaService.assetProfileResolution.findMany({
where: {
@@ -383,7 +415,7 @@ export class FinancialModelingPrepService implements DataProviderInterface {
}
}),
fetch(
- `${this.getUrl({ version: 'stable' })}/batch-quote-short?symbols=${symbols.join(',')}&apikey=${this.apiKey}`,
+ `${this.getUrl({ version: 'stable' })}/batch-quote-short?${queryParams.toString()}`,
{
signal: AbortSignal.timeout(requestTimeout)
}
@@ -475,12 +507,18 @@ export class FinancialModelingPrepService implements DataProviderInterface {
const assetProfileBySymbolMap: {
[symbol: string]: Partial;
} = {};
+
let items: LookupItem[] = [];
try {
if (isISIN(query?.toUpperCase())) {
+ const queryParams = new URLSearchParams({
+ apikey: this.apiKey,
+ isin: query.toUpperCase()
+ });
+
const result = await fetch(
- `${this.getUrl({ version: 'stable' })}/search-isin?isin=${query.toUpperCase()}&apikey=${this.apiKey}`,
+ `${this.getUrl({ version: 'stable' })}/search-isin?${queryParams.toString()}`,
{
signal: AbortSignal.timeout(requestTimeout)
}
@@ -506,8 +544,13 @@ export class FinancialModelingPrepService implements DataProviderInterface {
};
});
} else {
+ const queryParams = new URLSearchParams({
+ query,
+ apikey: this.apiKey
+ });
+
const result = await fetch(
- `${this.getUrl({ version: 'stable' })}/search-symbol?query=${query}&apikey=${this.apiKey}`,
+ `${this.getUrl({ version: 'stable' })}/search-symbol?${queryParams.toString()}`,
{
signal: AbortSignal.timeout(
this.configurationService.get('REQUEST_TIMEOUT')
diff --git a/apps/api/src/services/data-provider/ghostfolio/ghostfolio.service.ts b/apps/api/src/services/data-provider/ghostfolio/ghostfolio.service.ts
index afbecc118..2b49e89c2 100644
--- a/apps/api/src/services/data-provider/ghostfolio/ghostfolio.service.ts
+++ b/apps/api/src/services/data-provider/ghostfolio/ghostfolio.service.ts
@@ -116,11 +116,14 @@ export class GhostfolioService implements DataProviderInterface {
} = {};
try {
+ const queryParams = new URLSearchParams({
+ granularity,
+ from: format(from, DATE_FORMAT),
+ to: format(to, DATE_FORMAT)
+ });
+
const response = await fetch(
- `${this.URL}/v2/data-providers/ghostfolio/dividends/${symbol}?from=${format(from, DATE_FORMAT)}&granularity=${granularity}&to=${format(
- to,
- DATE_FORMAT
- )}`,
+ `${this.URL}/v2/data-providers/ghostfolio/dividends/${symbol}?${queryParams.toString()}`,
{
headers: await this.getRequestHeaders(),
signal: AbortSignal.timeout(requestTimeout)
@@ -165,11 +168,14 @@ export class GhostfolioService implements DataProviderInterface {
[symbol: string]: { [date: string]: DataProviderHistoricalResponse };
}> {
try {
+ const queryParams = new URLSearchParams({
+ granularity,
+ from: format(from, DATE_FORMAT),
+ to: format(to, DATE_FORMAT)
+ });
+
const response = await fetch(
- `${this.URL}/v2/data-providers/ghostfolio/historical/${symbol}?from=${format(from, DATE_FORMAT)}&granularity=${granularity}&to=${format(
- to,
- DATE_FORMAT
- )}`,
+ `${this.URL}/v2/data-providers/ghostfolio/historical/${symbol}?${queryParams.toString()}`,
{
headers: await this.getRequestHeaders(),
signal: AbortSignal.timeout(requestTimeout)
@@ -235,8 +241,12 @@ export class GhostfolioService implements DataProviderInterface {
}
try {
+ const queryParams = new URLSearchParams({
+ symbols: symbols.join(',')
+ });
+
const response = await fetch(
- `${this.URL}/v2/data-providers/ghostfolio/quotes?symbols=${symbols.join(',')}`,
+ `${this.URL}/v2/data-providers/ghostfolio/quotes?${queryParams.toString()}`,
{
headers: await this.getRequestHeaders(),
signal: AbortSignal.timeout(requestTimeout)
@@ -288,8 +298,12 @@ export class GhostfolioService implements DataProviderInterface {
let searchResult: LookupResponse = { items: [] };
try {
+ const queryParams = new URLSearchParams({
+ query
+ });
+
const response = await fetch(
- `${this.URL}/v2/data-providers/ghostfolio/lookup?query=${query}`,
+ `${this.URL}/v2/data-providers/ghostfolio/lookup?${queryParams.toString()}`,
{
headers: await this.getRequestHeaders(),
signal: AbortSignal.timeout(requestTimeout)
From 0620d60400f106889416862b46751962e30615b0 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Sun, 30 Nov 2025 17:16:47 +0100
Subject: [PATCH 8/8] Task/upgrade prettier to version 3.7.3 (#6014)
* Upgrade prettier to version 3.7.3
* Update changelog
---
CHANGELOG.md | 1 +
package-lock.json | 8 ++++----
package.json | 2 +-
3 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2c1d50d91..c4cf9b41b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Refactored the API query parameters in various data provider services
- Extended the _Storybook_ stories of the portfolio proportion chart component by a story using percentage values
- Upgraded `@internationalized/number` from version `3.6.3` to `3.6.5`
+- Upgraded `prettier` from version `3.7.2` to `3.7.3`
### Fixed
diff --git a/package-lock.json b/package-lock.json
index f3f9f3824..fe1b24c0f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -140,7 +140,7 @@
"jest-environment-jsdom": "29.7.0",
"jest-preset-angular": "14.6.0",
"nx": "21.5.1",
- "prettier": "3.7.2",
+ "prettier": "3.7.3",
"prettier-plugin-organize-attributes": "1.0.0",
"prisma": "6.19.0",
"react": "18.2.0",
@@ -35749,9 +35749,9 @@
}
},
"node_modules/prettier": {
- "version": "3.7.2",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.2.tgz",
- "integrity": "sha512-n3HV2J6QhItCXndGa3oMWvWFAgN1ibnS7R9mt6iokScBOC0Ul9/iZORmU2IWUMcyAQaMPjTlY3uT34TqocUxMA==",
+ "version": "3.7.3",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.3.tgz",
+ "integrity": "sha512-QgODejq9K3OzoBbuyobZlUhznP5SKwPqp+6Q6xw6o8gnhr4O85L2U915iM2IDcfF2NPXVaM9zlo9tdwipnYwzg==",
"dev": true,
"license": "MIT",
"bin": {
diff --git a/package.json b/package.json
index 6cf778ee2..7fb27c0d9 100644
--- a/package.json
+++ b/package.json
@@ -184,7 +184,7 @@
"jest-environment-jsdom": "29.7.0",
"jest-preset-angular": "14.6.0",
"nx": "21.5.1",
- "prettier": "3.7.2",
+ "prettier": "3.7.3",
"prettier-plugin-organize-attributes": "1.0.0",
"prisma": "6.19.0",
"react": "18.2.0",