Browse Source

refactoring

pull/5538/head
David Requeno 4 days ago
parent
commit
608d141c34
  1. 68
      apps/api/src/app/endpoints/public/public.controller.ts
  2. 17
      apps/client/src/app/pages/public/public-page.component.ts
  3. 41
      apps/client/src/app/pages/public/public-page.html
  4. 17
      libs/common/src/lib/interfaces/responses/public-portfolio-response.interface.ts

68
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({
const [
{ createdAt, holdings, markets },
{ performance: performance1d },
{ performance: performanceMax },
{ performance: performanceYtd }
] = await Promise.all([
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',
}),
...['1d', 'max', 'ytd'].map((dateRange) => {
return this.portfolioService.getPerformance({
dateRange,
impersonationId: undefined,
userId: user.id
});
})
]);
const latestActivitiesPromise = this._orderService.getOrders({
const latestActivitiesPromise = this.orderService.getOrders({
includeDrafts: false,
take: 10,
sortColumn: 'date',
sortDirection: 'desc',
userCurrency:
this.request.user?.settings?.settings.baseCurrency ?? DEFAULT_CURRENCY,
take: 10,
userCurrency: 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
]);
const { activities } = await latestActivitiesPromise;
const latestActivities = activities.map((a) => {
return {
account: a.account
? { name: a.account.name, currency: a.account.currency }
: undefined,
dataSource: a.SymbolProfile?.dataSource,
const latestActivities = activities.map((a) => ({
date: a.date,
name: a.SymbolProfile?.name ?? '',
quantity: a.quantity,
symbol: a.SymbolProfile?.symbol ?? '',
SymbolProfile: {
dataSource: a.SymbolProfile?.dataSource,
name: a.SymbolProfile?.name ?? '',
symbol: a.SymbolProfile?.symbol ?? ''
},
type: a.type,
unitPrice: a.unitPrice
};
});
}));
Object.values(markets ?? {}).forEach((market) => {
delete market.valueInBaseCurrency;

17
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<any>;
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<any>;
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();

41
apps/client/src/app/pages/public/public-page.html

@ -203,24 +203,6 @@
</div>
</div>
}
<div class="row my-5">
<div class="col-md-10 offset-md-1">
<h2 class="h4 mb-1 text-center" i18n>
Would you like to <strong>refine</strong> your
<strong>personal investment strategy</strong>?
</h2>
<p class="lead mb-3 text-center" i18n>
Ghostfolio empowers you to keep track of your wealth.
</p>
<div class="py-2 text-center">
<a color="primary" href="https://ghostfol.io" mat-flat-button>
<ng-container i18n>Get Started</ng-container>
</a>
</div>
</div>
</div>
</div>
@if (publicPortfolioDetails?.latestActivities?.length > 0) {
<div class="row">
<div class="col-md-12">
<mat-card appearance="outlined" class="mb-3">
@ -237,13 +219,26 @@
[hasPermissionToDeleteActivity]="false"
[hasPermissionToExportActivities]="false"
[hasPermissionToOpenDetails]="false"
[pageSize]="10"
[showActions]="false"
[showCheckbox]="false"
[showNameColumn]="true"
[pageSize]="maxSafeInteger"
/>
</mat-card-content>
</mat-card>
</div>
</div>
}
<div class="row my-5">
<div class="col-md-10 offset-md-1">
<h2 class="h4 mb-1 text-center" i18n>
Would you like to <strong>refine</strong> your
<strong>personal investment strategy</strong>?
</h2>
<p class="lead mb-3 text-center" i18n>
Ghostfolio empowers you to keep track of your wealth.
</p>
<div class="py-2 text-center">
<a color="primary" href="https://ghostfol.io" mat-flat-button>
<ng-container i18n>Get Started</ng-container>
</a>
</div>
</div>
</div>
</div>

17
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<AccountWithPlatform, 'name' | 'currency'>;
date: Date;
latestActivities: (Pick<Order, 'date' | 'quantity' | 'type' | 'unitPrice'> & {
SymbolProfile: {
dataSource: DataSource;
name: string;
quantity: number;
symbol: string;
type: string;
unitPrice: number;
dataSource: DataSource;
}[];
};
})[];
markets: {
[key in Market]: Pick<
PortfolioDetails['markets'][key],

Loading…
Cancel
Save