diff --git a/apps/api/src/helper/object.helper.spec.ts b/apps/api/src/helper/object.helper.spec.ts index 433490325..e1ec81b8f 100644 --- a/apps/api/src/helper/object.helper.spec.ts +++ b/apps/api/src/helper/object.helper.spec.ts @@ -1,4 +1,24 @@ -import { redactAttributes } from './object.helper'; +import { query, redactAttributes } from './object.helper'; + +describe('query', () => { + it('should get market price from stock API response', () => { + const object = { + currency: 'USD', + market: { + previousClose: 273.04, + price: 271.86 + }, + symbol: 'AAPL' + }; + + const result = query({ + object, + pathExpression: '$.market.price' + })[0]; + + expect(result).toBe(271.86); + }); +}); describe('redactAttributes', () => { it('should redact provided attributes', () => { diff --git a/apps/api/src/helper/object.helper.ts b/apps/api/src/helper/object.helper.ts index a5854e9d9..6bb6579d2 100644 --- a/apps/api/src/helper/object.helper.ts +++ b/apps/api/src/helper/object.helper.ts @@ -1,4 +1,5 @@ import { Big } from 'big.js'; +import jsonpath from 'jsonpath'; import { cloneDeep, isArray, isObject } from 'lodash'; export function hasNotDefinedValuesInObject(aObject: Object): boolean { @@ -31,6 +32,16 @@ export function nullifyValuesInObjects(aObjects: T[], keys: string[]): T[] { }); } +export function query({ + object, + pathExpression +}: { + object: object; + pathExpression: string; +}) { + return jsonpath.query(object, pathExpression); +} + export function redactAttributes({ isFirstRun = true, object, 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 deleted file mode 100644 index 30664507e..000000000 --- a/apps/api/src/services/data-provider/manual/manual.service.spec.ts +++ /dev/null @@ -1,29 +0,0 @@ -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 bc04dec0c..7392f0914 100644 --- a/apps/api/src/services/data-provider/manual/manual.service.ts +++ b/apps/api/src/services/data-provider/manual/manual.service.ts @@ -1,3 +1,4 @@ +import { query } from '@ghostfolio/api/helper/object.helper'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { DataProviderInterface, @@ -26,7 +27,6 @@ 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 jsonpath from 'jsonpath'; @Injectable() export class ManualService implements DataProviderInterface { @@ -40,16 +40,6 @@ 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> { @@ -296,12 +286,14 @@ export class ManualService implements DataProviderInterface { let value: string; if (response.headers.get('content-type')?.includes('application/json')) { - const data = await response.json(); + const object = await response.json(); - value = this.extractValueFromJson({ - data, - pathExpression: scraperConfiguration.selector - }); + value = String( + query({ + object, + pathExpression: scraperConfiguration.selector + })[0] + ); } else { const $ = cheerio.load(await response.text());