import { getToday, getYesterday } from '@ghostfolio/helper/helper'; import { Granularity } from '@ghostfolio/helper/types'; import { Injectable } from '@nestjs/common'; import { DataSource } from '@prisma/client'; import * as bent from 'bent'; import { format, subMonths, subWeeks, subYears } from 'date-fns'; import { ConfigurationService } from '../../configuration.service'; import { DataProviderInterface } from '../../interfaces/data-provider.interface'; import { IDataProviderHistoricalResponse, IDataProviderResponse, MarketState } from '../../interfaces/interfaces'; import { PrismaService } from '../../prisma.service'; @Injectable() export class RakutenRapidApiService implements DataProviderInterface { public static FEAR_AND_GREED_INDEX_NAME = 'Fear & Greed Index'; private prisma: PrismaService; public constructor( private readonly configurationService: ConfigurationService ) {} public async get( aSymbols: string[] ): Promise<{ [symbol: string]: IDataProviderResponse }> { if (aSymbols.length <= 0) { return {}; } try { const symbol = aSymbols[0]; if (symbol === 'GF.FEAR_AND_GREED_INDEX') { const fgi = await this.getFearAndGreedIndex(); return { 'GF.FEAR_AND_GREED_INDEX': { currency: undefined, dataSource: DataSource.RAKUTEN, marketPrice: fgi.now.value, marketState: MarketState.open, name: RakutenRapidApiService.FEAR_AND_GREED_INDEX_NAME } }; } } catch (error) { console.error(error); } return {}; } public async getHistorical( aSymbols: string[], aGranularity: Granularity = 'day', from: Date, to: Date ): Promise<{ [symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; }> { if (aSymbols.length <= 0) { return {}; } try { const symbol = aSymbols[0]; if (symbol === 'GF.FEAR_AND_GREED_INDEX') { const fgi = await this.getFearAndGreedIndex(); try { // Rebuild historical data // TODO: can be removed after all data from the last year has been gathered // (introduced on 27.03.2021) await this.prisma.marketData.create({ data: { symbol, date: subWeeks(getToday(), 1), marketPrice: fgi.oneWeekAgo.value } }); await this.prisma.marketData.create({ data: { symbol, date: subMonths(getToday(), 1), marketPrice: fgi.oneMonthAgo.value } }); await this.prisma.marketData.create({ data: { symbol, date: subYears(getToday(), 1), marketPrice: fgi.oneYearAgo.value } }); /////////////////////////////////////////////////////////////////////////// } catch {} return { 'GF.FEAR_AND_GREED_INDEX': { [format(getYesterday(), 'yyyy-MM-dd')]: { marketPrice: fgi.previousClose.value } } }; } } catch (error) {} return {}; } private async getFearAndGreedIndex(): Promise<{ now: { value: number; valueText: string }; previousClose: { value: number; valueText: string }; oneWeekAgo: { value: number; valueText: string }; oneMonthAgo: { value: number; valueText: string }; oneYearAgo: { value: number; valueText: string }; }> { try { const get = bent( `https://fear-and-greed-index.p.rapidapi.com/v1/fgi`, 'GET', 'json', 200, { useQueryString: true, 'x-rapidapi-host': 'fear-and-greed-index.p.rapidapi.com', 'x-rapidapi-key': this.configurationService.get( 'RAKUTEN_RAPID_API_KEY' ) } ); const { fgi } = await get(); return fgi; } catch (error) { console.error(error); return undefined; } } public setPrisma(aPrismaService: PrismaService) { this.prisma = aPrismaService; } }