diff --git a/apps/api/src/app/endpoints/sitemap/sitemap.controller.ts b/apps/api/src/app/endpoints/sitemap/sitemap.controller.ts index b42ae3594..9d4b40593 100644 --- a/apps/api/src/app/endpoints/sitemap/sitemap.controller.ts +++ b/apps/api/src/app/endpoints/sitemap/sitemap.controller.ts @@ -1,10 +1,11 @@ import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { DATE_FORMAT, - getYesterday, + getStartOfUtcDateOfYesterday, interpolate } from '@ghostfolio/common/helper'; +import { utc } from '@date-fns/utc'; import { Controller, Get, Res, VERSION_NEUTRAL, Version } from '@nestjs/common'; import { format } from 'date-fns'; import { Response } from 'express'; @@ -32,7 +33,9 @@ export class SitemapController { @Get() @Version(VERSION_NEUTRAL) public getSitemapXml(@Res() response: Response) { - const currentDate = format(getYesterday(), DATE_FORMAT); + const currentDate = format(getStartOfUtcDateOfYesterday(), DATE_FORMAT, { + in: utc + }); response.setHeader('content-type', 'application/xml'); response.send( diff --git a/apps/api/src/app/symbol/symbol.controller.ts b/apps/api/src/app/symbol/symbol.controller.ts index a1351dbed..93db8c87d 100644 --- a/apps/api/src/app/symbol/symbol.controller.ts +++ b/apps/api/src/app/symbol/symbol.controller.ts @@ -8,6 +8,7 @@ import { } from '@ghostfolio/common/interfaces'; import type { RequestWithUser } from '@ghostfolio/common/types'; +import { utc } from '@date-fns/utc'; import { Controller, Get, @@ -103,7 +104,7 @@ export class SymbolController { @Param('dateString') dateString: string, @Param('symbol') symbol: string ): Promise { - const date = parseISO(dateString); + const date = parseISO(dateString, { in: utc }); if (!isDate(date)) { throw new HttpException( diff --git a/apps/api/src/app/symbol/symbol.service.ts b/apps/api/src/app/symbol/symbol.service.ts index 9cf940208..69d9d54f3 100644 --- a/apps/api/src/app/symbol/symbol.service.ts +++ b/apps/api/src/app/symbol/symbol.service.ts @@ -19,6 +19,7 @@ import { } from '@ghostfolio/common/interfaces'; import { UserWithSettings } from '@ghostfolio/common/types'; +import { utc } from '@date-fns/utc'; import { Injectable, Logger } from '@nestjs/common'; import { format, subDays } from 'date-fns'; @@ -123,8 +124,9 @@ export class SymbolService { return { marketPrice: - historicalData?.[assetProfileIdentifier]?.[format(date, DATE_FORMAT)] - ?.marketPrice + historicalData?.[assetProfileIdentifier]?.[ + format(date, DATE_FORMAT, { in: utc }) + ]?.marketPrice }; } diff --git a/apps/api/src/services/data-provider/data-provider.service.ts b/apps/api/src/services/data-provider/data-provider.service.ts index 00d6b74bc..0d0924f80 100644 --- a/apps/api/src/services/data-provider/data-provider.service.ts +++ b/apps/api/src/services/data-provider/data-provider.service.ts @@ -393,10 +393,11 @@ export class DataProviderService implements OnModuleInit { const rangeQuery = from && to - ? Prisma.sql`AND date >= ${format(from, DATE_FORMAT)}::timestamp AND date <= ${format( - to, - DATE_FORMAT - )}::timestamp` + ? Prisma.sql`AND date >= ${format(from, DATE_FORMAT, { + in: utc + })}::timestamp AND date <= ${format(to, DATE_FORMAT, { + in: utc + })}::timestamp` : Prisma.empty; const dataSources = aItems.map(({ dataSource }) => { @@ -430,7 +431,9 @@ export class DataProviderService implements OnModuleInit { r[assetProfileIdentifier] = {}; } - r[assetProfileIdentifier][format(new Date(date), DATE_FORMAT)] = { + r[assetProfileIdentifier][ + format(new Date(date), DATE_FORMAT, { in: utc }) + ] = { marketPrice }; diff --git a/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts b/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts index 375a40173..0d7e98e2e 100644 --- a/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts +++ b/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts @@ -12,11 +12,12 @@ import { import { DATE_FORMAT, getAssetProfileIdentifier, - getYesterday, + getStartOfUtcDateOfYesterday, resetHours } from '@ghostfolio/common/helper'; import { DataProviderHistoricalResponse } from '@ghostfolio/common/interfaces'; +import { utc } from '@date-fns/utc'; import { Injectable, Logger } from '@nestjs/common'; import { eachDayOfInterval, @@ -164,11 +165,19 @@ export class ExchangeRateDataService { } public async loadCurrencies() { + const startOfUtcDateOfYesterday = getStartOfUtcDateOfYesterday(); + + const dateStringOfYesterday = format( + startOfUtcDateOfYesterday, + DATE_FORMAT, + { in: utc } + ); + const historicalData = await this.dataProviderService.getHistorical( this.currencyPairs, 'day', - getYesterday(), - getYesterday() + startOfUtcDateOfYesterday, + startOfUtcDateOfYesterday ); const quotes = await this.dataProviderService.getQuotes({ @@ -196,7 +205,7 @@ export class ExchangeRateDataService { if (isNumber(quote?.marketPrice)) { result[symbol] = { - [format(getYesterday(), DATE_FORMAT)]: { + [dateStringOfYesterday]: { marketPrice: quote.marketPrice } }; @@ -219,17 +228,19 @@ export class ExchangeRateDataService { for (const symbol of Object.keys(resultExtended)) { const [currency1, currency2] = symbol.match(/.{1,3}/g); - const date = format(getYesterday(), DATE_FORMAT); - this.exchangeRates[symbol] = resultExtended[symbol]?.[date]?.marketPrice; + this.exchangeRates[symbol] = + resultExtended[symbol]?.[dateStringOfYesterday]?.marketPrice; if (!this.exchangeRates[symbol]) { // Not found, calculate indirectly via base currency this.exchangeRates[symbol] = - resultExtended[`${currency1}${DEFAULT_CURRENCY}`]?.[date] - ?.marketPrice * - resultExtended[`${DEFAULT_CURRENCY}${currency2}`]?.[date] - ?.marketPrice; + resultExtended[`${currency1}${DEFAULT_CURRENCY}`]?.[ + dateStringOfYesterday + ]?.marketPrice * + resultExtended[`${DEFAULT_CURRENCY}${currency2}`]?.[ + dateStringOfYesterday + ]?.marketPrice; // Calculate the opposite direction this.exchangeRates[`${currency2}${currency1}`] = diff --git a/libs/common/src/lib/helper.ts b/libs/common/src/lib/helper.ts index 260b0f343..5b668829f 100644 --- a/libs/common/src/lib/helper.ts +++ b/libs/common/src/lib/helper.ts @@ -531,14 +531,6 @@ export function getUtc(aDateString: string) { ); } -export function getYesterday() { - const year = getYear(new Date()); - const month = getMonth(new Date()); - const day = getDate(new Date()); - - return subDays(new Date(Date.UTC(year, month, day)), 1); -} - export function hasGhostfolioPrefix(aSymbol: string) { if (!aSymbol) { return false;