diff --git a/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.service.ts b/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.service.ts index 463ccf2098..3c5a349091 100644 --- a/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.service.ts +++ b/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.service.ts @@ -17,7 +17,10 @@ import { DERIVED_CURRENCIES } from '@ghostfolio/common/config'; import { PROPERTY_DATA_SOURCES_GHOSTFOLIO_DATA_PROVIDER_MAX_REQUESTS } from '@ghostfolio/common/config'; -import { getAssetProfileIdentifier } from '@ghostfolio/common/helper'; +import { + getAssetProfileIdentifier, + isValidSearchQuery +} from '@ghostfolio/common/helper'; import { DataProviderGhostfolioAssetProfileResponse, DataProviderHistoricalResponse, @@ -342,7 +345,7 @@ export class GhostfolioService { query = query?.trim(); - if (!query || query.length < 2) { + if (!isValidSearchQuery(query)) { return results; } diff --git a/apps/api/src/services/data-provider/data-provider.service.ts b/apps/api/src/services/data-provider/data-provider.service.ts index 1ee4faa794..4c273f2dad 100644 --- a/apps/api/src/services/data-provider/data-provider.service.ts +++ b/apps/api/src/services/data-provider/data-provider.service.ts @@ -20,7 +20,8 @@ import { getCurrencyFromSymbol, getStartOfUtcDate, isCurrency, - isDerivedCurrency + isDerivedCurrency, + isValidSearchQuery } from '@ghostfolio/common/helper'; import { AssetProfileIdentifier, @@ -840,7 +841,7 @@ export class DataProviderService implements OnModuleInit { query = query?.trim(); - if (!query || query.length < 2) { + if (!isValidSearchQuery(query)) { return { items: lookupItems }; } 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 352e912381..364354f6b3 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 @@ -331,9 +331,7 @@ export class YahooFinanceService implements DataProviderInterface { } } catch (error) { if (error?.name === 'BadRequestError') { - this.logger.warn( - `The search for "${query}" is not supported: ${error.message}` - ); + this.logger.warn(`Could not search for "${query}": ${error.message}`); } else { this.logger.error(error); } diff --git a/libs/common/src/lib/config.ts b/libs/common/src/lib/config.ts index 6b070755f2..eeb6eb89d9 100644 --- a/libs/common/src/lib/config.ts +++ b/libs/common/src/lib/config.ts @@ -287,6 +287,8 @@ export const REPLACE_NAME_PARTS = [ 'Xtrackers (IE) Plc -' ]; +export const SEARCH_QUERY_MINIMUM_LENGTH = 2; + export const SECTORS = [ 'Basic Materials', 'Communication Services', diff --git a/libs/common/src/lib/helper.ts b/libs/common/src/lib/helper.ts index b2a3ab419a..98f097b44b 100644 --- a/libs/common/src/lib/helper.ts +++ b/libs/common/src/lib/helper.ts @@ -41,6 +41,7 @@ import { DERIVED_CURRENCIES, ghostfolioFearAndGreedIndexSymbolCryptocurrencies, ghostfolioFearAndGreedIndexSymbolStocks, + SEARCH_QUERY_MINIMUM_LENGTH, TAG_ID_EXCLUDE_FROM_ANALYSIS } from './config'; import { @@ -509,6 +510,10 @@ export function isRootCurrency(aCurrency: string) { }); } +export function isValidSearchQuery(aQuery: string) { + return aQuery?.trim().length >= SEARCH_QUERY_MINIMUM_LENGTH; +} + export function parseDate(date: string): Date | undefined { if (!date) { return undefined; diff --git a/libs/ui/src/lib/assistant/assistant.component.ts b/libs/ui/src/lib/assistant/assistant.component.ts index 471420937a..9ef6c9f1ce 100644 --- a/libs/ui/src/lib/assistant/assistant.component.ts +++ b/libs/ui/src/lib/assistant/assistant.component.ts @@ -202,6 +202,11 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit { this.searchFormControl.valueChanges .pipe( map((searchTerm) => { + return searchTerm?.trim(); + }), + debounceTime(300), + distinctUntilChanged(), + tap(() => { this.isLoading = { accounts: true, assetProfiles: true, @@ -216,11 +221,7 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit { }; this.changeDetectorRef.markForCheck(); - - return searchTerm?.trim(); }), - debounceTime(300), - distinctUntilChanged(), switchMap((searchTerm) => { const results = { accounts: [],