Browse Source

Add state (CLOSE / INTRADAY) to MarketData

pull/1893/head
Thomas 2 years ago
parent
commit
d5eef71830
  1. 2
      apps/api/src/app/admin/admin.controller.ts
  2. 5
      apps/api/src/app/portfolio/current-rate.service.spec.ts
  3. 27
      apps/api/src/services/data-gathering/data-gathering.processor.ts
  4. 3
      apps/api/src/services/data-gathering/data-gathering.service.ts
  5. 3
      apps/api/src/services/data-provider/data-provider.service.ts
  6. 26
      apps/api/src/services/market-data/market-data.service.ts
  7. 5
      prisma/migrations/20230424194009_added_state_to_market_data/migration.sql
  8. 16
      prisma/schema.prisma

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

@ -317,7 +317,7 @@ export class AdminController {
const date = new Date(dateString);
return this.marketDataService.updateMarketData({
data: { ...data, dataSource },
data: { marketPrice: data.marketPrice, state: 'CLOSE' },
where: {
dataSource_date_symbol: {
dataSource,

5
apps/api/src/app/portfolio/current-rate.service.spec.ts

@ -18,7 +18,8 @@ jest.mock('@ghostfolio/api/services/market-data/market-data.service', () => {
createdAt: date,
dataSource: DataSource.YAHOO,
id: 'aefcbe3a-ee10-4c4f-9f2d-8ffad7b05584',
marketPrice: 1847.839966
marketPrice: 1847.839966,
state: 'CLOSE'
});
},
getRange: ({
@ -37,6 +38,7 @@ jest.mock('@ghostfolio/api/services/market-data/market-data.service', () => {
date: dateRangeStart,
id: '8fa48fde-f397-4b0d-adbc-fb940e830e6d',
marketPrice: 1841.823902,
state: 'CLOSE',
symbol: symbols[0]
},
{
@ -45,6 +47,7 @@ jest.mock('@ghostfolio/api/services/market-data/market-data.service', () => {
date: dateRangeEnd,
id: '082d6893-df27-4c91-8a5d-092e84315b56',
marketPrice: 1847.839966,
state: 'CLOSE',
symbol: symbols[0]
}
]);

27
apps/api/src/services/data-gathering/data-gathering.processor.ts

@ -6,8 +6,9 @@ import {
GATHER_ASSET_PROFILE_PROCESS,
GATHER_HISTORICAL_MARKET_DATA_PROCESS
} from '@ghostfolio/common/config';
import { DATE_FORMAT } from '@ghostfolio/common/helper';
import { DATE_FORMAT, getStartOfUtcDate } from '@ghostfolio/common/helper';
import { UniqueAsset } from '@ghostfolio/common/interfaces';
import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service';
import { Process, Processor } from '@nestjs/bull';
import { Injectable, Logger } from '@nestjs/common';
import { Job } from 'bull';
@ -28,7 +29,7 @@ export class DataGatheringProcessor {
public constructor(
private readonly dataGatheringService: DataGatheringService,
private readonly dataProviderService: DataProviderService,
private readonly prismaService: PrismaService
private readonly marketDataService: MarketDataService
) {}
@Process(GATHER_ASSET_PROFILE_PROCESS)
@ -83,19 +84,17 @@ export class DataGatheringProcessor {
if (lastMarketPrice) {
try {
await this.prismaService.marketData.create({
await this.marketDataService.updateMarketData({
data: {
dataSource,
symbol,
date: new Date(
Date.UTC(
getYear(currentDate),
getMonth(currentDate),
getDate(currentDate),
0
)
),
marketPrice: lastMarketPrice
marketPrice: lastMarketPrice,
state: 'CLOSE'
},
where: {
dataSource_date_symbol: {
dataSource,
symbol,
date: getStartOfUtcDate(currentDate)
}
}
});
} catch {}

3
apps/api/src/services/data-gathering/data-gathering.service.ts

@ -271,7 +271,8 @@ export class DataGatheringService {
by: ['symbol'],
orderBy: [{ symbol: 'asc' }],
where: {
date: { gt: startDate }
date: { gt: startDate },
state: 'CLOSE'
}
})
)

3
apps/api/src/services/data-provider/data-provider.service.ts

@ -291,7 +291,8 @@ export class DataProviderService {
symbol,
dataSource: response[symbol].dataSource,
date: getStartOfUtcDate(new Date()),
marketPrice: response[symbol].marketPrice
marketPrice: response[symbol].marketPrice,
state: 'INTRADAY'
};
})
});

26
apps/api/src/services/market-data/market-data.service.ts

@ -5,7 +5,12 @@ import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service';
import { resetHours } from '@ghostfolio/common/helper';
import { UniqueAsset } from '@ghostfolio/common/interfaces';
import { Injectable } from '@nestjs/common';
import { DataSource, MarketData, Prisma } from '@prisma/client';
import {
DataSource,
MarketData,
MarketDataState,
Prisma
} from '@prisma/client';
@Injectable()
export class MarketDataService {
@ -92,7 +97,9 @@ export class MarketDataService {
}
public async updateMarketData(params: {
data: { dataSource: DataSource } & UpdateMarketDataDto;
data: {
state: MarketDataState;
} & UpdateMarketDataDto;
where: Prisma.MarketDataWhereUniqueInput;
}): Promise<MarketData> {
const { data, where } = params;
@ -100,12 +107,13 @@ export class MarketDataService {
return this.prismaService.marketData.upsert({
where,
create: {
dataSource: data.dataSource,
dataSource: where.dataSource_date_symbol.dataSource,
date: where.dataSource_date_symbol.date,
marketPrice: data.marketPrice,
symbol: where.dataSource_date_symbol.symbol
symbol: where.dataSource_date_symbol.symbol,
state: data.state
},
update: { marketPrice: data.marketPrice }
update: { marketPrice: data.marketPrice, state: data.state }
});
}
@ -119,16 +127,18 @@ export class MarketDataService {
data: Prisma.MarketDataUpdateInput[];
}): Promise<MarketData[]> {
const upsertPromises = data.map(
({ dataSource, date, marketPrice, symbol }) => {
({ dataSource, date, marketPrice, symbol, state }) => {
return this.prismaService.marketData.upsert({
create: {
dataSource: <DataSource>dataSource,
date: <Date>date,
marketPrice: <number>marketPrice,
symbol: <string>symbol
symbol: <string>symbol,
state: <MarketDataState>state
},
update: {
marketPrice: <number>marketPrice
marketPrice: <number>marketPrice,
state: <MarketDataState>state
},
where: {
dataSource_date_symbol: {

5
prisma/migrations/20230424194009_added_state_to_market_data/migration.sql

@ -0,0 +1,5 @@
-- CreateEnum
CREATE TYPE "MarketDataState" AS ENUM ('CLOSE', 'INTRADAY');
-- AlterTable
ALTER TABLE "MarketData" ADD COLUMN "state" "MarketDataState" NOT NULL DEFAULT 'CLOSE';

16
prisma/schema.prisma

@ -59,10 +59,11 @@ model AuthDevice {
}
model MarketData {
createdAt DateTime @default(now())
createdAt DateTime @default(now())
dataSource DataSource
date DateTime
id String @id @default(uuid())
id String @id @default(uuid())
state MarketDataState @default(CLOSE)
symbol String
marketPrice Float
@ -214,9 +215,9 @@ enum DataSource {
YAHOO
}
enum ViewMode {
DEFAULT
ZEN
enum MarketDataState {
CLOSE
INTRADAY
}
enum Provider {
@ -237,3 +238,8 @@ enum Type {
ITEM
SELL
}
enum ViewMode {
DEFAULT
ZEN
}

Loading…
Cancel
Save