Browse Source

Refactoring

pull/3260/head
Thomas Kaul 1 year ago
parent
commit
0a9b54de16
  1. 28
      apps/api/src/app/account-balance/account-balance.controller.ts
  2. 3
      apps/api/src/app/account-balance/account-balance.module.ts
  3. 38
      apps/api/src/app/account-balance/create-account-balance.dto.ts
  4. 11
      apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts
  5. 26
      apps/client/src/app/services/data.service.ts
  6. 7
      libs/ui/src/lib/account-balances/account-balances.component.html
  7. 4
      libs/ui/src/lib/account-balances/account-balances.component.ts

28
apps/api/src/app/account-balance/account-balance.controller.ts

@ -1,3 +1,4 @@
import { AccountService } from '@ghostfolio/api/app/account/account.service';
import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator'; import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator';
import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard';
import { permissions } from '@ghostfolio/common/permissions'; import { permissions } from '@ghostfolio/common/permissions';
@ -25,6 +26,7 @@ import { CreateAccountBalanceDto } from './create-account-balance.dto';
export class AccountBalanceController { export class AccountBalanceController {
public constructor( public constructor(
private readonly accountBalanceService: AccountBalanceService, private readonly accountBalanceService: AccountBalanceService,
private readonly accountService: AccountService,
@Inject(REQUEST) private readonly request: RequestWithUser @Inject(REQUEST) private readonly request: RequestWithUser
) {} ) {}
@ -56,19 +58,31 @@ export class AccountBalanceController {
public async createAccountBalance( public async createAccountBalance(
@Body() data: CreateAccountBalanceDto @Body() data: CreateAccountBalanceDto
): Promise<AccountBalance> { ): Promise<AccountBalance> {
const account = data.Account.connect.id_userId; const account = await this.accountService.account({
const body = { id_userId: {
id: data.accountId,
userId: this.request.user.id
}
});
if (!account) {
throw new HttpException(
getReasonPhrase(StatusCodes.FORBIDDEN),
StatusCodes.FORBIDDEN
);
}
return this.accountBalanceService.createAccountBalance({
Account: { Account: {
connect: { connect: {
id_userId: { id_userId: {
id: account.id, id: account.id,
userId: this.request.user.id userId: account.userId
} }
} }
}, },
value: data.balance, date: data.date,
date: data.date value: data.balance
}; });
return this.accountBalanceService.createAccountBalance(body);
} }
} }

3
apps/api/src/app/account-balance/account-balance.module.ts

@ -1,3 +1,4 @@
import { AccountService } from '@ghostfolio/api/app/account/account.service';
import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module'; import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module';
import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module';
@ -10,6 +11,6 @@ import { AccountBalanceService } from './account-balance.service';
controllers: [AccountBalanceController], controllers: [AccountBalanceController],
exports: [AccountBalanceService], exports: [AccountBalanceService],
imports: [ExchangeRateDataModule, PrismaModule], imports: [ExchangeRateDataModule, PrismaModule],
providers: [AccountBalanceService] providers: [AccountBalanceService, AccountService]
}) })
export class AccountBalanceModule {} export class AccountBalanceModule {}

38
apps/api/src/app/account-balance/create-account-balance.dto.ts

@ -1,40 +1,8 @@
import { Type } from 'class-transformer'; import { IsISO8601, IsNumber, IsUUID } from 'class-validator';
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 { export class CreateAccountBalanceDto {
@IsNotEmptyObject() @IsUUID()
@IsObject() accountId: string;
@ValidateNested()
@Type(() => Account)
Account: Account;
@IsNumber() @IsNumber()
balance: number; balance: number;

11
apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts

@ -141,18 +141,17 @@ export class AccountDetailDialog implements OnDestroy, OnInit {
} }
public onAddAccountBalance({ public onAddAccountBalance({
date, balance,
balance date
}: { }: {
date: string;
balance: number; balance: number;
date: Date;
}) { }) {
const formattedDate = new Date(date);
this.dataService this.dataService
.postAccountBalance({ .postAccountBalance({
accountId: this.data.accountId,
balance, balance,
date: formattedDate date,
accountId: this.data.accountId
}) })
.pipe(takeUntil(this.unsubscribeSubject)) .pipe(takeUntil(this.unsubscribeSubject))
.subscribe({ .subscribe({

26
apps/client/src/app/services/data.service.ts

@ -42,7 +42,11 @@ import { translate } from '@ghostfolio/ui/i18n';
import { HttpClient, HttpParams } from '@angular/common/http'; import { HttpClient, HttpParams } from '@angular/common/http';
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { SortDirection } from '@angular/material/sort'; import { SortDirection } from '@angular/material/sort';
import { DataSource, Order as OrderModel } from '@prisma/client'; import {
AccountBalance,
DataSource,
Order as OrderModel
} from '@prisma/client';
import { format, parseISO } from 'date-fns'; import { format, parseISO } from 'date-fns';
import { cloneDeep, groupBy, isNumber } from 'lodash'; import { cloneDeep, groupBy, isNumber } from 'lodash';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
@ -612,24 +616,18 @@ export class DataService {
} }
public postAccountBalance({ public postAccountBalance({
date,
accountId, accountId,
balance balance,
date
}: { }: {
date: Date;
accountId: string; accountId: string;
balance: number; balance: number;
date: Date;
}) { }) {
return this.http.post<any>(`/api/v1/account-balance`, { return this.http.post<AccountBalance>(`/api/v1/account-balance`, {
Account: { accountId,
connect: { balance,
id_userId: { date
id: accountId
}
}
},
date,
balance: balance
}); });
} }

7
libs/ui/src/lib/account-balances/account-balances.component.html

@ -62,6 +62,7 @@
<button <button
class="mx-1 no-min-width px-2" class="mx-1 no-min-width px-2"
mat-button mat-button
type="button"
[matMenuTriggerFor]="accountBalanceMenu" [matMenuTriggerFor]="accountBalanceMenu"
(click)="$event.stopPropagation()" (click)="$event.stopPropagation()"
> >
@ -69,7 +70,11 @@
</button> </button>
} }
<mat-menu #accountBalanceMenu="matMenu" xPosition="before"> <mat-menu #accountBalanceMenu="matMenu" xPosition="before">
<button mat-menu-item (click)="onDeleteAccountBalance(element.id)"> <button
mat-menu-item
type="button"
(click)="onDeleteAccountBalance(element.id)"
>
<span class="align-items-center d-flex"> <span class="align-items-center d-flex">
<ion-icon class="mr-2" name="trash-outline" /> <ion-icon class="mr-2" name="trash-outline" />
<span i18n>Delete</span> <span i18n>Delete</span>

4
libs/ui/src/lib/account-balances/account-balances.component.ts

@ -64,7 +64,7 @@ export class GfAccountBalancesComponent
@Output() accountBalanceCreated = new EventEmitter<{ @Output() accountBalanceCreated = new EventEmitter<{
balance: number; balance: number;
date: string; date: Date;
}>(); }>();
@Output() accountBalanceDeleted = new EventEmitter<string>(); @Output() accountBalanceDeleted = new EventEmitter<string>();
@ -81,7 +81,7 @@ export class GfAccountBalancesComponent
public accountBalanceForm = new FormGroup({ public accountBalanceForm = new FormGroup({
balance: new FormControl(0, Validators.required), balance: new FormControl(0, Validators.required),
date: new FormControl(new Date().toISOString(), Validators.required) date: new FormControl(new Date(), Validators.required)
}); });
public constructor(private dateAdapter: DateAdapter<any>) {} public constructor(private dateAdapter: DateAdapter<any>) {}

Loading…
Cancel
Save