From 635ad9eff46ad83d970fb9e3b93bcb98c7e4133c Mon Sep 17 00:00:00 2001 From: KenTandrian Date: Sun, 29 Jun 2025 16:19:13 +0700 Subject: [PATCH] feat(api): implement fuse.js in get holdings --- .../api/src/app/portfolio/portfolio.service.ts | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index 6f788a832..480d47d52 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -86,6 +86,7 @@ import { parseISO, set } from 'date-fns'; +import Fuse from 'fuse.js'; import { isEmpty } from 'lodash'; import { PortfolioCalculator } from './calculator/portfolio-calculator'; @@ -1049,14 +1050,17 @@ export class PortfolioService { } if (searchQuery) { - positions = positions.filter(({ symbol }) => { - const enhancedSymbolProfile = symbolProfileMap[symbol]; + const fuse = new Fuse(Object.values(symbolProfileMap), { + keys: ['isin', 'name', 'symbol'], + threshold: 0.3 + }); - return ( - enhancedSymbolProfile.isin?.toLowerCase().startsWith(searchQuery) || - enhancedSymbolProfile.name?.toLowerCase().startsWith(searchQuery) || - enhancedSymbolProfile.symbol?.toLowerCase().startsWith(searchQuery) - ); + const symbolSearchResults = fuse + .search(searchQuery) + .map(({ item }) => item.symbol); + + positions = positions.filter(({ symbol }) => { + return symbolSearchResults.includes(symbol); }); }