From 604eddc237dae727a27ef393151f12903cdcf6ba Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Thu, 1 Jan 2026 18:42:29 +0100 Subject: [PATCH] Fix jsonpath import --- .../manual/manual.service.spec.ts | 29 +++++++++++++++++++ .../data-provider/manual/manual.service.ts | 17 +++++++++-- package-lock.json | 8 +++++ package.json | 1 + 4 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 apps/api/src/services/data-provider/manual/manual.service.spec.ts diff --git a/apps/api/src/services/data-provider/manual/manual.service.spec.ts b/apps/api/src/services/data-provider/manual/manual.service.spec.ts new file mode 100644 index 000000000..30664507e --- /dev/null +++ b/apps/api/src/services/data-provider/manual/manual.service.spec.ts @@ -0,0 +1,29 @@ +import { ManualService } from './manual.service'; + +describe('ManualService', () => { + let manualService: ManualService; + + beforeEach(() => { + manualService = new ManualService(null, null, null); + }); + + describe('extractValueFromJson', () => { + it('should extract market price from stock API response', () => { + const data = { + currency: 'USD', + market: { + previousClose: 273.04, + price: 271.86 + }, + symbol: 'AAPL' + }; + + const result = manualService.extractValueFromJson({ + data, + pathExpression: '$.market.price' + }); + + expect(result).toBe('271.86'); + }); + }); +}); 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 f18da49ab..bc04dec0c 100644 --- a/apps/api/src/services/data-provider/manual/manual.service.ts +++ b/apps/api/src/services/data-provider/manual/manual.service.ts @@ -26,7 +26,7 @@ import { Injectable, Logger } from '@nestjs/common'; import { DataSource, SymbolProfile } from '@prisma/client'; import * as cheerio from 'cheerio'; import { addDays, format, isBefore } from 'date-fns'; -import * as jsonpath from 'jsonpath'; +import jsonpath from 'jsonpath'; @Injectable() export class ManualService implements DataProviderInterface { @@ -40,6 +40,16 @@ export class ManualService implements DataProviderInterface { return true; } + public extractValueFromJson({ + data, + pathExpression + }: { + data: object; + pathExpression: string; + }) { + return String(jsonpath.query(data, pathExpression)[0]); + } + public async getAssetProfile({ symbol }: GetAssetProfileParams): Promise> { @@ -288,7 +298,10 @@ export class ManualService implements DataProviderInterface { if (response.headers.get('content-type')?.includes('application/json')) { const data = await response.json(); - value = String(jsonpath.query(data, scraperConfiguration.selector)[0]); + value = this.extractValueFromJson({ + data, + pathExpression: scraperConfiguration.selector + }); } else { const $ = cheerio.load(await response.text()); diff --git a/package-lock.json b/package-lock.json index 9e897adc4..6512d2162 100644 --- a/package-lock.json +++ b/package-lock.json @@ -124,6 +124,7 @@ "@types/big.js": "6.2.2", "@types/google-spreadsheet": "3.1.5", "@types/jest": "30.0.0", + "@types/jsonpath": "0.2.4", "@types/lodash": "4.17.20", "@types/node": "22.15.17", "@types/papaparse": "5.3.7", @@ -12436,6 +12437,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/jsonpath": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@types/jsonpath/-/jsonpath-0.2.4.tgz", + "integrity": "sha512-K3hxB8Blw0qgW6ExKgMbXQv2UPZBoE2GqLpVY+yr7nMD2Pq86lsuIzyAaiQ7eMqFL5B6di6pxSkogLJEyEHoGA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/jsonwebtoken": { "version": "9.0.10", "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.10.tgz", diff --git a/package.json b/package.json index 464a9a7cd..59a455ae1 100644 --- a/package.json +++ b/package.json @@ -168,6 +168,7 @@ "@types/big.js": "6.2.2", "@types/google-spreadsheet": "3.1.5", "@types/jest": "30.0.0", + "@types/jsonpath": "0.2.4", "@types/lodash": "4.17.20", "@types/node": "22.15.17", "@types/papaparse": "5.3.7",