Browse Source

Introduce valueInBaseCurrency and support filters

pull/2574/head
Thomas 2 years ago
parent
commit
d01cfdfebb
  1. 4
      apps/api/src/app/account/account.controller.ts
  2. 17
      apps/api/src/app/portfolio/portfolio.service.ts
  3. 3
      apps/api/src/services/account-balance/account-balance.module.ts
  4. 46
      apps/api/src/services/account-balance/account-balance.service.ts
  5. 4
      libs/common/src/lib/interfaces/responses/account-balances-response.interface.ts

4
apps/api/src/app/account/account.controller.ts

@ -128,8 +128,8 @@ export class AccountController {
@Param('id') id: string @Param('id') id: string
): Promise<AccountBalancesResponse> { ): Promise<AccountBalancesResponse> {
return this.accountBalanceService.getAccountBalances({ return this.accountBalanceService.getAccountBalances({
accountId: id, filters: [{ id, type: 'ACCOUNT' }],
userId: this.request.user.id user: this.request.user
}); });
} }

17
apps/api/src/app/portfolio/portfolio.service.ts

@ -118,8 +118,12 @@ export class PortfolioService {
}): Promise<AccountWithValue[]> { }): Promise<AccountWithValue[]> {
const where: Prisma.AccountWhereInput = { userId: userId }; const where: Prisma.AccountWhereInput = { userId: userId };
if (filters?.[0].id && filters?.[0].type === 'ACCOUNT') { const accountFilter = filters?.find(({ type }) => {
where.id = filters[0].id; return type === 'ACCOUNT';
});
if (accountFilter) {
where.id = accountFilter.id;
} }
const [accounts, details] = await Promise.all([ const [accounts, details] = await Promise.all([
@ -1132,15 +1136,12 @@ export class PortfolioService {
const userCurrency = this.getUserCurrency(user); const userCurrency = this.getUserCurrency(user);
const accountBalances = await this.accountBalanceService.getAccountBalances( const accountBalances = await this.accountBalanceService.getAccountBalances(
{ { filters, user }
userId
}
); );
const accountBalanceItems: HistoricalDataItem[] = const accountBalanceItems: HistoricalDataItem[] =
accountBalances.balances.map(({ date, value }) => { accountBalances.balances.map(({ date, valueInBaseCurrency }) => {
// TODO: convert value to user currency return { date: format(date, DATE_FORMAT), value: valueInBaseCurrency };
return { value, date: format(date, DATE_FORMAT) };
}); });
const { portfolioOrders, transactionPoints } = const { portfolioOrders, transactionPoints } =

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

@ -1,10 +1,11 @@
import { AccountBalanceService } from '@ghostfolio/api/services/account-balance/account-balance.service'; import { AccountBalanceService } from '@ghostfolio/api/services/account-balance/account-balance.service';
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';
import { Module } from '@nestjs/common'; import { Module } from '@nestjs/common';
@Module({ @Module({
exports: [AccountBalanceService], exports: [AccountBalanceService],
imports: [PrismaModule], imports: [ExchangeRateDataModule, PrismaModule],
providers: [AccountBalanceService] providers: [AccountBalanceService]
}) })
export class AccountBalanceModule {} export class AccountBalanceModule {}

46
apps/api/src/services/account-balance/account-balance.service.ts

@ -1,11 +1,16 @@
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service';
import { AccountBalancesResponse } from '@ghostfolio/common/interfaces'; import { AccountBalancesResponse, Filter } from '@ghostfolio/common/interfaces';
import { UserWithSettings } from '@ghostfolio/common/types';
import { Injectable } from '@nestjs/common'; import { Injectable } from '@nestjs/common';
import { AccountBalance, Prisma } from '@prisma/client'; import { AccountBalance, Prisma } from '@prisma/client';
@Injectable() @Injectable()
export class AccountBalanceService { export class AccountBalanceService {
public constructor(private readonly prismaService: PrismaService) {} public constructor(
private readonly exchangeRateDataService: ExchangeRateDataService,
private readonly prismaService: PrismaService
) {}
public async createAccountBalance( public async createAccountBalance(
data: Prisma.AccountBalanceCreateInput data: Prisma.AccountBalanceCreateInput
@ -16,27 +21,46 @@ export class AccountBalanceService {
} }
public async getAccountBalances({ public async getAccountBalances({
accountId, filters,
userId user
}: { }: {
accountId?: string; // TODO: With filters? filters?: Filter[];
userId: string; user: UserWithSettings;
}): Promise<AccountBalancesResponse> { }): Promise<AccountBalancesResponse> {
const where: Prisma.AccountBalanceWhereInput = { userId: user.id };
const accountFilter = filters?.find(({ type }) => {
return type === 'ACCOUNT';
});
if (accountFilter) {
where.accountId = accountFilter.id;
}
const balances = await this.prismaService.accountBalance.findMany({ const balances = await this.prismaService.accountBalance.findMany({
where,
orderBy: { orderBy: {
date: 'asc' date: 'asc'
}, },
select: { select: {
Account: true,
date: true, date: true,
id: true, id: true,
value: true value: true
},
where: {
accountId,
userId
} }
}); });
return { balances }; return {
balances: balances.map((balance) => {
return {
...balance,
valueInBaseCurrency: this.exchangeRateDataService.toCurrency(
balance.value,
balance.Account.currency,
user.Settings.settings.baseCurrency
)
};
})
};
} }
} }

4
libs/common/src/lib/interfaces/responses/account-balances-response.interface.ts

@ -1,5 +1,7 @@
import { AccountBalance } from '@prisma/client'; import { AccountBalance } from '@prisma/client';
export interface AccountBalancesResponse { export interface AccountBalancesResponse {
balances: Pick<AccountBalance, 'date' | 'id' | 'value'>[]; balances: (Pick<AccountBalance, 'date' | 'id' | 'value'> & {
valueInBaseCurrency: number;
})[];
} }

Loading…
Cancel
Save