From 3cd8f097633c1a5623c5764c3a35cef757c1334a Mon Sep 17 00:00:00 2001 From: Sonlis Date: Tue, 16 Apr 2024 21:50:03 +0300 Subject: [PATCH] Add Data validation on server, several cleanups on client --- .../account-balance.controller.ts | 15 ++++--- .../create-account-balance.dto.ts | 44 +++++++++++++++++++ .../account-detail-dialog.component.ts | 4 +- apps/client/src/app/services/data.service.ts | 10 +---- .../account-balances.component.ts | 4 +- 5 files changed, 57 insertions(+), 20 deletions(-) create mode 100644 apps/api/src/app/account-balance/create-account-balance.dto.ts diff --git a/apps/api/src/app/account-balance/account-balance.controller.ts b/apps/api/src/app/account-balance/account-balance.controller.ts index a64217025..a853148b5 100644 --- a/apps/api/src/app/account-balance/account-balance.controller.ts +++ b/apps/api/src/app/account-balance/account-balance.controller.ts @@ -19,6 +19,7 @@ import { AccountBalance } from '@prisma/client'; import { StatusCodes, getReasonPhrase } from 'http-status-codes'; import { AccountBalanceService } from './account-balance.service'; +import { CreateAccountBalanceDto } from './create-account-balance.dto'; @Controller('account-balance') export class AccountBalanceController { @@ -53,21 +54,21 @@ export class AccountBalanceController { @Post() @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async createAccountBalance( - @Body() body: any + @Body() data: CreateAccountBalanceDto ): Promise { - const account = body.Account.connect.id_userId; - const data = { + const account = data.Account.connect.id_userId; + const body = { Account: { connect: { id_userId: { id: account.id, - userId: account.userId + userId: this.request.user.id } } }, - value: body.balance, - date: body.date + value: data.balance, + date: data.date }; - return this.accountBalanceService.createAccountBalance(data); + return this.accountBalanceService.createAccountBalance(body); } } diff --git a/apps/api/src/app/account-balance/create-account-balance.dto.ts b/apps/api/src/app/account-balance/create-account-balance.dto.ts new file mode 100644 index 000000000..eb516fb3c --- /dev/null +++ b/apps/api/src/app/account-balance/create-account-balance.dto.ts @@ -0,0 +1,44 @@ +import { Type } from 'class-transformer'; +import { + IsISO8601, + IsNotEmptyObject, + IsNumber, + IsObject, + IsString, + ValidateNested +} from 'class-validator'; + +export class Id_UserId { + @IsString() + id: string; +} + +export class Connect { + @IsNotEmptyObject() + @IsObject() + @ValidateNested() + @Type(() => Id_UserId) + id_userId: Id_UserId; +} + +export class Account { + @IsNotEmptyObject() + @IsObject() + @ValidateNested() + @Type(() => Connect) + connect: Connect; +} + +export class CreateAccountBalanceDto { + @IsNotEmptyObject() + @IsObject() + @ValidateNested() + @Type(() => Account) + Account: Account; + + @IsNumber() + balance: number; + + @IsISO8601() + date: string; +} diff --git a/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts b/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts index d0f3aa242..448cc77d5 100644 --- a/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts +++ b/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts @@ -150,10 +150,8 @@ export class AccountDetailDialog implements OnDestroy, OnInit { const formattedDate = new Date(date); this.dataService .postAccountBalance({ - userId: this.user.id, accountId: this.data.accountId, - balance: balance, - currency: this.currency, + balance, date: formattedDate }) .pipe(takeUntil(this.unsubscribeSubject)) diff --git a/apps/client/src/app/services/data.service.ts b/apps/client/src/app/services/data.service.ts index c2845a117..c71aab67a 100644 --- a/apps/client/src/app/services/data.service.ts +++ b/apps/client/src/app/services/data.service.ts @@ -614,26 +614,20 @@ export class DataService { public postAccountBalance({ date, accountId, - balance, - currency, - userId + balance }: { date: Date; accountId: string; balance: number; - currency: string; - userId: string; }) { return this.http.post(`/api/v1/account-balance`, { Account: { connect: { id_userId: { - id: accountId, - userId + id: accountId } } }, - currency, date, balance: balance }); diff --git a/libs/ui/src/lib/account-balances/account-balances.component.ts b/libs/ui/src/lib/account-balances/account-balances.component.ts index 15750ea1c..0f3071785 100644 --- a/libs/ui/src/lib/account-balances/account-balances.component.ts +++ b/libs/ui/src/lib/account-balances/account-balances.component.ts @@ -79,13 +79,13 @@ export class GfAccountBalancesComponent private unsubscribeSubject = new Subject(); - public constructor(private dateAdapter: DateAdapter) {} - public accountBalanceForm = new FormGroup({ balance: new FormControl(0, Validators.required), date: new FormControl(new Date().toISOString(), Validators.required) }); + public constructor(private dateAdapter: DateAdapter) {} + public ngOnInit() { this.dateAdapter.setLocale(this.locale); }