diff --git a/apps/api/src/app/account/account.controller.ts b/apps/api/src/app/account/account.controller.ts index 4666e5084..04d688d38 100644 --- a/apps/api/src/app/account/account.controller.ts +++ b/apps/api/src/app/account/account.controller.ts @@ -194,6 +194,24 @@ export class AccountController { return id; }); + const fromAccountBalance = accountsOfUser.find( + (account) => account.id === accountIdFrom + ).balance; + + if (fromAccountBalance < balance) { + throw new HttpException( + getReasonPhrase(StatusCodes.BAD_REQUEST), + StatusCodes.BAD_REQUEST + ); + } + + if (accountIdFrom === accountIdTo) { + throw new HttpException( + getReasonPhrase(StatusCodes.BAD_REQUEST), + StatusCodes.BAD_REQUEST + ); + } + if ( ![accountIdFrom, accountIdTo].every((accountId) => { return currentAccountIds.includes(accountId); diff --git a/apps/client/src/app/pages/accounts/accounts-page.component.ts b/apps/client/src/app/pages/accounts/accounts-page.component.ts index 61db47577..fd40f8afb 100644 --- a/apps/client/src/app/pages/accounts/accounts-page.component.ts +++ b/apps/client/src/app/pages/accounts/accounts-page.component.ts @@ -283,7 +283,6 @@ export class AccountsPageComponent implements OnDestroy, OnInit { data: { accounts: this.accounts }, - height: this.deviceType === 'mobile' ? '97.5vh' : '80vh', width: this.deviceType === 'mobile' ? '100vw' : '50rem' }); diff --git a/apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.component.ts b/apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.component.ts index 4850e96e3..8fc4e1379 100644 --- a/apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.component.ts +++ b/apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.component.ts @@ -4,7 +4,13 @@ import { Inject, OnDestroy } from '@angular/core'; -import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { + AbstractControl, + FormBuilder, + FormGroup, + ValidationErrors, + Validators +} from '@angular/forms'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { TransferBalanceDto } from '@ghostfolio/api/app/account/transfer-balance.dto'; import { Account } from '@prisma/client'; @@ -35,11 +41,16 @@ export class TransferBalanceDialog implements OnDestroy { public ngOnInit() { this.accounts = this.data.accounts; - this.transferBalanceForm = this.formBuilder.group({ - balance: [0, Validators.required], - fromAccount: ['', Validators.required], - toAccount: ['', Validators.required] - }); + this.transferBalanceForm = this.formBuilder.group( + { + balance: ['', Validators.required], + fromAccount: ['', Validators.required], + toAccount: ['', Validators.required] + }, + { + validators: this.compareAccounts + } + ); this.transferBalanceForm.get('fromAccount').valueChanges.subscribe((id) => { this.currency = this.accounts.find((account) => { @@ -66,4 +77,13 @@ export class TransferBalanceDialog implements OnDestroy { this.unsubscribeSubject.next(); this.unsubscribeSubject.complete(); } + + private compareAccounts(control: AbstractControl): ValidationErrors { + const accountFrom = control.get('fromAccount'); + const accountTo = control.get('toAccount'); + + if (accountFrom.value === accountTo.value) { + return { invalid: true }; + } + } }