From dd090b57997766a5e8dd3fe7663185da69806f5d Mon Sep 17 00:00:00 2001 From: Thomas <4159106+dtslvr@users.noreply.github.com> Date: Tue, 1 Mar 2022 20:28:26 +0100 Subject: [PATCH] Eliminate data source from order model --- apps/api/src/app/export/export.service.ts | 1 - apps/api/src/app/import/import-data.dto.ts | 3 +-- apps/api/src/app/import/import.service.ts | 9 ++++---- apps/api/src/app/order/order.controller.ts | 8 +++++++ apps/api/src/app/order/order.service.ts | 10 +++++--- .../app/portfolio/portfolio.service-new.ts | 4 ++-- .../src/app/portfolio/portfolio.service.ts | 4 ++-- .../src/services/data-gathering.service.ts | 23 ++++++++++++------- prisma/schema.prisma | 1 - 9 files changed, 40 insertions(+), 23 deletions(-) diff --git a/apps/api/src/app/export/export.service.ts b/apps/api/src/app/export/export.service.ts index b540fe363..ee5a750b0 100644 --- a/apps/api/src/app/export/export.service.ts +++ b/apps/api/src/app/export/export.service.ts @@ -19,7 +19,6 @@ export class ExportService { select: { accountId: true, currency: true, - dataSource: true, date: true, fee: true, id: true, diff --git a/apps/api/src/app/import/import-data.dto.ts b/apps/api/src/app/import/import-data.dto.ts index fa1b3aa99..488ac786f 100644 --- a/apps/api/src/app/import/import-data.dto.ts +++ b/apps/api/src/app/import/import-data.dto.ts @@ -1,5 +1,4 @@ import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto'; -import { Order } from '@prisma/client'; import { Type } from 'class-transformer'; import { IsArray, ValidateNested } from 'class-validator'; @@ -7,5 +6,5 @@ export class ImportDataDto { @IsArray() @Type(() => CreateOrderDto) @ValidateNested({ each: true }) - orders: Order[]; + orders: CreateOrderDto[]; } diff --git a/apps/api/src/app/import/import.service.ts b/apps/api/src/app/import/import.service.ts index 7d0f152b2..6005b0725 100644 --- a/apps/api/src/app/import/import.service.ts +++ b/apps/api/src/app/import/import.service.ts @@ -3,8 +3,8 @@ import { OrderService } from '@ghostfolio/api/app/order/order.service'; import { ConfigurationService } from '@ghostfolio/api/services/configuration.service'; import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; import { Injectable } from '@nestjs/common'; -import { Order } from '@prisma/client'; import { isSameDay, parseISO } from 'date-fns'; +import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto'; @Injectable() export class ImportService { @@ -19,7 +19,7 @@ export class ImportService { orders, userId }: { - orders: Partial[]; + orders: Partial[]; userId: string; }): Promise { for (const order of orders) { @@ -85,7 +85,7 @@ export class ImportService { orders, userId }: { - orders: Partial[]; + orders: Partial[]; userId: string; }) { if ( @@ -99,6 +99,7 @@ export class ImportService { } const existingOrders = await this.orderService.orders({ + include: { SymbolProfile: true }, orderBy: { date: 'desc' }, where: { userId } }); @@ -110,7 +111,7 @@ export class ImportService { const duplicateOrder = existingOrders.find((order) => { return ( order.currency === currency && - order.dataSource === dataSource && + order.SymbolProfile.dataSource === dataSource && isSameDay(order.date, parseISO((date))) && order.fee === fee && order.quantity === quantity && diff --git a/apps/api/src/app/order/order.controller.ts b/apps/api/src/app/order/order.controller.ts index 58a043b82..3bcbc5f6e 100644 --- a/apps/api/src/app/order/order.controller.ts +++ b/apps/api/src/app/order/order.controller.ts @@ -171,6 +171,14 @@ export class OrderController { id_userId: { id: accountId, userId: this.request.user.id } } }, + SymbolProfile: { + connect: { + dataSource_symbol: { + dataSource: data.dataSource, + symbol: data.symbol + } + } + }, User: { connect: { id: this.request.user.id } } }, where: { diff --git a/apps/api/src/app/order/order.service.ts b/apps/api/src/app/order/order.service.ts index 2613c2c13..79fe5485a 100644 --- a/apps/api/src/app/order/order.service.ts +++ b/apps/api/src/app/order/order.service.ts @@ -53,7 +53,11 @@ export class OrderService { } public async createOrder( - data: Prisma.OrderCreateInput & { accountId?: string; userId: string } + data: Prisma.OrderCreateInput & { + accountId?: string; + dataSource: DataSource; + userId: string; + } ): Promise { const defaultAccount = ( await this.accountService.getAccounts(data.userId) @@ -228,9 +232,9 @@ export class OrderService { // Gather symbol data of order in the background, if not draft this.dataGatheringService.gatherSymbols([ { - dataSource: data.dataSource, + dataSource: data.SymbolProfile.connect.dataSource_symbol.dataSource, date: data.date, - symbol: data.symbol + symbol: data.SymbolProfile.connect.dataSource_symbol.symbol } ]); } diff --git a/apps/api/src/app/portfolio/portfolio.service-new.ts b/apps/api/src/app/portfolio/portfolio.service-new.ts index e078c5410..a2f866456 100644 --- a/apps/api/src/app/portfolio/portfolio.service-new.ts +++ b/apps/api/src/app/portfolio/portfolio.service-new.ts @@ -461,7 +461,7 @@ export class PortfolioServiceNew { }) .map((order) => ({ currency: order.currency, - dataSource: order.SymbolProfile?.dataSource ?? order.dataSource, + dataSource: order.SymbolProfile.dataSource, date: format(order.date, DATE_FORMAT), fee: new Big(order.fee), name: order.SymbolProfile?.name, @@ -1118,7 +1118,7 @@ export class PortfolioServiceNew { const portfolioOrders: PortfolioOrder[] = orders.map((order) => ({ currency: order.currency, - dataSource: order.SymbolProfile?.dataSource ?? order.dataSource, + dataSource: order.SymbolProfile.dataSource, date: format(order.date, DATE_FORMAT), fee: new Big( this.exchangeRateDataService.toCurrency( diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index 108c55d27..244009c4a 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -449,7 +449,7 @@ export class PortfolioService { }) .map((order) => ({ currency: order.currency, - dataSource: order.SymbolProfile?.dataSource ?? order.dataSource, + dataSource: order.SymbolProfile.dataSource, date: format(order.date, DATE_FORMAT), fee: new Big(order.fee), name: order.SymbolProfile?.name, @@ -1081,7 +1081,7 @@ export class PortfolioService { const portfolioOrders: PortfolioOrder[] = orders.map((order) => ({ currency: order.currency, - dataSource: order.SymbolProfile?.dataSource ?? order.dataSource, + dataSource: order.SymbolProfile.dataSource, date: format(order.date, DATE_FORMAT), fee: new Big( this.exchangeRateDataService.toCurrency( diff --git a/apps/api/src/services/data-gathering.service.ts b/apps/api/src/services/data-gathering.service.ts index 9292709c3..f78b7495f 100644 --- a/apps/api/src/services/data-gathering.service.ts +++ b/apps/api/src/services/data-gathering.service.ts @@ -552,16 +552,23 @@ export class DataGatheringService { const distinctOrders = await this.prismaService.order.findMany({ distinct: ['symbol'], orderBy: [{ symbol: 'asc' }], - select: { dataSource: true, symbol: true } + select: { SymbolProfile: true } }); - return distinctOrders.filter((distinctOrder) => { - return ( - distinctOrder.dataSource !== DataSource.GHOSTFOLIO && - distinctOrder.dataSource !== DataSource.MANUAL && - distinctOrder.dataSource !== DataSource.RAKUTEN - ); - }); + return distinctOrders + .filter((distinctOrder) => { + return ( + distinctOrder.SymbolProfile.dataSource !== DataSource.GHOSTFOLIO && + distinctOrder.SymbolProfile.dataSource !== DataSource.MANUAL && + distinctOrder.SymbolProfile.dataSource !== DataSource.RAKUTEN + ); + }) + .map((distinctOrder) => { + return { + dataSource: distinctOrder.SymbolProfile.dataSource, + symbol: distinctOrder.SymbolProfile.symbol + }; + }); } private async isDataGatheringNeeded() { diff --git a/prisma/schema.prisma b/prisma/schema.prisma index bea0e3381..4aa1e8851 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -75,7 +75,6 @@ model Order { accountUserId String? createdAt DateTime @default(now()) currency String? - dataSource DataSource? date DateTime fee Float id String @default(uuid())