diff --git a/apps/api/src/app/account/account.controller.ts b/apps/api/src/app/account/account.controller.ts index e141dc11f..3eeb7117c 100644 --- a/apps/api/src/app/account/account.controller.ts +++ b/apps/api/src/app/account/account.controller.ts @@ -128,8 +128,8 @@ export class AccountController { @Param('id') id: string ): Promise { return this.accountBalanceService.getAccountBalances({ - accountId: id, - userId: this.request.user.id + filters: [{ id, type: 'ACCOUNT' }], + user: this.request.user }); } diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index 6c27142b9..b9ffd3df3 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -118,8 +118,12 @@ export class PortfolioService { }): Promise { const where: Prisma.AccountWhereInput = { userId: userId }; - if (filters?.[0].id && filters?.[0].type === 'ACCOUNT') { - where.id = filters[0].id; + const accountFilter = filters?.find(({ type }) => { + return type === 'ACCOUNT'; + }); + + if (accountFilter) { + where.id = accountFilter.id; } const [accounts, details] = await Promise.all([ @@ -1132,15 +1136,12 @@ export class PortfolioService { const userCurrency = this.getUserCurrency(user); const accountBalances = await this.accountBalanceService.getAccountBalances( - { - userId - } + { filters, user } ); const accountBalanceItems: HistoricalDataItem[] = - accountBalances.balances.map(({ date, value }) => { - // TODO: convert value to user currency - return { value, date: format(date, DATE_FORMAT) }; + accountBalances.balances.map(({ date, valueInBaseCurrency }) => { + return { date: format(date, DATE_FORMAT), value: valueInBaseCurrency }; }); const { portfolioOrders, transactionPoints } = diff --git a/apps/api/src/services/account-balance/account-balance.module.ts b/apps/api/src/services/account-balance/account-balance.module.ts index 53c695b5f..c85727f8c 100644 --- a/apps/api/src/services/account-balance/account-balance.module.ts +++ b/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 { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module'; import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; import { Module } from '@nestjs/common'; @Module({ exports: [AccountBalanceService], - imports: [PrismaModule], + imports: [ExchangeRateDataModule, PrismaModule], providers: [AccountBalanceService] }) export class AccountBalanceModule {} diff --git a/apps/api/src/services/account-balance/account-balance.service.ts b/apps/api/src/services/account-balance/account-balance.service.ts index c27a6be17..33b811ef5 100644 --- a/apps/api/src/services/account-balance/account-balance.service.ts +++ b/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 { AccountBalancesResponse } from '@ghostfolio/common/interfaces'; +import { AccountBalancesResponse, Filter } from '@ghostfolio/common/interfaces'; +import { UserWithSettings } from '@ghostfolio/common/types'; import { Injectable } from '@nestjs/common'; import { AccountBalance, Prisma } from '@prisma/client'; @Injectable() export class AccountBalanceService { - public constructor(private readonly prismaService: PrismaService) {} + public constructor( + private readonly exchangeRateDataService: ExchangeRateDataService, + private readonly prismaService: PrismaService + ) {} public async createAccountBalance( data: Prisma.AccountBalanceCreateInput @@ -16,27 +21,46 @@ export class AccountBalanceService { } public async getAccountBalances({ - accountId, - userId + filters, + user }: { - accountId?: string; // TODO: With filters? - userId: string; + filters?: Filter[]; + user: UserWithSettings; }): Promise { + 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({ + where, orderBy: { date: 'asc' }, select: { + Account: true, date: true, id: 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 + ) + }; + }) + }; } } diff --git a/libs/common/src/lib/interfaces/responses/account-balances-response.interface.ts b/libs/common/src/lib/interfaces/responses/account-balances-response.interface.ts index 9b4ec2f6d..98a765e8a 100644 --- a/libs/common/src/lib/interfaces/responses/account-balances-response.interface.ts +++ b/libs/common/src/lib/interfaces/responses/account-balances-response.interface.ts @@ -1,5 +1,7 @@ import { AccountBalance } from '@prisma/client'; export interface AccountBalancesResponse { - balances: Pick[]; + balances: (Pick & { + valueInBaseCurrency: number; + })[]; }