diff --git a/apps/api/src/app/endpoints/public/public.controller.ts b/apps/api/src/app/endpoints/public/public.controller.ts index 0359f8570..0f3ba4682 100644 --- a/apps/api/src/app/endpoints/public/public.controller.ts +++ b/apps/api/src/app/endpoints/public/public.controller.ts @@ -1,3 +1,11 @@ +import { AccessService } from '@ghostfolio/api/app/access/access.service'; +import { OrderService } from '@ghostfolio/api/app/order/order.service'; +import { PortfolioService } from '@ghostfolio/api/app/portfolio/portfolio.service'; +import { UserService } from '@ghostfolio/api/app/user/user.service'; +import { RedactValuesInResponseInterceptor } from '@ghostfolio/api/interceptors/redact-values-in-response/redact-values-in-response.interceptor'; +import { TransformDataSourceInResponseInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor'; +import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; +import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { DEFAULT_CURRENCY } from '@ghostfolio/common/config'; import { getSum } from '@ghostfolio/common/helper'; import { PublicPortfolioResponse } from '@ghostfolio/common/interfaces'; @@ -16,15 +24,6 @@ import { Type as ActivityType } from '@prisma/client'; import { Big } from 'big.js'; import { StatusCodes, getReasonPhrase } from 'http-status-codes'; -import { RedactValuesInResponseInterceptor } from '../../../interceptors/redact-values-in-response/redact-values-in-response.interceptor'; -import { TransformDataSourceInResponseInterceptor } from '../../../interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor'; -import { ConfigurationService } from '../../../services/configuration/configuration.service'; -import { ExchangeRateDataService } from '../../../services/exchange-rate-data/exchange-rate-data.service'; -import { AccessService } from '../../access/access.service'; -import { OrderService } from '../../order/order.service'; -import { PortfolioService } from '../../portfolio/portfolio.service'; -import { UserService } from '../../user/user.service'; - @Controller('public') export class PublicController { public constructor( @@ -87,22 +86,42 @@ export class PublicController { sortColumn: 'date', sortDirection: 'desc', take: 10, + types: [ActivityType.BUY, ActivityType.SELL], userCurrency: user.settings?.settings.baseCurrency ?? DEFAULT_CURRENCY, userId: user.id, - types: [ActivityType.BUY, ActivityType.SELL], withExcludedAccountsAndActivities: false }); - const latestActivities = activities.map((a) => ({ - currency: a.currency, - date: a.date, - fee: a.fee, - quantity: a.quantity, - SymbolProfile: a.SymbolProfile, - type: a.type, - unitPrice: a.unitPrice, - value: a.value, - valueInBaseCurrency: a.valueInBaseCurrency - })); + + // Experimental + const latestActivities = this.configurationService.get( + 'ENABLE_FEATURE_SUBSCRIPTION' + ) + ? [] + : activities.map( + ({ + currency, + date, + fee, + quantity, + SymbolProfile, + type, + unitPrice, + value, + valueInBaseCurrency + }) => { + return { + currency, + date, + fee, + quantity, + SymbolProfile, + type, + unitPrice, + value, + valueInBaseCurrency + }; + } + ); 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 1f4c7202e..6e9339ece 100644 --- a/apps/client/src/app/pages/public/public-page.component.ts +++ b/apps/client/src/app/pages/public/public-page.component.ts @@ -1,9 +1,12 @@ +import { DataService } from '@ghostfolio/client/services/data.service'; import { UNKNOWN_KEY } from '@ghostfolio/common/config'; import { prettifySymbol } from '@ghostfolio/common/helper'; import { + InfoItem, PortfolioPosition, PublicPortfolioResponse } from '@ghostfolio/common/interfaces'; +import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { Market } from '@ghostfolio/common/types'; import { GfActivitiesTableComponent } from '@ghostfolio/ui/activities-table/activities-table.component'; import { GfHoldingsTableComponent } from '@ghostfolio/ui/holdings-table/holdings-table.component'; @@ -29,8 +32,6 @@ import { DeviceDetectorService } from 'ngx-device-detector'; import { EMPTY, Subject } from 'rxjs'; import { catchError, takeUntil } from 'rxjs/operators'; -import { DataService } from '../../services/data.service'; - @Component({ host: { class: 'page' }, imports: [ @@ -57,7 +58,9 @@ export class GfPublicPageComponent implements OnInit { }; public defaultAlias = $localize`someone`; public deviceType: string; + public hasPermissionForSubscription: boolean; public holdings: PublicPortfolioResponse['holdings'][string][]; + public info: InfoItem; public latestActivitiesDataSource: MatTableDataSource< PublicPortfolioResponse['latestActivities'][0] >; @@ -92,6 +95,13 @@ export class GfPublicPageComponent implements OnInit { this.activatedRoute.params.subscribe((params) => { this.accessId = params['id']; }); + + this.info = this.dataService.fetchInfo(); + + this.hasPermissionForSubscription = hasPermission( + this.info?.globalPermissions, + permissions.enableSubscription + ); } public ngOnInit() { @@ -113,12 +123,12 @@ export class GfPublicPageComponent implements OnInit { .subscribe((portfolioPublicDetails) => { this.publicPortfolioDetails = portfolioPublicDetails; + this.initializeAnalysisData(); + this.latestActivitiesDataSource = new MatTableDataSource( this.publicPortfolioDetails.latestActivities ); - this.initializeAnalysisData(); - this.changeDetectorRef.markForCheck(); }); } diff --git a/apps/client/src/app/pages/public/public-page.html b/apps/client/src/app/pages/public/public-page.html index 1b20af9c1..fc05614ec 100644 --- a/apps/client/src/app/pages/public/public-page.html +++ b/apps/client/src/app/pages/public/public-page.html @@ -203,9 +203,9 @@ } -
+
- + Latest activities