From 608d141c34be36c8892b3fe0f19dd6e174ac2db9 Mon Sep 17 00:00:00 2001 From: David Requeno Date: Tue, 16 Sep 2025 23:22:48 -0600 Subject: [PATCH] refactoring --- .../app/endpoints/public/public.controller.ts | 84 +++++++------------ .../app/pages/public/public-page.component.ts | 17 +--- .../src/app/pages/public/public-page.html | 41 ++++----- .../public-portfolio-response.interface.ts | 21 ++--- 4 files changed, 61 insertions(+), 102 deletions(-) diff --git a/apps/api/src/app/endpoints/public/public.controller.ts b/apps/api/src/app/endpoints/public/public.controller.ts index 1478dd245..59f3f9732 100644 --- a/apps/api/src/app/endpoints/public/public.controller.ts +++ b/apps/api/src/app/endpoints/public/public.controller.ts @@ -30,7 +30,7 @@ export class PublicController { private readonly accessService: AccessService, private readonly configurationService: ConfigurationService, private readonly exchangeRateDataService: ExchangeRateDataService, - private readonly _orderService: OrderService, + private readonly orderService: OrderService, private readonly portfolioService: PortfolioService, @Inject(REQUEST) private readonly request: RequestWithUser, private readonly userService: UserService @@ -61,68 +61,48 @@ export class PublicController { hasDetails = user.subscription.type === 'Premium'; } - const detailsPromise = this.portfolioService.getDetails({ - impersonationId: access.userId, - userId: user.id, - withMarkets: true - }); - - const performance1dPromise = this.portfolioService.getPerformance({ - dateRange: '1d', - impersonationId: undefined, - userId: user.id - }); - - const performanceMaxPromise = this.portfolioService.getPerformance({ - dateRange: 'max', - impersonationId: undefined, - userId: user.id - }); - - const performanceYtdPromise = this.portfolioService.getPerformance({ - dateRange: 'ytd', - impersonationId: undefined, - userId: user.id - }); - - const latestActivitiesPromise = this._orderService.getOrders({ - includeDrafts: false, - take: 10, - sortColumn: 'date', - sortDirection: 'desc', - userCurrency: - this.request.user?.settings?.settings.baseCurrency ?? DEFAULT_CURRENCY, - userId: user.id, - withExcludedAccountsAndActivities: false - }); - const [ { createdAt, holdings, markets }, { performance: performance1d }, { performance: performanceMax }, { performance: performanceYtd } ] = await Promise.all([ - detailsPromise, - performance1dPromise, - performanceMaxPromise, - performanceYtdPromise + this.portfolioService.getDetails({ + impersonationId: access.userId, + userId: user.id, + withMarkets: true + }), + ...['1d', 'max', 'ytd'].map((dateRange) => { + return this.portfolioService.getPerformance({ + dateRange, + impersonationId: undefined, + userId: user.id + }); + }) ]); + const latestActivitiesPromise = this.orderService.getOrders({ + includeDrafts: false, + sortColumn: 'date', + sortDirection: 'desc', + take: 10, + userCurrency: user.settings?.settings.baseCurrency ?? DEFAULT_CURRENCY, + userId: user.id, + withExcludedAccountsAndActivities: false + }); + const { activities } = await latestActivitiesPromise; - const latestActivities = activities.map((a) => { - return { - account: a.account - ? { name: a.account.name, currency: a.account.currency } - : undefined, + const latestActivities = activities.map((a) => ({ + date: a.date, + quantity: a.quantity, + SymbolProfile: { dataSource: a.SymbolProfile?.dataSource, - date: a.date, name: a.SymbolProfile?.name ?? '', - quantity: a.quantity, - symbol: a.SymbolProfile?.symbol ?? '', - type: a.type, - unitPrice: a.unitPrice - }; - }); + symbol: a.SymbolProfile?.symbol ?? '' + }, + type: a.type, + unitPrice: a.unitPrice + })); Object.values(markets ?? {}).forEach((market) => { delete market.valueInBaseCurrency; diff --git a/apps/client/src/app/pages/public/public-page.component.ts b/apps/client/src/app/pages/public/public-page.component.ts index 802ecec71..4162a903e 100644 --- a/apps/client/src/app/pages/public/public-page.component.ts +++ b/apps/client/src/app/pages/public/public-page.component.ts @@ -57,6 +57,7 @@ export class GfPublicPageComponent implements OnInit { }; public defaultAlias = $localize`someone`; public deviceType: string; + public latestActivitiesDataSource: MatTableDataSource; public holdings: PublicPortfolioResponse['holdings'][string][]; public markets: { [key in Market]: { id: Market; valueInPercentage: number }; @@ -67,7 +68,6 @@ export class GfPublicPageComponent implements OnInit { }; }; public publicPortfolioDetails: PublicPortfolioResponse; - public latestActivitiesDataSource: MatTableDataSource; public sectors: { [name: string]: { name: string; value: number }; }; @@ -110,21 +110,8 @@ export class GfPublicPageComponent implements OnInit { .subscribe((portfolioPublicDetails) => { this.publicPortfolioDetails = portfolioPublicDetails; - const latestActivitiesRows = ( - this.publicPortfolioDetails.latestActivities || [] - ).map((a) => { - return { - ...a, - SymbolProfile: { - name: a.name, - symbol: a.symbol, - dataSource: a.dataSource - } - }; - }); - this.latestActivitiesDataSource = new MatTableDataSource( - latestActivitiesRows + this.publicPortfolioDetails.latestActivities || [] ); this.initializeAnalysisData(); diff --git a/apps/client/src/app/pages/public/public-page.html b/apps/client/src/app/pages/public/public-page.html index 1b3a346df..48719a234 100644 --- a/apps/client/src/app/pages/public/public-page.html +++ b/apps/client/src/app/pages/public/public-page.html @@ -203,24 +203,6 @@ } -
-
-

- Would you like to refine your - personal investment strategy? -

-

- Ghostfolio empowers you to keep track of your wealth. -

- -
-
- -@if (publicPortfolioDetails?.latestActivities?.length > 0) {
@@ -237,13 +219,26 @@ [hasPermissionToDeleteActivity]="false" [hasPermissionToExportActivities]="false" [hasPermissionToOpenDetails]="false" - [pageSize]="10" - [showActions]="false" - [showCheckbox]="false" - [showNameColumn]="true" + [pageSize]="maxSafeInteger" />
-} +
+
+

+ Would you like to refine your + personal investment strategy? +

+

+ Ghostfolio empowers you to keep track of your wealth. +

+ +
+
+ diff --git a/libs/common/src/lib/interfaces/responses/public-portfolio-response.interface.ts b/libs/common/src/lib/interfaces/responses/public-portfolio-response.interface.ts index 5800b965b..42e4081da 100644 --- a/libs/common/src/lib/interfaces/responses/public-portfolio-response.interface.ts +++ b/libs/common/src/lib/interfaces/responses/public-portfolio-response.interface.ts @@ -1,7 +1,7 @@ -import { DataSource } from '@prisma/client'; +import type { DataSource, Order } from '@prisma/client'; import { PortfolioDetails, PortfolioPosition } from '..'; -import { AccountWithPlatform, Market } from '../../types'; +import { Market } from '../../types'; export interface PublicPortfolioResponse extends PublicPortfolioResponseV1 { alias?: string; @@ -25,16 +25,13 @@ export interface PublicPortfolioResponse extends PublicPortfolioResponseV1 { | 'valueInPercentage' >; }; - latestActivities?: { - account?: Pick; - date: Date; - name: string; - quantity: number; - symbol: string; - type: string; - unitPrice: number; - dataSource: DataSource; - }[]; + latestActivities: (Pick & { + SymbolProfile: { + dataSource: DataSource; + name: string; + symbol: string; + }; + })[]; markets: { [key in Market]: Pick< PortfolioDetails['markets'][key],