From 35f8f19a3dad1e1d3208371f4d64bbee16b8fb3d Mon Sep 17 00:00:00 2001 From: gerardPolloRebozado Date: Fri, 10 May 2024 09:48:55 +0200 Subject: [PATCH] feat: Solved a problem where deleting all activites while having filter applied it deletes all the activites and not the ones that are filtered \ --- apps/api/src/app/order/order.controller.ts | 19 ++++-- apps/api/src/app/order/order.service.ts | 58 ++++++++++++++++++- .../activities/activities-page.component.ts | 9 +-- apps/client/src/app/services/data.service.ts | 9 ++- 4 files changed, 82 insertions(+), 13 deletions(-) diff --git a/apps/api/src/app/order/order.controller.ts b/apps/api/src/app/order/order.controller.ts index bf4920463..c75c546b3 100644 --- a/apps/api/src/app/order/order.controller.ts +++ b/apps/api/src/app/order/order.controller.ts @@ -31,7 +31,7 @@ import { } from '@nestjs/common'; import { REQUEST } from '@nestjs/core'; import { AuthGuard } from '@nestjs/passport'; -import { Order as OrderModel, Prisma } from '@prisma/client'; +import { AssetClass, Order as OrderModel, Prisma } from '@prisma/client'; import { parseISO } from 'date-fns'; import { StatusCodes, getReasonPhrase } from 'http-status-codes'; @@ -48,15 +48,24 @@ export class OrderController { private readonly impersonationService: ImpersonationService, private readonly orderService: OrderService, @Inject(REQUEST) private readonly request: RequestWithUser - ) {} + ) { } @Delete() @HasPermission(permissions.deleteOrder) @UseGuards(AuthGuard('jwt'), HasPermissionGuard) - public async deleteOrders(): Promise { - return this.orderService.deleteOrders({ - userId: this.request.user.id + public async deleteOrders( + @Query('accounts') filterByAccounts?: string, + @Query('assetClasses') filterByAssetClasses?: string, + @Query('tags') filterByTags?: string + ): Promise { + const filters = this.apiService.buildFiltersFromQueryParams({ + filterByAccounts, + filterByAssetClasses, + filterByTags }); + return this.orderService.deleteOrders({ + userId: this.request.user.id, + }, filters); } @Delete(':id') diff --git a/apps/api/src/app/order/order.service.ts b/apps/api/src/app/order/order.service.ts index e976fc80d..164eda3c2 100644 --- a/apps/api/src/app/order/order.service.ts +++ b/apps/api/src/app/order/order.service.ts @@ -194,7 +194,63 @@ export class OrderService { return order; } - public async deleteOrders(where: Prisma.OrderWhereInput): Promise { + public async deleteOrders(where: Prisma.OrderWhereInput, filters: Filter[]): Promise { + + const { + ACCOUNT: filtersByAccount, + ASSET_CLASS: filtersByAssetClass, + TAG: filtersByTag + } = groupBy(filters, (filter) => { + return filter.type; + }); + + if (filtersByAccount?.length > 0) { + where.accountId = { + in: filtersByAccount.map(({ id }) => { + return id; + }) + }; + } + + if (filtersByAssetClass?.length > 0) { + where.SymbolProfile = { + OR: [ + { + AND: [ + { + OR: filtersByAssetClass.map(({ id }) => { + return { assetClass: AssetClass[id] }; + }) + }, + { + OR: [ + { SymbolProfileOverrides: { is: null } }, + { SymbolProfileOverrides: { assetClass: null } } + ] + } + ] + }, + { + SymbolProfileOverrides: { + OR: filtersByAssetClass.map(({ id }) => { + return { assetClass: AssetClass[id] }; + }) + } + } + ] + }; + } + + if (filtersByTag?.length > 0) { + where.tags = { + some: { + OR: filtersByTag.map(({ id }) => { + return { id }; + }) + } + }; + } + const { count } = await this.prismaService.order.deleteMany({ where }); diff --git a/apps/client/src/app/pages/portfolio/activities/activities-page.component.ts b/apps/client/src/app/pages/portfolio/activities/activities-page.component.ts index f75bc260b..3101ecf40 100644 --- a/apps/client/src/app/pages/portfolio/activities/activities-page.component.ts +++ b/apps/client/src/app/pages/portfolio/activities/activities-page.component.ts @@ -171,7 +171,9 @@ export class ActivitiesPageComponent implements OnDestroy, OnInit { if (confirmation) { this.dataService - .deleteAllOrders() + .deleteAllOrders({ + filters: this.userService.getFilters() + }) .pipe(takeUntil(this.unsubscribeSubject)) .subscribe({ next: () => { @@ -217,9 +219,8 @@ export class ActivitiesPageComponent implements OnDestroy, OnInit { data.activities ), contentType: 'text/calendar', - fileName: `ghostfolio-draft${ - data.activities.length > 1 ? 's' : '' - }-${format(parseISO(data.meta.date), 'yyyyMMddHHmmss')}.ics`, + fileName: `ghostfolio-draft${data.activities.length > 1 ? 's' : '' + }-${format(parseISO(data.meta.date), 'yyyyMMddHHmmss')}.ics`, format: 'string' }); }); diff --git a/apps/client/src/app/services/data.service.ts b/apps/client/src/app/services/data.service.ts index 4f8615e41..6b61d8dd0 100644 --- a/apps/client/src/app/services/data.service.ts +++ b/apps/client/src/app/services/data.service.ts @@ -55,7 +55,7 @@ import { map } from 'rxjs/operators'; providedIn: 'root' }) export class DataService { - public constructor(private http: HttpClient) {} + public constructor(private http: HttpClient) { } public buildFiltersAsQueryParams({ filters }: { filters?: Filter[] }) { let params = new HttpParams(); @@ -256,8 +256,11 @@ export class DataService { return this.http.delete(`/api/v1/account-balance/${aId}`); } - public deleteAllOrders() { - return this.http.delete(`/api/v1/order/`); + public deleteAllOrders({ + filters + }) { + let params = this.buildFiltersAsQueryParams({ filters }); + return this.http.delete(`/api/v1/order`, { params }); } public deleteBenchmark({ dataSource, symbol }: UniqueAsset) {