Browse Source

Refactoring

pull/7146/head
Thomas Kaul 3 weeks ago
parent
commit
e0e0845891
  1. 37
      apps/api/src/app/endpoints/public/public.controller.ts
  2. 69
      apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts

37
apps/api/src/app/endpoints/public/public.controller.ts

@ -94,17 +94,6 @@ export class PublicController {
}) })
]); ]);
const baseCurrency =
user.settings?.settings.baseCurrency ?? DEFAULT_CURRENCY;
const filteredHoldings = Object.fromEntries(
Object.entries(holdings).filter(([, holding]) => {
const isCash =
holding.assetProfile.assetSubClass === AssetSubClass.CASH;
const isBaseCurrency = holding.assetProfile.symbol === baseCurrency;
return !(isCash && isBaseCurrency);
})
);
const { activities } = await this.activitiesService.getActivities({ const { activities } = await this.activitiesService.getActivities({
filters: portfolioFilters.length > 0 ? portfolioFilters : undefined, filters: portfolioFilters.length > 0 ? portfolioFilters : undefined,
sortColumn: 'date', sortColumn: 'date',
@ -175,23 +164,19 @@ export class PublicController {
}; };
const totalValue = getSum( const totalValue = getSum(
Object.values(filteredHoldings).map( Object.values(holdings).map(({ assetProfile, marketPrice, quantity }) => {
({ assetProfile, marketPrice, quantity }) => { return new Big(
return new Big( this.exchangeRateDataService.toCurrency(
this.exchangeRateDataService.toCurrency( quantity * marketPrice,
quantity * marketPrice, assetProfile.currency,
assetProfile.currency, this.request.user?.settings?.settings.baseCurrency ??
this.request.user?.settings?.settings.baseCurrency ?? DEFAULT_CURRENCY
DEFAULT_CURRENCY )
) );
); })
}
)
).toNumber(); ).toNumber();
for (const [symbol, portfolioPosition] of Object.entries( for (const [symbol, portfolioPosition] of Object.entries(holdings)) {
filteredHoldings
)) {
publicPortfolioResponse.holdings[symbol] = { publicPortfolioResponse.holdings[symbol] = {
allocationInPercentage: allocationInPercentage:
portfolioPosition.valueInBaseCurrency / totalValue, portfolioPosition.valueInBaseCurrency / totalValue,

69
apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts

@ -3,6 +3,7 @@ import { CreateAccessDto, UpdateAccessDto } from '@ghostfolio/common/dtos';
import { Filter, PortfolioPosition } from '@ghostfolio/common/interfaces'; import { Filter, PortfolioPosition } from '@ghostfolio/common/interfaces';
import { AccountWithPlatform } from '@ghostfolio/common/types'; import { AccountWithPlatform } from '@ghostfolio/common/types';
import { validateObjectForForm } from '@ghostfolio/common/utils'; import { validateObjectForForm } from '@ghostfolio/common/utils';
import { translate } from '@ghostfolio/ui/i18n';
import { NotificationService } from '@ghostfolio/ui/notifications'; import { NotificationService } from '@ghostfolio/ui/notifications';
import { import {
GfPortfolioFilterFormComponent, GfPortfolioFilterFormComponent,
@ -37,7 +38,7 @@ import {
import { MatFormFieldModule } from '@angular/material/form-field'; import { MatFormFieldModule } from '@angular/material/form-field';
import { MatInputModule } from '@angular/material/input'; import { MatInputModule } from '@angular/material/input';
import { MatSelectModule } from '@angular/material/select'; import { MatSelectModule } from '@angular/material/select';
import { AccessPermission } from '@prisma/client'; import { AccessPermission, AssetClass } from '@prisma/client';
import { StatusCodes } from 'http-status-codes'; import { StatusCodes } from 'http-status-codes';
import { EMPTY, catchError } from 'rxjs'; import { EMPTY, catchError } from 'rxjs';
@ -110,6 +111,18 @@ export class GfCreateOrUpdateAccessDialogComponent implements OnInit {
] ]
}); });
this.assetClasses = Object.keys(AssetClass)
.map((assetClass) => {
return {
id: assetClass,
label: translate(assetClass),
type: 'ASSET_CLASS' as const
};
})
.sort((a, b) => {
return a.label.localeCompare(b.label);
});
this.userService this.userService
.get() .get()
.pipe(takeUntilDestroyed(this.destroyRef)) .pipe(takeUntilDestroyed(this.destroyRef))
@ -117,13 +130,21 @@ export class GfCreateOrUpdateAccessDialogComponent implements OnInit {
this.accounts = accounts; this.accounts = accounts;
this.hasExperimentalFeatures = settings.isExperimentalFeatures ?? false; this.hasExperimentalFeatures = settings.isExperimentalFeatures ?? false;
this.tags = tags this.tags =
.filter(({ isUsed }) => isUsed) tags
.map(({ id, name }) => ({ ?.filter(({ isUsed }) => {
id, return isUsed;
label: name, })
type: 'TAG' as const ?.map(({ id, name }) => {
})); return {
id,
label: translate(name),
type: 'TAG' as const
};
})
?.sort((a, b) => {
return a.label.localeCompare(b.label);
}) ?? [];
this.updateFiltersFormControl(this.data.access?.settings?.filters); this.updateFiltersFormControl(this.data.access?.settings?.filters);
@ -216,26 +237,24 @@ export class GfCreateOrUpdateAccessDialogComponent implements OnInit {
private loadHoldings() { private loadHoldings() {
this.dataService this.dataService
.fetchPortfolioDetails({}) .fetchPortfolioHoldings()
.pipe(takeUntilDestroyed(this.destroyRef)) .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((response) => { .subscribe(({ holdings }) => {
if (response.holdings) { this.holdings = holdings
this.holdings = Object.values(response.holdings); .filter(({ assetProfile }) => {
return (
const assetClassesSet = new Set<string>(); assetProfile.assetSubClass &&
Object.values(response.holdings).forEach((holding) => { !['CASH'].includes(assetProfile.assetSubClass)
if (holding.assetProfile.assetClass) { );
assetClassesSet.add(holding.assetProfile.assetClass); })
} .sort((a, b) => {
return (a.assetProfile.name ?? '').localeCompare(
b.assetProfile.name ?? ''
);
}); });
this.assetClasses = Array.from(assetClassesSet).map((ac) => ({
id: ac,
label: ac,
type: 'ASSET_CLASS' as const
}));
this.updateFiltersFormControl(this.data.access?.settings?.filters); this.updateFiltersFormControl(this.data.access?.settings?.filters);
}
this.changeDetectorRef.markForCheck(); this.changeDetectorRef.markForCheck();
}); });
} }

Loading…
Cancel
Save