From 2c7d37efa25191caf892fcaf53d5e2a874c21574 Mon Sep 17 00:00:00 2001 From: Thomas <4159106+dtslvr@users.noreply.github.com> Date: Sat, 15 Apr 2023 11:15:08 +0200 Subject: [PATCH] Skip job creation for MANUAL data source without scraper configuration --- apps/api/src/services/cron.service.ts | 4 +- .../src/services/data-gathering.service.ts | 110 ++++++++++-------- 2 files changed, 66 insertions(+), 48 deletions(-) diff --git a/apps/api/src/services/cron.service.ts b/apps/api/src/services/cron.service.ts index 69906dfa9..1eb5432c6 100644 --- a/apps/api/src/services/cron.service.ts +++ b/apps/api/src/services/cron.service.ts @@ -19,8 +19,8 @@ export class CronService { private readonly twitterBotService: TwitterBotService ) {} - @Cron(CronExpression.EVERY_4_HOURS) - public async runEveryFourHours() { + @Cron(CronExpression.EVERY_HOUR) + public async runEveryHour() { await this.dataGatheringService.gather7Days(); } diff --git a/apps/api/src/services/data-gathering.service.ts b/apps/api/src/services/data-gathering.service.ts index 4015cf114..cad0b9e21 100644 --- a/apps/api/src/services/data-gathering.service.ts +++ b/apps/api/src/services/data-gathering.service.ts @@ -11,6 +11,7 @@ import { Inject, Injectable, Logger } from '@nestjs/common'; import { DataSource } from '@prisma/client'; import { JobOptions, Queue } from 'bull'; import { format, min, subDays, subYears } from 'date-fns'; +import { isEmpty } from 'lodash'; import { DataProviderService } from './data-provider/data-provider.service'; import { DataEnhancerInterface } from './data-provider/interfaces/data-enhancer.interface'; @@ -223,48 +224,6 @@ export class DataGatheringService { ); } - public async getSymbolsMax(): Promise { - const startDate = - ( - await this.prismaService.order.findFirst({ - orderBy: [{ date: 'asc' }] - }) - )?.date ?? new Date(); - - const currencyPairsToGather = this.exchangeRateDataService - .getCurrencyPairs() - .map(({ dataSource, symbol }) => { - return { - dataSource, - symbol, - date: min([startDate, subYears(new Date(), 10)]) - }; - }); - - const symbolProfilesToGather = ( - await this.prismaService.symbolProfile.findMany({ - orderBy: [{ symbol: 'asc' }], - select: { - dataSource: true, - Order: { - orderBy: [{ date: 'asc' }], - select: { date: true }, - take: 1 - }, - scraperConfiguration: true, - symbol: true - } - }) - ).map((symbolProfile) => { - return { - ...symbolProfile, - date: symbolProfile.Order?.[0]?.date ?? startDate - }; - }); - - return [...currencyPairsToGather, ...symbolProfilesToGather]; - } - public async getUniqueAssets(): Promise { const symbolProfiles = await this.prismaService.symbolProfile.findMany({ orderBy: [{ symbol: 'asc' }] @@ -299,7 +258,7 @@ export class DataGatheringService { // Only consider symbols with incomplete market data for the last // 7 days - const symbolsNotToGather = ( + const symbolsWithCompleteMarketData = ( await this.prismaService.marketData.groupBy({ _count: true, by: ['symbol'], @@ -317,8 +276,14 @@ export class DataGatheringService { }); const symbolProfilesToGather = symbolProfiles - .filter(({ symbol }) => { - return !symbolsNotToGather.includes(symbol); + .filter(({ dataSource, scraperConfiguration, symbol }) => { + const manualDataSourceWithScraperConfiguration = + dataSource === 'MANUAL' && !isEmpty(scraperConfiguration); + + return ( + !symbolsWithCompleteMarketData.includes(symbol) && + (dataSource !== 'MANUAL' || manualDataSourceWithScraperConfiguration) + ); }) .map((symbolProfile) => { return { @@ -330,7 +295,7 @@ export class DataGatheringService { const currencyPairsToGather = this.exchangeRateDataService .getCurrencyPairs() .filter(({ symbol }) => { - return !symbolsNotToGather.includes(symbol); + return !symbolsWithCompleteMarketData.includes(symbol); }) .map(({ dataSource, symbol }) => { return { @@ -342,4 +307,57 @@ export class DataGatheringService { return [...currencyPairsToGather, ...symbolProfilesToGather]; } + + private async getSymbolsMax(): Promise { + const startDate = + ( + await this.prismaService.order.findFirst({ + orderBy: [{ date: 'asc' }] + }) + )?.date ?? new Date(); + + const currencyPairsToGather = this.exchangeRateDataService + .getCurrencyPairs() + .map(({ dataSource, symbol }) => { + return { + dataSource, + symbol, + date: min([startDate, subYears(new Date(), 10)]) + }; + }); + + const symbolProfilesToGather = ( + await this.prismaService.symbolProfile.findMany({ + orderBy: [{ symbol: 'asc' }], + select: { + dataSource: true, + Order: { + orderBy: [{ date: 'asc' }], + select: { date: true }, + take: 1 + }, + scraperConfiguration: true, + symbol: true + } + }) + ) + .filter((symbolProfile) => { + const manualDataSourceWithScraperConfiguration = + symbolProfile.dataSource === 'MANUAL' && + !isEmpty(symbolProfile.scraperConfiguration); + + return ( + symbolProfile.dataSource !== 'MANUAL' || + manualDataSourceWithScraperConfiguration + ); + }) + .map((symbolProfile) => { + return { + ...symbolProfile, + date: symbolProfile.Order?.[0]?.date ?? startDate + }; + }); + + return [...currencyPairsToGather, ...symbolProfilesToGather]; + } }