Browse Source

Task/refactor $queryRawUnsafe() in data provider service (#6408)

* Refactor $queryRawUnsafe()

* Update changelog
pull/6409/head
Thomas Kaul 1 day ago
committed by GitHub
parent
commit
f2c81ada90
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 1
      CHANGELOG.md
  2. 33
      apps/api/src/services/data-provider/data-provider.service.ts

1
CHANGELOG.md

@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed ### Changed
- Removed the deprecated static portfolio analysis rule: _Fees_ (Fee Ratio) - Removed the deprecated static portfolio analysis rule: _Fees_ (Fee Ratio)
- Refactored queries in the data provider service to use Prisma’s safe query methods
### Fixed ### Fixed

33
apps/api/src/services/data-provider/data-provider.service.ts

@ -30,7 +30,7 @@ import {
import type { Granularity, UserWithSettings } from '@ghostfolio/common/types'; import type { Granularity, UserWithSettings } from '@ghostfolio/common/types';
import { Inject, Injectable, Logger, OnModuleInit } from '@nestjs/common'; import { Inject, Injectable, Logger, OnModuleInit } from '@nestjs/common';
import { DataSource, MarketData, SymbolProfile } from '@prisma/client'; import { DataSource, MarketData, Prisma, SymbolProfile } from '@prisma/client';
import { Big } from 'big.js'; import { Big } from 'big.js';
import { eachDayOfInterval, format, isValid } from 'date-fns'; import { eachDayOfInterval, format, isValid } from 'date-fns';
import { groupBy, isEmpty, isNumber, uniqWith } from 'lodash'; import { groupBy, isEmpty, isNumber, uniqWith } from 'lodash';
@ -347,36 +347,35 @@ export class DataProviderService implements OnModuleInit {
const granularityQuery = const granularityQuery =
aGranularity === 'month' aGranularity === 'month'
? `AND (date_part('day', date) = 1 OR date >= TIMESTAMP 'yesterday')` ? Prisma.sql`AND (date_part('day', date) = 1 OR date >= TIMESTAMP 'yesterday')`
: ''; : Prisma.empty;
const rangeQuery = const rangeQuery =
from && to from && to
? `AND date >= '${format(from, DATE_FORMAT)}' AND date <= '${format( ? Prisma.sql`AND date >= ${format(from, DATE_FORMAT)}::timestamp AND date <= ${format(
to, to,
DATE_FORMAT DATE_FORMAT
)}'` )}::timestamp`
: ''; : Prisma.empty;
const dataSources = aItems.map(({ dataSource }) => { const dataSources = aItems.map(({ dataSource }) => {
return dataSource; return dataSource;
}); });
const symbols = aItems.map(({ symbol }) => { const symbols = aItems.map(({ symbol }) => {
return symbol; return symbol;
}); });
try { try {
const queryRaw = ` const marketDataByGranularity: MarketData[] = await this.prismaService
SELECT * .$queryRaw`
FROM "MarketData" SELECT *
WHERE "dataSource" IN ('${dataSources.join(`','`)}') FROM "MarketData"
AND "symbol" IN ('${symbols.join( WHERE "dataSource"::text IN (${Prisma.join(dataSources)})
`','` AND "symbol" IN (${Prisma.join(symbols)})
)}') ${granularityQuery} ${rangeQuery} ${granularityQuery}
ORDER BY date;`; ${rangeQuery}
ORDER BY date;`;
const marketDataByGranularity: MarketData[] =
await this.prismaService.$queryRawUnsafe(queryRaw);
response = marketDataByGranularity.reduce((r, marketData) => { response = marketDataByGranularity.reduce((r, marketData) => {
const { date, marketPrice, symbol } = marketData; const { date, marketPrice, symbol } = marketData;

Loading…
Cancel
Save