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 { RedisCacheModule } from '@ghostfolio/api/app/redis-cache/redis-cache.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 { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.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],
exports: [AccountService],
imports: [
AccountBalanceModule,
ConfigurationModule,
DataProviderModule,
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 { Filter } from '@ghostfolio/common/interfaces';
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 { groupBy } from 'lodash';
@ -46,6 +52,7 @@ export class AccountService {
orderBy?: Prisma.AccountOrderByWithRelationInput;
}): Promise<
(Account & {
balances?: AccountBalance[];
Order?: Order[];
Platform?: Platform;
})[]
@ -82,7 +89,11 @@ export class AccountService {
public async getAccounts(aUserId: string) {
const accounts = await this.accounts({
include: { Order: true, Platform: true },
include: {
balances: { orderBy: { createdAt: 'desc' }, take: 1 },
Order: true,
Platform: true
},
orderBy: { name: 'asc' },
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) {
totalCashBalanceInBaseCurrency = totalCashBalanceInBaseCurrency.plus(
this.exchangeRateDataService.toCurrency(
account.balance,
account.balances[0].value,
account.currency,
currency
)
@ -167,6 +183,18 @@ export class AccountService {
aUserId: string
): Promise<Account> {
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({
data,
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 {
Account,
AccountBalance,
AssetClass,
DataSource,
Order,
@ -125,7 +126,10 @@ export class PortfolioService {
const [accounts, details] = await Promise.all([
this.accountService.accounts({
where,
include: { Order: true, Platform: true },
include: {
Order: true,
Platform: true
},
orderBy: { name: 'asc' }
}),
this.getDetails({
@ -154,8 +158,9 @@ export class PortfolioService {
...account,
transactionCount,
valueInBaseCurrency,
balance: details.accounts[account.id].balance,
balanceInBaseCurrency: this.exchangeRateDataService.toCurrency(
account.balance,
details.accounts[account.id].balance,
account.currency,
userCurrency
),
@ -1795,6 +1800,7 @@ export class PortfolioService {
const platforms: PortfolioDetails['platforms'] = {};
let currentAccounts: (Account & {
balances?: AccountBalance[];
Order?: Order[];
Platform?: Platform;
})[] = [];
@ -1803,7 +1809,10 @@ export class PortfolioService {
currentAccounts = await this.accountService.getAccounts(userId);
} else if (filters.length === 1 && filters[0].type === 'ACCOUNT') {
currentAccounts = await this.accountService.accounts({
include: { Platform: true },
include: {
balances: { orderBy: { createdAt: 'desc' }, take: 1 },
Platform: true
},
where: { id: filters[0].id }
});
} else {
@ -1837,11 +1846,11 @@ export class PortfolioService {
ordersByAccount = ordersByAccount.concat(ordersOfTypeItemByAccount);
accounts[account.id] = {
balance: account.balance,
balance: account.balances[0].value,
currency: account.currency,
name: account.name,
valueInBaseCurrency: this.exchangeRateDataService.toCurrency(
account.balance,
account.balances[0].value,
account.currency,
userCurrency
)
@ -1850,17 +1859,17 @@ export class PortfolioService {
if (platforms[account.Platform?.id || UNKNOWN_KEY]?.valueInBaseCurrency) {
platforms[account.Platform?.id || UNKNOWN_KEY].valueInBaseCurrency +=
this.exchangeRateDataService.toCurrency(
account.balance,
account.balances[0].value,
account.currency,
userCurrency
);
} else {
platforms[account.Platform?.id || UNKNOWN_KEY] = {
balance: account.balance,
balance: account.balances[0].value,
currency: account.currency,
name: account.Platform?.name,
valueInBaseCurrency: this.exchangeRateDataService.toCurrency(
account.balance,
account.balances[0].value,
account.currency,
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 {
accountType AccountType @default(SECURITIES)
balance Float @default(0)
balances AccountBalance[]
comment String?
createdAt DateTime @default(now())
currency String?
@ -59,6 +60,16 @@ model AuthDevice {
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 {
createdAt DateTime @default(now())
dataSource DataSource

Loading…
Cancel
Save