Browse Source

refactor: streamline access filter handling in PublicController and update access dialog to use UserService

pull/5848/head
Germán Martín 1 month ago
parent
commit
90bffb6cd6
  1. 39
      apps/api/src/app/endpoints/public/public.controller.ts
  2. 37
      apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts

39
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(

37
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<GfCreateOrUpdateAccessDialogComponent>,
private formBuilder: FormBuilder,
private notificationService: NotificationService,
public dialogRef: MatDialogRef<GfCreateOrUpdateAccessDialogComponent>
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: [

Loading…
Cancel
Save