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

112 lines
2.7 KiB
TypeScript
Raw Normal View History

import { UpdateMarketDataDto } from '@ghostfolio/api/app/admin/update-market-data.dto';
import { DateQuery } from '@ghostfolio/api/app/portfolio/interfaces/date-query.interface';
2021-07-03 16:37:33 +02:00
import { PrismaService } from '@ghostfolio/api/services/prisma.service';
2021-07-09 20:25:42 +02:00
import { resetHours } from '@ghostfolio/common/helper';
import { UniqueAsset } from '@ghostfolio/common/interfaces';
2021-07-03 16:37:33 +02:00
import { Injectable } from '@nestjs/common';
import { DataSource, MarketData, Prisma } from '@prisma/client';
2021-07-03 16:37:33 +02:00
@Injectable()
export class MarketDataService {
2021-08-07 22:38:07 +02:00
public constructor(private readonly prismaService: PrismaService) {}
2021-07-03 16:37:33 +02:00
public async deleteMany({ dataSource, symbol }: UniqueAsset) {
return this.prismaService.marketData.deleteMany({
where: {
dataSource,
symbol
}
});
}
2021-07-03 16:37:33 +02:00
public async get({
date,
symbol
}: {
date: Date;
symbol: string;
}): Promise<MarketData> {
2021-08-07 22:38:07 +02:00
return await this.prismaService.marketData.findFirst({
where: {
2021-07-28 15:32:36 +02:00
symbol,
date: resetHours(date)
}
2021-07-03 16:37:33 +02:00
});
}
public async getMax({ dataSource, symbol }: UniqueAsset): Promise<number> {
const aggregations = await this.prismaService.marketData.aggregate({
_max: {
marketPrice: true
},
where: {
dataSource,
symbol
}
});
return aggregations._max.marketPrice;
}
public async getRange({
dateQuery,
2021-07-20 20:42:56 +02:00
symbols
}: {
dateQuery: DateQuery;
2021-07-20 20:42:56 +02:00
symbols: string[];
}): Promise<MarketData[]> {
2021-08-07 22:38:07 +02:00
return await this.prismaService.marketData.findMany({
2021-07-20 21:07:17 +02:00
orderBy: [
{
date: 'asc'
},
{
symbol: 'asc'
}
],
where: {
date: dateQuery,
2021-07-20 20:42:56 +02:00
symbol: {
in: symbols
}
}
});
}
public async marketDataItems(params: {
skip?: number;
take?: number;
cursor?: Prisma.MarketDataWhereUniqueInput;
where?: Prisma.MarketDataWhereInput;
orderBy?: Prisma.MarketDataOrderByWithRelationInput;
}): Promise<MarketData[]> {
const { skip, take, cursor, where, orderBy } = params;
return this.prismaService.marketData.findMany({
cursor,
orderBy,
skip,
take,
where
});
}
public async updateMarketData(params: {
data: { dataSource: DataSource } & UpdateMarketDataDto;
where: Prisma.MarketDataWhereUniqueInput;
}): Promise<MarketData> {
const { data, where } = params;
return this.prismaService.marketData.upsert({
where,
create: {
dataSource: data.dataSource,
date: where.date_symbol.date,
marketPrice: data.marketPrice,
symbol: where.date_symbol.symbol
},
update: { marketPrice: data.marketPrice }
});
}
2021-07-03 16:37:33 +02:00
}