Browse Source

Normalize dates

pull/7576/head
Thomas Kaul 3 weeks ago
parent
commit
9e7c8d3112
  1. 9
      apps/api/src/app/admin/admin.controller.ts
  2. 33
      apps/api/src/app/endpoints/market-data/market-data.controller.ts
  3. 3
      libs/common/src/lib/dtos/update-bulk-market-data.dto.ts
  4. 5
      libs/common/src/lib/dtos/update-market-data.dto.ts
  5. 2
      libs/common/src/lib/helper.ts

9
apps/api/src/app/admin/admin.controller.ts

@ -19,7 +19,8 @@ import {
} from '@ghostfolio/common/dtos'; } from '@ghostfolio/common/dtos';
import { import {
canDeleteAssetProfile, canDeleteAssetProfile,
getAssetProfileIdentifier getAssetProfileIdentifier,
getStartOfUtcDate
} from '@ghostfolio/common/helper'; } from '@ghostfolio/common/helper';
import { import {
AdminData, AdminData,
@ -55,7 +56,7 @@ import {
import { REQUEST } from '@nestjs/core'; import { REQUEST } from '@nestjs/core';
import { AuthGuard } from '@nestjs/passport'; import { AuthGuard } from '@nestjs/passport';
import { DataSource, MarketData, Prisma, SymbolProfile } from '@prisma/client'; import { DataSource, MarketData, Prisma, SymbolProfile } from '@prisma/client';
import { isDate, parseISO } from 'date-fns'; import { isValid } from 'date-fns';
import { StatusCodes, getReasonPhrase } from 'http-status-codes'; import { StatusCodes, getReasonPhrase } from 'http-status-codes';
import { AdminService } from './admin.service'; import { AdminService } from './admin.service';
@ -201,9 +202,9 @@ export class AdminController {
@Param('dateString') dateString: string, @Param('dateString') dateString: string,
@Param('symbol') symbol: string @Param('symbol') symbol: string
): Promise<MarketData> { ): Promise<MarketData> {
const date = parseISO(dateString); const date = getStartOfUtcDate(dateString);
if (!isDate(date)) { if (!isValid(date)) {
throw new HttpException( throw new HttpException(
getReasonPhrase(StatusCodes.BAD_REQUEST), getReasonPhrase(StatusCodes.BAD_REQUEST),
StatusCodes.BAD_REQUEST StatusCodes.BAD_REQUEST

33
apps/api/src/app/endpoints/market-data/market-data.controller.ts

@ -4,7 +4,11 @@ import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'
import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service';
import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service';
import { UpdateBulkMarketDataDto } from '@ghostfolio/common/dtos'; import { UpdateBulkMarketDataDto } from '@ghostfolio/common/dtos';
import { getCurrencyFromSymbol, isCurrency } from '@ghostfolio/common/helper'; import {
getCurrencyFromSymbol,
getStartOfUtcDate,
isCurrency
} from '@ghostfolio/common/helper';
import { MarketDataOfMarketsResponse } from '@ghostfolio/common/interfaces'; import { MarketDataOfMarketsResponse } from '@ghostfolio/common/interfaces';
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { RequestWithUser } from '@ghostfolio/common/types'; import { RequestWithUser } from '@ghostfolio/common/types';
@ -24,7 +28,7 @@ import {
import { REQUEST } from '@nestjs/core'; import { REQUEST } from '@nestjs/core';
import { AuthGuard } from '@nestjs/passport'; import { AuthGuard } from '@nestjs/passport';
import { DataSource, Prisma } from '@prisma/client'; import { DataSource, Prisma } from '@prisma/client';
import { parseISO } from 'date-fns'; import { isValid } from 'date-fns';
import { getReasonPhrase, StatusCodes } from 'http-status-codes'; import { getReasonPhrase, StatusCodes } from 'http-status-codes';
@Controller('market-data') @Controller('market-data')
@ -95,13 +99,24 @@ export class MarketDataController {
} }
const dataBulkUpdate: Prisma.MarketDataUpdateInput[] = data.marketData.map( const dataBulkUpdate: Prisma.MarketDataUpdateInput[] = data.marketData.map(
({ date, marketPrice }) => ({ ({ date, marketPrice }) => {
dataSource, const startOfUtcDate = getStartOfUtcDate(date);
marketPrice,
symbol, if (!isValid(startOfUtcDate)) {
date: parseISO(date), throw new HttpException(
state: 'CLOSE' getReasonPhrase(StatusCodes.BAD_REQUEST),
}) StatusCodes.BAD_REQUEST
);
}
return {
dataSource,
marketPrice,
symbol,
date: startOfUtcDate,
state: 'CLOSE'
};
}
); );
return this.marketDataService.updateMany({ return this.marketDataService.updateMany({

3
libs/common/src/lib/dtos/update-bulk-market-data.dto.ts

@ -1,11 +1,12 @@
import { UpdateMarketDataDto } from '@ghostfolio/common/dtos'; import { UpdateMarketDataDto } from '@ghostfolio/common/dtos';
import { Type } from 'class-transformer'; import { Type } from 'class-transformer';
import { ArrayNotEmpty, IsArray } from 'class-validator'; import { ArrayNotEmpty, IsArray, ValidateNested } from 'class-validator';
export class UpdateBulkMarketDataDto { export class UpdateBulkMarketDataDto {
@ArrayNotEmpty() @ArrayNotEmpty()
@IsArray() @IsArray()
@Type(() => UpdateMarketDataDto) @Type(() => UpdateMarketDataDto)
@ValidateNested({ each: true })
marketData: UpdateMarketDataDto[]; marketData: UpdateMarketDataDto[];
} }

5
libs/common/src/lib/dtos/update-market-data.dto.ts

@ -1,9 +1,8 @@
import { IsISO8601, IsNumber, IsOptional } from 'class-validator'; import { IsISO8601, IsNumber } from 'class-validator';
export class UpdateMarketDataDto { export class UpdateMarketDataDto {
@IsISO8601() @IsISO8601()
@IsOptional() date: string;
date?: string;
@IsNumber() @IsNumber()
marketPrice: number; marketPrice: number;

2
libs/common/src/lib/helper.ts

@ -403,7 +403,7 @@ export function getNumberFormatGroup(aLocale = getLocale()) {
})?.value; })?.value;
} }
export function getStartOfUtcDate(aDate: Date) { export function getStartOfUtcDate(aDate: Date | string) {
const date = new Date(aDate); const date = new Date(aDate);
date.setUTCHours(0, 0, 0, 0); date.setUTCHours(0, 0, 0, 0);

Loading…
Cancel
Save