Browse Source

Initial setup

pull/2166/head
Thomas 2 years ago
parent
commit
d00fc3d734
  1. 2
      apps/api/src/app/account/account.module.ts
  2. 36
      apps/api/src/app/account/account.service.ts
  3. 25
      apps/api/src/app/portfolio/portfolio.service.ts
  4. 11
      apps/api/src/services/account-balance/account-balance.module.ts
  5. 17
      apps/api/src/services/account-balance/account-balance.service.ts
  6. 11
      prisma/schema.prisma

2
apps/api/src/app/account/account.module.ts

@ -1,6 +1,7 @@
import { PortfolioModule } from '@ghostfolio/api/app/portfolio/portfolio.module'; import { PortfolioModule } from '@ghostfolio/api/app/portfolio/portfolio.module';
import { RedisCacheModule } from '@ghostfolio/api/app/redis-cache/redis-cache.module'; import { RedisCacheModule } from '@ghostfolio/api/app/redis-cache/redis-cache.module';
import { UserModule } from '@ghostfolio/api/app/user/user.module'; import { UserModule } from '@ghostfolio/api/app/user/user.module';
import { AccountBalanceModule } from '@ghostfolio/api/services/account-balance/account-balance.module';
import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module';
import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module'; import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module';
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';
@ -15,6 +16,7 @@ import { AccountService } from './account.service';
controllers: [AccountController], controllers: [AccountController],
exports: [AccountService], exports: [AccountService],
imports: [ imports: [
AccountBalanceModule,
ConfigurationModule, ConfigurationModule,
DataProviderModule, DataProviderModule,
ExchangeRateDataModule, ExchangeRateDataModule,

36
apps/api/src/app/account/account.service.ts

@ -2,7 +2,13 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-
import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service';
import { Filter } from '@ghostfolio/common/interfaces'; import { Filter } from '@ghostfolio/common/interfaces';
import { Injectable } from '@nestjs/common'; import { Injectable } from '@nestjs/common';
import { Account, Order, Platform, Prisma } from '@prisma/client'; import {
Account,
AccountBalance,
Order,
Platform,
Prisma
} from '@prisma/client';
import Big from 'big.js'; import Big from 'big.js';
import { groupBy } from 'lodash'; import { groupBy } from 'lodash';
@ -46,6 +52,7 @@ export class AccountService {
orderBy?: Prisma.AccountOrderByWithRelationInput; orderBy?: Prisma.AccountOrderByWithRelationInput;
}): Promise< }): Promise<
(Account & { (Account & {
balances?: AccountBalance[];
Order?: Order[]; Order?: Order[];
Platform?: Platform; Platform?: Platform;
})[] })[]
@ -82,7 +89,11 @@ export class AccountService {
public async getAccounts(aUserId: string) { public async getAccounts(aUserId: string) {
const accounts = await this.accounts({ const accounts = await this.accounts({
include: { Order: true, Platform: true }, include: {
balances: { orderBy: { createdAt: 'desc' }, take: 1 },
Order: true,
Platform: true
},
orderBy: { name: 'asc' }, orderBy: { name: 'asc' },
where: { userId: aUserId } where: { userId: aUserId }
}); });
@ -141,12 +152,17 @@ export class AccountService {
}; };
} }
const accounts = await this.accounts({ where }); const accounts = await this.accounts({
where,
include: {
balances: { orderBy: { createdAt: 'desc' }, take: 1 }
}
});
for (const account of accounts) { for (const account of accounts) {
totalCashBalanceInBaseCurrency = totalCashBalanceInBaseCurrency.plus( totalCashBalanceInBaseCurrency = totalCashBalanceInBaseCurrency.plus(
this.exchangeRateDataService.toCurrency( this.exchangeRateDataService.toCurrency(
account.balance, account.balances[0].value,
account.currency, account.currency,
currency currency
) )
@ -167,6 +183,18 @@ export class AccountService {
aUserId: string aUserId: string
): Promise<Account> { ): Promise<Account> {
const { data, where } = params; const { data, where } = params;
await this.prismaService.accountBalance.create({
data: {
Account: {
connect: {
id_userId: where.id_userId
}
},
value: <any>data.balance
}
});
return this.prismaService.account.update({ return this.prismaService.account.update({
data, data,
where where

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

@ -51,6 +51,7 @@ import { Inject, Injectable } from '@nestjs/common';
import { REQUEST } from '@nestjs/core'; import { REQUEST } from '@nestjs/core';
import { import {
Account, Account,
AccountBalance,
AssetClass, AssetClass,
DataSource, DataSource,
Order, Order,
@ -125,7 +126,10 @@ export class PortfolioService {
const [accounts, details] = await Promise.all([ const [accounts, details] = await Promise.all([
this.accountService.accounts({ this.accountService.accounts({
where, where,
include: { Order: true, Platform: true }, include: {
Order: true,
Platform: true
},
orderBy: { name: 'asc' } orderBy: { name: 'asc' }
}), }),
this.getDetails({ this.getDetails({
@ -154,8 +158,9 @@ export class PortfolioService {
...account, ...account,
transactionCount, transactionCount,
valueInBaseCurrency, valueInBaseCurrency,
balance: details.accounts[account.id].balance,
balanceInBaseCurrency: this.exchangeRateDataService.toCurrency( balanceInBaseCurrency: this.exchangeRateDataService.toCurrency(
account.balance, details.accounts[account.id].balance,
account.currency, account.currency,
userCurrency userCurrency
), ),
@ -1795,6 +1800,7 @@ export class PortfolioService {
const platforms: PortfolioDetails['platforms'] = {}; const platforms: PortfolioDetails['platforms'] = {};
let currentAccounts: (Account & { let currentAccounts: (Account & {
balances?: AccountBalance[];
Order?: Order[]; Order?: Order[];
Platform?: Platform; Platform?: Platform;
})[] = []; })[] = [];
@ -1803,7 +1809,10 @@ export class PortfolioService {
currentAccounts = await this.accountService.getAccounts(userId); currentAccounts = await this.accountService.getAccounts(userId);
} else if (filters.length === 1 && filters[0].type === 'ACCOUNT') { } else if (filters.length === 1 && filters[0].type === 'ACCOUNT') {
currentAccounts = await this.accountService.accounts({ currentAccounts = await this.accountService.accounts({
include: { Platform: true }, include: {
balances: { orderBy: { createdAt: 'desc' }, take: 1 },
Platform: true
},
where: { id: filters[0].id } where: { id: filters[0].id }
}); });
} else { } else {
@ -1837,11 +1846,11 @@ export class PortfolioService {
ordersByAccount = ordersByAccount.concat(ordersOfTypeItemByAccount); ordersByAccount = ordersByAccount.concat(ordersOfTypeItemByAccount);
accounts[account.id] = { accounts[account.id] = {
balance: account.balance, balance: account.balances[0].value,
currency: account.currency, currency: account.currency,
name: account.name, name: account.name,
valueInBaseCurrency: this.exchangeRateDataService.toCurrency( valueInBaseCurrency: this.exchangeRateDataService.toCurrency(
account.balance, account.balances[0].value,
account.currency, account.currency,
userCurrency userCurrency
) )
@ -1850,17 +1859,17 @@ export class PortfolioService {
if (platforms[account.Platform?.id || UNKNOWN_KEY]?.valueInBaseCurrency) { if (platforms[account.Platform?.id || UNKNOWN_KEY]?.valueInBaseCurrency) {
platforms[account.Platform?.id || UNKNOWN_KEY].valueInBaseCurrency += platforms[account.Platform?.id || UNKNOWN_KEY].valueInBaseCurrency +=
this.exchangeRateDataService.toCurrency( this.exchangeRateDataService.toCurrency(
account.balance, account.balances[0].value,
account.currency, account.currency,
userCurrency userCurrency
); );
} else { } else {
platforms[account.Platform?.id || UNKNOWN_KEY] = { platforms[account.Platform?.id || UNKNOWN_KEY] = {
balance: account.balance, balance: account.balances[0].value,
currency: account.currency, currency: account.currency,
name: account.Platform?.name, name: account.Platform?.name,
valueInBaseCurrency: this.exchangeRateDataService.toCurrency( valueInBaseCurrency: this.exchangeRateDataService.toCurrency(
account.balance, account.balances[0].value,
account.currency, account.currency,
userCurrency userCurrency
) )

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

@ -0,0 +1,11 @@
import { AccountBalanceService } from '@ghostfolio/api/services/account-balance/account-balance.service';
import { Module } from '@nestjs/common';
import { PrismaModule } from '../prisma/prisma.module';
@Module({
exports: [AccountBalanceService],
imports: [PrismaModule],
providers: [AccountBalanceService]
})
export class AccountBalanceModule {}

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

@ -0,0 +1,17 @@
import { Injectable } from '@nestjs/common';
import { AccountBalance, Prisma } from '@prisma/client';
import { PrismaService } from '../prisma/prisma.service';
@Injectable()
export class AccountBalanceService {
public constructor(private readonly prismaService: PrismaService) {}
public async createAccountBalance(
data: Prisma.AccountBalanceCreateInput
): Promise<AccountBalance> {
return this.prismaService.accountBalance.create({
data
});
}
}

11
prisma/schema.prisma

@ -23,6 +23,7 @@ model Access {
model Account { model Account {
accountType AccountType @default(SECURITIES) accountType AccountType @default(SECURITIES)
balance Float @default(0) balance Float @default(0)
balances AccountBalance[]
comment String? comment String?
createdAt DateTime @default(now()) createdAt DateTime @default(now())
currency String? currency String?
@ -59,6 +60,16 @@ model AuthDevice {
User User @relation(fields: [userId], references: [id]) User User @relation(fields: [userId], references: [id])
} }
model AccountBalance {
accountId String
createdAt DateTime @default(now())
id String @id @default(uuid())
value Float
updatedAt DateTime @updatedAt
userId String
Account Account @relation(fields: [accountId, userId], references: [id, userId])
}
model MarketData { model MarketData {
createdAt DateTime @default(now()) createdAt DateTime @default(now())
dataSource DataSource dataSource DataSource

Loading…
Cancel
Save