Browse Source

Improve historical market data import

pull/2559/head
Thomas 2 years ago
parent
commit
04a7c2625a
  1. 7
      apps/api/src/app/admin/admin.controller.ts
  2. 6
      apps/api/src/app/admin/update-market-data.dto.ts
  3. 12
      apps/client/src/app/components/admin-market-data-detail/market-data-detail-dialog/market-data-detail-dialog.component.ts
  4. 6
      apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
  5. 19
      apps/client/src/app/services/admin.service.ts

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

@ -7,7 +7,10 @@ import {
GATHER_ASSET_PROFILE_PROCESS, GATHER_ASSET_PROFILE_PROCESS,
GATHER_ASSET_PROFILE_PROCESS_OPTIONS GATHER_ASSET_PROFILE_PROCESS_OPTIONS
} from '@ghostfolio/common/config'; } from '@ghostfolio/common/config';
import { getAssetProfileIdentifier } from '@ghostfolio/common/helper'; import {
getAssetProfileIdentifier,
resetHours
} from '@ghostfolio/common/helper';
import { import {
AdminData, AdminData,
AdminMarketData, AdminMarketData,
@ -331,9 +334,9 @@ export class AdminController {
const dataBulkUpdate: Prisma.MarketDataUpdateInput[] = data.marketData.map( const dataBulkUpdate: Prisma.MarketDataUpdateInput[] = data.marketData.map(
({ date, marketPrice }) => ({ ({ date, marketPrice }) => ({
dataSource, dataSource,
date,
marketPrice, marketPrice,
symbol, symbol,
date: resetHours(parseISO(date)),
state: 'CLOSE' state: 'CLOSE'
}) })
); );

6
apps/api/src/app/admin/update-market-data.dto.ts

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

12
apps/client/src/app/components/admin-market-data-detail/market-data-detail-dialog/market-data-detail-dialog.component.ts

@ -57,10 +57,16 @@ export class MarketDataDetailDialog implements OnDestroy {
public onUpdate() { public onUpdate() {
this.adminService this.adminService
.putMarketData({ .postMarketData({
dataSource: this.data.dataSource, dataSource: this.data.dataSource,
date: this.data.date, marketData: {
marketData: { marketPrice: this.data.marketPrice }, marketData: [
{
date: this.data.date.toISOString(),
marketPrice: this.data.marketPrice
}
]
},
symbol: this.data.symbol symbol: this.data.symbol
}) })
.pipe(takeUntil(this.unsubscribeSubject)) .pipe(takeUntil(this.unsubscribeSubject))

6
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts

@ -11,7 +11,7 @@ import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
import { UpdateAssetProfileDto } from '@ghostfolio/api/app/admin/update-asset-profile.dto'; import { UpdateAssetProfileDto } from '@ghostfolio/api/app/admin/update-asset-profile.dto';
import { AdminService } from '@ghostfolio/client/services/admin.service'; import { AdminService } from '@ghostfolio/client/services/admin.service';
import { DataService } from '@ghostfolio/client/services/data.service'; import { DataService } from '@ghostfolio/client/services/data.service';
import { DATE_FORMAT } from '@ghostfolio/common/helper'; import { DATE_FORMAT, parseDate } from '@ghostfolio/common/helper';
import { import {
AdminMarketDataDetails, AdminMarketDataDetails,
UniqueAsset UniqueAsset
@ -23,7 +23,7 @@ import {
MarketData, MarketData,
SymbolProfile SymbolProfile
} from '@prisma/client'; } from '@prisma/client';
import { format, parseISO } from 'date-fns'; import { format } from 'date-fns';
import { parse as csvToJson } from 'papaparse'; import { parse as csvToJson } from 'papaparse';
import { Subject } from 'rxjs'; import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators'; import { takeUntil } from 'rxjs/operators';
@ -174,7 +174,7 @@ export class AssetProfileDialog implements OnDestroy, OnInit {
dataSource: this.data.dataSource, dataSource: this.data.dataSource,
marketData: { marketData: {
marketData: marketData.map(({ date, marketPrice }) => { marketData: marketData.map(({ date, marketPrice }) => {
return { marketPrice, date: parseISO(date) }; return { marketPrice, date: parseDate(date).toISOString() };
}) })
}, },
symbol: this.data.symbol symbol: this.data.symbol

19
apps/client/src/app/services/admin.service.ts

@ -247,25 +247,6 @@ export class AdminService {
return this.http.post<Tag>(`/api/v1/tag`, aTag); return this.http.post<Tag>(`/api/v1/tag`, aTag);
} }
public putMarketData({
dataSource,
date,
marketData,
symbol
}: {
dataSource: DataSource;
date: Date;
marketData: UpdateMarketDataDto;
symbol: string;
}) {
const url = `/api/v1/admin/market-data/${dataSource}/${symbol}/${format(
date,
DATE_FORMAT
)}`;
return this.http.put<MarketData>(url, marketData);
}
public putPlatform(aPlatform: UpdatePlatformDto) { public putPlatform(aPlatform: UpdatePlatformDto) {
return this.http.put<Platform>( return this.http.put<Platform>(
`/api/v1/platform/${aPlatform.id}`, `/api/v1/platform/${aPlatform.id}`,

Loading…
Cancel
Save