From 9ca901f6e66cbbeac86aa1627a985730d393ce39 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Mon, 25 Nov 2024 21:25:57 +0100 Subject: [PATCH] Feature/improve api key management of ghostfolio data provider (#4069) * Improve API key management * Add fallback for language code --- .../ghostfolio/ghostfolio.service.ts | 25 ++++++++----------- .../admin-settings.component.ts | 10 ++++++-- 2 files changed, 18 insertions(+), 17 deletions(-) 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 a1ac6b657..acd66b0af 100644 --- a/apps/api/src/services/data-provider/ghostfolio/ghostfolio.service.ts +++ b/apps/api/src/services/data-provider/ghostfolio/ghostfolio.service.ts @@ -31,7 +31,6 @@ import got from 'got'; @Injectable() export class GhostfolioService implements DataProviderInterface { - private apiKey: string; private readonly URL = environment.production ? 'https://ghostfol.io/api' : `${this.configurationService.get('ROOT_URL')}/api`; @@ -39,15 +38,7 @@ export class GhostfolioService implements DataProviderInterface { public constructor( private readonly configurationService: ConfigurationService, private readonly propertyService: PropertyService - ) { - void this.initialize(); - } - - public async initialize() { - this.apiKey = (await this.propertyService.getByKey( - PROPERTY_API_KEY_GHOSTFOLIO - )) as string; - } + ) {} public canHandle() { return true; @@ -105,7 +96,7 @@ export class GhostfolioService implements DataProviderInterface { DATE_FORMAT )}`, { - headers: this.getRequestHeaders(), + headers: await this.getRequestHeaders(), // @ts-ignore signal: abortController.signal } @@ -154,7 +145,7 @@ export class GhostfolioService implements DataProviderInterface { const { quotes } = await got( `${this.URL}/v1/data-providers/ghostfolio/quotes?symbols=${symbols.join(',')}`, { - headers: this.getRequestHeaders(), + headers: await this.getRequestHeaders(), // @ts-ignore signal: abortController.signal } @@ -193,7 +184,7 @@ export class GhostfolioService implements DataProviderInterface { searchResult = await got( `${this.URL}/v1/data-providers/ghostfolio/lookup?query=${query}`, { - headers: this.getRequestHeaders(), + headers: await this.getRequestHeaders(), // @ts-ignore signal: abortController.signal } @@ -213,9 +204,13 @@ export class GhostfolioService implements DataProviderInterface { return searchResult; } - private getRequestHeaders() { + private async getRequestHeaders() { + const apiKey = (await this.propertyService.getByKey( + PROPERTY_API_KEY_GHOSTFOLIO + )) as string; + return { - [HEADER_KEY_TOKEN]: `Bearer ${this.apiKey}` + [HEADER_KEY_TOKEN]: `Bearer ${apiKey}` }; } } diff --git a/apps/client/src/app/components/admin-settings/admin-settings.component.ts b/apps/client/src/app/components/admin-settings/admin-settings.component.ts index d25cdfbcd..68256bf98 100644 --- a/apps/client/src/app/components/admin-settings/admin-settings.component.ts +++ b/apps/client/src/app/components/admin-settings/admin-settings.component.ts @@ -3,7 +3,10 @@ import { NotificationService } from '@ghostfolio/client/core/notification/notifi import { AdminService } from '@ghostfolio/client/services/admin.service'; import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; -import { PROPERTY_API_KEY_GHOSTFOLIO } from '@ghostfolio/common/config'; +import { + DEFAULT_LANGUAGE_CODE, + PROPERTY_API_KEY_GHOSTFOLIO +} from '@ghostfolio/common/config'; import { DataProviderGhostfolioStatusResponse, User @@ -56,8 +59,11 @@ export class AdminSettingsComponent implements OnDestroy, OnInit { if (state?.user) { this.user = state.user; + const languageCode = + this.user?.settings?.language ?? DEFAULT_LANGUAGE_CODE; + this.pricingUrl = - `https://ghostfol.io/${this.user.settings.language}/` + + `https://ghostfol.io/${languageCode}/` + $localize`:snake-case:pricing`; this.changeDetectorRef.markForCheck();