Browse Source

Add HTTP fetch service

pull/6951/head
Thomas Kaul 3 months ago
parent
commit
7dfa11276d
  1. 2
      apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.module.ts
  2. 2
      apps/api/src/services/data-provider/data-provider.module.ts
  3. 13
      apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts
  4. 9
      apps/api/src/services/fetch/fetch.module.ts
  5. 37
      apps/api/src/services/fetch/fetch.service.ts

2
apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.module.ts

@ -12,6 +12,7 @@ import { GoogleSheetsService } from '@ghostfolio/api/services/data-provider/goog
import { ManualService } from '@ghostfolio/api/services/data-provider/manual/manual.service';
import { RapidApiService } from '@ghostfolio/api/services/data-provider/rapid-api/rapid-api.service';
import { YahooFinanceService } from '@ghostfolio/api/services/data-provider/yahoo-finance/yahoo-finance.service';
import { FetchModule } from '@ghostfolio/api/services/fetch/fetch.module';
import { MarketDataModule } from '@ghostfolio/api/services/market-data/market-data.module';
import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module';
import { PropertyModule } from '@ghostfolio/api/services/property/property.module';
@ -27,6 +28,7 @@ import { GhostfolioService } from './ghostfolio.service';
imports: [
CryptocurrencyModule,
DataProviderModule,
FetchModule,
MarketDataModule,
PrismaModule,
PropertyModule,

2
apps/api/src/services/data-provider/data-provider.module.ts

@ -10,6 +10,7 @@ import { GoogleSheetsService } from '@ghostfolio/api/services/data-provider/goog
import { ManualService } from '@ghostfolio/api/services/data-provider/manual/manual.service';
import { RapidApiService } from '@ghostfolio/api/services/data-provider/rapid-api/rapid-api.service';
import { YahooFinanceService } from '@ghostfolio/api/services/data-provider/yahoo-finance/yahoo-finance.service';
import { FetchModule } from '@ghostfolio/api/services/fetch/fetch.module';
import { MarketDataModule } from '@ghostfolio/api/services/market-data/market-data.module';
import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module';
import { PropertyModule } from '@ghostfolio/api/services/property/property.module';
@ -26,6 +27,7 @@ import { DataProviderService } from './data-provider.service';
ConfigurationModule,
CryptocurrencyModule,
DataEnhancerModule,
FetchModule,
MarketDataModule,
PrismaModule,
PropertyModule,

13
apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts

@ -7,6 +7,7 @@ import {
GetQuotesParams,
GetSearchParams
} from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface';
import { FetchService } from '@ghostfolio/api/services/fetch/fetch.service';
import {
ghostfolioFearAndGreedIndexSymbol,
ghostfolioFearAndGreedIndexSymbolStocks
@ -26,7 +27,8 @@ import { format } from 'date-fns';
@Injectable()
export class RapidApiService implements DataProviderInterface {
public constructor(
private readonly configurationService: ConfigurationService
private readonly configurationService: ConfigurationService,
private readonly fetchService: FetchService
) {}
public canHandle() {
@ -142,9 +144,8 @@ export class RapidApiService implements DataProviderInterface {
oneYearAgo: { value: number; valueText: string };
}> {
try {
const { fgi } = await fetch(
`https://fear-and-greed-index.p.rapidapi.com/v1/fgi`,
{
const { fgi } = await this.fetchService
.fetch(`https://fear-and-greed-index.p.rapidapi.com/v1/fgi`, {
headers: {
useQueryString: 'true',
'x-rapidapi-host': 'fear-and-greed-index.p.rapidapi.com',
@ -153,8 +154,8 @@ export class RapidApiService implements DataProviderInterface {
signal: AbortSignal.timeout(
this.configurationService.get('REQUEST_TIMEOUT')
)
}
).then((res) => res.json());
})
.then((res) => res.json());
return fgi;
} catch (error) {

9
apps/api/src/services/fetch/fetch.module.ts

@ -0,0 +1,9 @@
import { FetchService } from '@ghostfolio/api/services/fetch/fetch.service';
import { Module } from '@nestjs/common';
@Module({
exports: [FetchService],
providers: [FetchService]
})
export class FetchModule {}

37
apps/api/src/services/fetch/fetch.service.ts

@ -0,0 +1,37 @@
import { Injectable, Logger } from '@nestjs/common';
@Injectable()
export class FetchService {
public async fetch(
input: RequestInfo | URL,
init?: RequestInit
): Promise<Response> {
const method = (
init?.method ??
(input instanceof Request ? input.method : undefined) ??
'GET'
).toUpperCase();
const url = input instanceof Request ? input.url : input.toString();
Logger.debug(`${method} ${url}`, 'FetchService');
try {
return await globalThis.fetch(input, init);
} catch (error) {
if (error instanceof Error) {
Logger.error(
`${method} ${url} failed: [${error.name}] ${error.message}`,
'FetchService'
);
} else {
Logger.error(
`${method} ${url} failed: ${String(error)}`,
'FetchService'
);
}
throw error;
}
}
}
Loading…
Cancel
Save