diff --git a/apps/api/src/services/data-provider/manual/manual.service.ts b/apps/api/src/services/data-provider/manual/manual.service.ts index c3cd06da3..06b2179ea 100644 --- a/apps/api/src/services/data-provider/manual/manual.service.ts +++ b/apps/api/src/services/data-provider/manual/manual.service.ts @@ -166,15 +166,39 @@ export class ManualService implements DataProviderInterface { } }); + const profilesWithScraping = symbolProfiles.filter( + ({ scraperConfiguration }) => { + return !!scraperConfiguration?.url; + } + ); + + const scrapingPromises = profilesWithScraping.map( + ({ symbol, scraperConfiguration }) => { + return this.scrape(scraperConfiguration) + .then((marketPrice) => ({ + symbol, + marketPrice + })) + .catch((error) => { + Logger.error(`Error scraping ${symbol}:`, error); + return { symbol, marketPrice: 0 }; + }); + } + ); + + // Wait for all scraping requests to complete concurrently + const scrapedResults = await Promise.all(scrapingPromises); + for (const { currency, symbol, scraperConfiguration } of symbolProfiles) { + const scrapedResult = scrapedResults.find( + (result) => result.symbol === symbol + ); let marketPrice = + scrapedResult?.marketPrice ?? marketData.find((marketDataItem) => { return marketDataItem.symbol === symbol; - })?.marketPrice ?? 0; - - if (scraperConfiguration.mode === 'instant') { - marketPrice = await this.scrape(scraperConfiguration); - } + })?.marketPrice ?? + 0; response[symbol] = { currency, diff --git a/libs/common/src/lib/interfaces/scraper-configuration.interface.ts b/libs/common/src/lib/interfaces/scraper-configuration.interface.ts index 33fef2405..70fcd939d 100644 --- a/libs/common/src/lib/interfaces/scraper-configuration.interface.ts +++ b/libs/common/src/lib/interfaces/scraper-configuration.interface.ts @@ -2,7 +2,7 @@ export interface ScraperConfiguration { defaultMarketPrice?: number; headers?: { [key: string]: string }; locale?: string; + mode?: 'instant' | 'lazy'; selector: string; url: string; - mode?: 'instant' | 'lazy'; }