From 8a8324bcaf73138942af6ce6293bfe0feebc6473 Mon Sep 17 00:00:00 2001 From: Anurag9977 Date: Thu, 22 Jan 2026 00:32:50 +0530 Subject: [PATCH] Fix - Accounts in account selection filter in assistant do not adapt in impersonation mode --- apps/api/src/app/user/user.controller.ts | 10 +++++++++- apps/api/src/app/user/user.module.ts | 2 ++ apps/api/src/app/user/user.service.ts | 18 ++++++++++++++---- 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/apps/api/src/app/user/user.controller.ts b/apps/api/src/app/user/user.controller.ts index 397ae016b..5614733d2 100644 --- a/apps/api/src/app/user/user.controller.ts +++ b/apps/api/src/app/user/user.controller.ts @@ -1,8 +1,10 @@ import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator'; import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; +import { ImpersonationService } from '@ghostfolio/api/services/impersonation/impersonation.service'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { PropertyService } from '@ghostfolio/api/services/property/property.service'; +import { HEADER_KEY_IMPERSONATION } from '@ghostfolio/common/config'; import { DeleteOwnUserDto, UpdateOwnAccessTokenDto, @@ -43,6 +45,7 @@ import { UserService } from './user.service'; export class UserController { public constructor( private readonly configurationService: ConfigurationService, + private readonly impersonationService: ImpersonationService, private readonly jwtService: JwtService, private readonly prismaService: PrismaService, private readonly propertyService: PropertyService, @@ -108,10 +111,15 @@ export class UserController { @Get() @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async getUser( - @Headers('accept-language') acceptLanguage: string + @Headers('accept-language') acceptLanguage: string, + @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId: string ): Promise { + const impersonationUserId = + await this.impersonationService.validateImpersonationId(impersonationId); + return this.userService.getUser( this.request.user, + impersonationUserId, acceptLanguage?.split(',')?.[0] ); } diff --git a/apps/api/src/app/user/user.module.ts b/apps/api/src/app/user/user.module.ts index 8a21b0a55..66523dd42 100644 --- a/apps/api/src/app/user/user.module.ts +++ b/apps/api/src/app/user/user.module.ts @@ -2,6 +2,7 @@ import { OrderModule } from '@ghostfolio/api/app/order/order.module'; import { SubscriptionModule } from '@ghostfolio/api/app/subscription/subscription.module'; import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; import { I18nModule } from '@ghostfolio/api/services/i18n/i18n.module'; +import { ImpersonationModule } from '@ghostfolio/api/services/impersonation/impersonation.module'; import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; import { PropertyModule } from '@ghostfolio/api/services/property/property.module'; import { TagModule } from '@ghostfolio/api/services/tag/tag.module'; @@ -18,6 +19,7 @@ import { UserService } from './user.service'; imports: [ ConfigurationModule, I18nModule, + ImpersonationModule, JwtModule.register({ secret: process.env.JWT_SECRET_KEY, signOptions: { expiresIn: '30 days' } diff --git a/apps/api/src/app/user/user.service.ts b/apps/api/src/app/user/user.service.ts index 3280fbfac..c60f4f721 100644 --- a/apps/api/src/app/user/user.service.ts +++ b/apps/api/src/app/user/user.service.ts @@ -98,6 +98,7 @@ export class UserService { public async getUser( { accounts, id, permissions, settings, subscription }: UserWithSettings, + impersonationUserId: string, aLocale = locale ): Promise { const userData = await Promise.all([ @@ -108,6 +109,14 @@ export class UserService { orderBy: { alias: 'asc' }, where: { granteeUserId: id } }), + this.prismaService.account.findMany({ + orderBy: { + name: 'asc' + }, + where: { + userId: impersonationUserId + } + }), this.prismaService.order.count({ where: { userId: id } }), @@ -121,9 +130,10 @@ export class UserService { ]); const access = userData[0]; - const activitiesCount = userData[1]; - const firstActivity = userData[2]; - let tags = userData[3].filter((tag) => { + const impersonationAccounts = userData[1]; + const activitiesCount = userData[2]; + const firstActivity = userData[3]; + let tags = userData[4].filter((tag) => { return tag.id !== TAG_ID_EXCLUDE_FROM_ANALYSIS; }); @@ -146,7 +156,6 @@ export class UserService { } return { - accounts, activitiesCount, id, permissions, @@ -160,6 +169,7 @@ export class UserService { permissions: accessItem.permissions }; }), + accounts: impersonationUserId ? impersonationAccounts : accounts, dateOfFirstActivity: firstActivity?.date ?? new Date(), settings: { ...(settings.settings as UserSettings),