Feature/validate duplicate orders for import (#416)

* Validate duplicate orders

* Update changelog
pull/418/head
Thomas Kaul 3 years ago committed by GitHub
parent 4ab6a1a071
commit f06a0fbbee
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Extended the validation of the import functionality for transactions
- Valid data types
- Maximum number of orders
- No duplicate orders
- Data provider service returns data for the `dataSource` / `symbol` pair
### Changed

@ -2,7 +2,7 @@ import { OrderService } from '@ghostfolio/api/app/order/order.service';
import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service';
import { Injectable } from '@nestjs/common';
import { Order } from '@prisma/client';
import { parseISO } from 'date-fns';
import { isSameDay, parseISO } from 'date-fns';
@Injectable()
export class ImportService {
@ -20,7 +20,7 @@ export class ImportService {
orders: Partial<Order>[];
userId: string;
}): Promise<void> {
await this.validateOrders(orders);
await this.validateOrders({ orders, userId });
for (const {
accountId,
@ -52,12 +52,43 @@ export class ImportService {
}
}
private async validateOrders(orders: Partial<Order>[]) {
private async validateOrders({
orders,
userId
}: {
orders: Partial<Order>[];
userId: string;
}) {
if (orders?.length > ImportService.MAX_ORDERS_TO_IMPORT) {
throw new Error('Too many transactions');
}
for (const { dataSource, symbol } of orders) {
const existingOrders = await this.orderService.orders({
orderBy: { date: 'desc' },
where: { userId }
});
for (const [
index,
{ currency, dataSource, date, fee, quantity, symbol, type, unitPrice }
] of orders.entries()) {
const duplicateOrder = existingOrders.find((order) => {
return (
order.currency === currency &&
order.dataSource === dataSource &&
isSameDay(order.date, parseISO(<string>(<unknown>date))) &&
order.fee === fee &&
order.quantity === quantity &&
order.symbol === symbol &&
order.type === type &&
order.unitPrice === unitPrice
);
});
if (duplicateOrder) {
throw new Error(`orders.${index} is a duplicate transaction`);
}
const result = await this.dataProviderService.get([
{ dataSource, symbol }
]);

Loading…
Cancel
Save