diff --git a/apps/api/src/app/import/import.service.ts b/apps/api/src/app/import/import.service.ts index b9ca5eccd..7d6794c6f 100644 --- a/apps/api/src/app/import/import.service.ts +++ b/apps/api/src/app/import/import.service.ts @@ -117,18 +117,17 @@ export class ImportService { }): Promise { const accountIdMapping: { [oldAccountId: string]: string } = {}; - const existingAccounts = await this.accountService.accounts({ - where: { - id: { - in: accountsDto.map(({ id }) => { - return id; - }) + if (!isDryRun && accountsDto?.length) { + const existingAccounts = await this.accountService.accounts({ + where: { + id: { + in: accountsDto.map(({ id }) => { + return id; + }) + } } - } - }); + }); - // Create new accounts during dryRun so that new account IDs don't get invalidated - if (isDryRun && accountsDto?.length) { for (const account of accountsDto) { // Check if there is any existing account with the same ID const accountWithSameId = existingAccounts.find( @@ -181,7 +180,7 @@ export class ImportService { } // If a new account is created, then update the accountId in all activities - if (isDryRun) { + if (!isDryRun) { if (Object.keys(accountIdMapping).includes(activity.accountId)) { activity.accountId = accountIdMapping[activity.accountId]; } @@ -200,6 +199,10 @@ export class ImportService { } ); + if (isDryRun) { + accountsDto.forEach((accountsDto) => accountIds.push(accountsDto.id)); + } + const activities: Activity[] = []; for (const { diff --git a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts index b4e118a30..7bfa9aa37 100644 --- a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts +++ b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts @@ -11,6 +11,7 @@ import { MatLegacyDialogRef as MatDialogRef } from '@angular/material/legacy-dialog'; import { MatLegacySnackBar as MatSnackBar } from '@angular/material/legacy-snack-bar'; +import { CreateAccountDto } from '@ghostfolio/api/app/account/create-account.dto'; import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { DataService } from '@ghostfolio/client/services/data.service'; import { ImportActivitiesService } from '@ghostfolio/client/services/import-activities.service'; @@ -28,6 +29,7 @@ import { ImportActivitiesDialogParams } from './interfaces/interfaces'; templateUrl: 'import-activities-dialog.html' }) export class ImportActivitiesDialog implements OnDestroy { + public accounts: CreateAccountDto[] = []; public activities: Activity[] = []; public details: any[] = []; public errorMessages: string[] = []; @@ -92,6 +94,7 @@ export class ImportActivitiesDialog implements OnDestroy { this.snackBar.open('⏳ ' + $localize`Importing data...`); await this.importActivitiesService.importSelectedActivities({ + accounts: this.accounts, activities: this.selectedActivities }); @@ -163,6 +166,8 @@ export class ImportActivitiesDialog implements OnDestroy { if (file.name.endsWith('.json')) { const content = JSON.parse(fileContent); + this.accounts = content.accounts; + if (!isArray(content.activities)) { if (isArray(content.orders)) { this.handleImportError({ diff --git a/apps/client/src/app/services/import-activities.service.ts b/apps/client/src/app/services/import-activities.service.ts index d3ac9b2fb..3b76b44b1 100644 --- a/apps/client/src/app/services/import-activities.service.ts +++ b/apps/client/src/app/services/import-activities.service.ts @@ -96,11 +96,14 @@ export class ImportActivitiesService { } public importSelectedActivities({ + accounts, activities }: { + accounts: CreateAccountDto[]; activities: Activity[]; }): Promise<{ activities: Activity[]; + accounts?: CreateAccountDto[]; }> { const importData: CreateOrderDto[] = []; @@ -108,7 +111,7 @@ export class ImportActivitiesService { importData.push(this.convertToCreateOrderDto(activity)); } - return this.importJson({ activities: importData }); + return this.importJson({ accounts, activities: importData }); } private convertToCreateOrderDto({