diff --git a/apps/api/src/app/endpoints/public/public.controller.ts b/apps/api/src/app/endpoints/public/public.controller.ts index 0f1a48a9b..3bb9d5fab 100644 --- a/apps/api/src/app/endpoints/public/public.controller.ts +++ b/apps/api/src/app/endpoints/public/public.controller.ts @@ -66,8 +66,7 @@ export class PublicController { } // Get filter configuration from access settings - const accessSettings = (access.settings ?? {}) as AccessSettings; - const accessFilter = accessSettings.filter; + const { filter: accessFilter } = (access.settings ?? {}) as AccessSettings; // Convert access filter to portfolio filters const portfolioFilters: Filter[] = []; @@ -93,16 +92,6 @@ export class PublicController { ); } - // Add tag filters - if (accessFilter.tagIds?.length > 0) { - portfolioFilters.push( - ...accessFilter.tagIds.map((tagId) => ({ - id: tagId, - type: 'TAG' as const - })) - ); - } - // Add holding filters (symbol + dataSource) // Each holding needs both DATA_SOURCE and SYMBOL filters if (accessFilter.holdings?.length > 0) { @@ -119,6 +108,16 @@ export class PublicController { ); } } + + // Add tag filters + if (accessFilter.tagIds?.length > 0) { + portfolioFilters.push( + ...accessFilter.tagIds.map((tagId) => ({ + id: tagId, + type: 'TAG' as const + })) + ); + } } const [ @@ -156,8 +155,7 @@ export class PublicController { // Use filters for activities, but exclude DATA_SOURCE/SYMBOL filters // if there are multiple holdings (the service can't handle multiple symbol filters) - const hasMultipleHoldingFilters = - accessFilter?.holdings && accessFilter.holdings.length > 1; + const hasMultipleHoldingFilters = accessFilter?.holdings?.length > 1; const activityFilters = portfolioFilters.filter((filter) => { // Always include ACCOUNT, ASSET_CLASS, TAG filters @@ -192,6 +190,7 @@ export class PublicController { withExcludedAccountsAndActivities: false }); + // Experimental const latestActivities = this.configurationService.get( 'ENABLE_FEATURE_SUBSCRIPTION' ) @@ -228,6 +227,11 @@ export class PublicController { const publicPortfolioResponse: PublicPortfolioResponse = { createdAt, + hasDetails, + latestActivities, + markets, + alias: access.alias, + holdings: {}, performance: { '1d': { relativeChange: @@ -241,12 +245,7 @@ export class PublicController { relativeChange: performanceYtd.netPerformancePercentageWithCurrencyEffect } - }, - alias: access.alias, - hasDetails, - holdings: {}, - latestActivities, - markets + } }; const totalValue = getSum( diff --git a/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts b/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts index 50034fbb3..a072b85a6 100644 --- a/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts +++ b/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts @@ -42,6 +42,7 @@ import { EMPTY, Subject, catchError, takeUntil } from 'rxjs'; import { NotificationService } from '../../../core/notification/notification.service'; import { DataService } from '../../../services/data.service'; +import { UserService } from '../../../services/user/user.service'; import { validateObjectForForm } from '../../../util/form.util'; import { CreateOrUpdateAccessDialogParams } from './interfaces/interfaces'; @@ -80,9 +81,10 @@ export class GfCreateOrUpdateAccessDialogComponent private changeDetectorRef: ChangeDetectorRef, @Inject(MAT_DIALOG_DATA) private data: CreateOrUpdateAccessDialogParams, private dataService: DataService, + public dialogRef: MatDialogRef, private formBuilder: FormBuilder, private notificationService: NotificationService, - public dialogRef: MatDialogRef + private userService: UserService ) { this.mode = this.data.access?.id ? 'update' : 'create'; } @@ -210,11 +212,18 @@ export class GfCreateOrUpdateAccessDialogComponent private loadFilterData() { const existingFilter = this.data.access.settings?.filter; - this.dataService - .fetchAccounts() + this.userService + .get() .pipe(takeUntil(this.unsubscribeSubject)) - .subscribe((response) => { - this.accounts = response.accounts; + .subscribe((user) => { + this.accounts = user.accounts; + this.tags = user.tags + .filter(({ isUsed }) => isUsed) + .map(({ id, name }) => ({ + id, + label: name, + type: 'TAG' as const + })); this.updateFiltersFormControl(existingFilter); }); @@ -241,20 +250,6 @@ export class GfCreateOrUpdateAccessDialogComponent } this.changeDetectorRef.markForCheck(); }); - - this.dataService - .fetchTags() - .pipe(takeUntil(this.unsubscribeSubject)) - .subscribe((response) => { - this.tags = response.map((tag) => ({ - id: tag.id, - label: tag.name, - type: 'TAG' as const - })); - - this.updateFiltersFormControl(existingFilter); - this.changeDetectorRef.markForCheck(); - }); } private updateFiltersFormControl( @@ -307,8 +302,8 @@ export class GfCreateOrUpdateAccessDialogComponent const filter = this.showFilterPanel ? this.buildFilterObject() : undefined; const access: CreateAccessDto = { + filter, alias: this.accessForm.get('alias')?.value as string, - filter: filter, granteeUserId: this.accessForm.get('granteeUserId')?.value as string, permissions: [ this.accessForm.get('permissions')?.value as AccessPermission @@ -349,7 +344,7 @@ export class GfCreateOrUpdateAccessDialogComponent const access: UpdateAccessDto = { alias: this.accessForm.get('alias')?.value as string, - filter: filter, + filter, granteeUserId: this.accessForm.get('granteeUserId')?.value as string, id: this.data.access.id, permissions: [