From 593bfd1f3817b9a424349673c81925865581275c Mon Sep 17 00:00:00 2001 From: Todd Martin Date: Fri, 31 Jan 2025 18:47:39 -0500 Subject: [PATCH] Add device identifier to config request --- .../abstractions/config/config-api.service.abstraction.ts | 2 +- .../src/platform/services/config/config-api.service.ts | 6 ++++-- .../src/platform/services/config/config.service.spec.ts | 7 +++++++ .../src/platform/services/config/default-config.service.ts | 5 ++++- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/libs/common/src/platform/abstractions/config/config-api.service.abstraction.ts b/libs/common/src/platform/abstractions/config/config-api.service.abstraction.ts index 3c191f59ccc..6ade7e41612 100644 --- a/libs/common/src/platform/abstractions/config/config-api.service.abstraction.ts +++ b/libs/common/src/platform/abstractions/config/config-api.service.abstraction.ts @@ -5,5 +5,5 @@ export abstract class ConfigApiServiceAbstraction { /** * Fetches the server configuration for the given user. If no user is provided, the configuration will not contain user-specific context. */ - abstract get(userId: UserId | undefined): Promise; + abstract get(userId: UserId | undefined, appId: string): Promise; } diff --git a/libs/common/src/platform/services/config/config-api.service.ts b/libs/common/src/platform/services/config/config-api.service.ts index f283410acea..2e8ba17cf09 100644 --- a/libs/common/src/platform/services/config/config-api.service.ts +++ b/libs/common/src/platform/services/config/config-api.service.ts @@ -10,13 +10,15 @@ export class ConfigApiService implements ConfigApiServiceAbstraction { private tokenService: TokenService, ) {} - async get(userId: UserId | undefined): Promise { + async get(userId: UserId | undefined, appId: string): Promise { // Authentication adds extra context to config responses, if the user has an access token, we want to use it // We don't particularly care about ensuring the token is valid and not expired, just that it exists const authed: boolean = userId == null ? false : (await this.tokenService.getAccessToken(userId)) != null; - const r = await this.apiService.send("GET", "/config", null, authed, true); + const r = await this.apiService.send("GET", "/config", null, authed, true, null, (headers) => { + headers.set("Device-Identifier", appId); + }); return new ServerConfigResponse(r); } } diff --git a/libs/common/src/platform/services/config/config.service.spec.ts b/libs/common/src/platform/services/config/config.service.spec.ts index 369338f945f..1beedf77063 100644 --- a/libs/common/src/platform/services/config/config.service.spec.ts +++ b/libs/common/src/platform/services/config/config.service.spec.ts @@ -18,6 +18,7 @@ import { AuthService } from "../../../auth/abstractions/auth.service"; import { AuthenticationStatus } from "../../../auth/enums/authentication-status"; import { FeatureFlag } from "../../../enums/feature-flag.enum"; import { UserId } from "../../../types/guid"; +import { AppIdService } from "../../abstractions/app-id.service"; import { ConfigApiServiceAbstraction } from "../../abstractions/config/config-api.service.abstraction"; import { ServerConfig } from "../../abstractions/config/server-config"; import { Environment, EnvironmentService } from "../../abstractions/environment.service"; @@ -46,6 +47,7 @@ describe("ConfigService", () => { const authService = mock({ authStatusFor$: (userId) => of(AuthenticationStatus.Unlocked), }); + const appIdService = mock(); let stateProvider: FakeStateProvider; let globalState: FakeGlobalState>; let userState: FakeSingleUserState; @@ -81,6 +83,7 @@ describe("ConfigService", () => { logService, stateProvider, authService, + appIdService, ); }); @@ -218,6 +221,7 @@ describe("ConfigService", () => { mock({ authStatusFor$: () => of(AuthenticationStatus.Locked), }), + appIdService, ); const config = await firstValueFrom(sut.serverConfig$); @@ -243,6 +247,7 @@ describe("ConfigService", () => { logService, stateProvider, authService, + appIdService, ); }); @@ -296,6 +301,7 @@ describe("ConfigService", () => { logService, stateProvider, authService, + appIdService, ); userState.nextState(null); @@ -349,6 +355,7 @@ describe("ConfigService", () => { logService, stateProvider, authService, + appIdService, ); }); diff --git a/libs/common/src/platform/services/config/default-config.service.ts b/libs/common/src/platform/services/config/default-config.service.ts index cc52a5b8dad..b79b4171864 100644 --- a/libs/common/src/platform/services/config/default-config.service.ts +++ b/libs/common/src/platform/services/config/default-config.service.ts @@ -23,6 +23,7 @@ import { FeatureFlagValueType, } from "../../../enums/feature-flag.enum"; import { UserId } from "../../../types/guid"; +import { AppIdService } from "../../abstractions/app-id.service"; import { ConfigApiServiceAbstraction } from "../../abstractions/config/config-api.service.abstraction"; import { ConfigService } from "../../abstractions/config/config.service"; import { ServerConfig } from "../../abstractions/config/server-config"; @@ -70,6 +71,7 @@ export class DefaultConfigService implements ConfigService { private logService: LogService, private stateProvider: StateProvider, private authService: AuthService, + private appIdService: AppIdService, ) { const userId$ = this.stateProvider.activeUserId$; const authStatus$ = userId$.pipe( @@ -186,7 +188,8 @@ export class DefaultConfigService implements ConfigService { ); this.failedFetchFallbackSubject.next(existingConfig); }, SLOW_EMISSION_GUARD); - const response = await this.configApiService.get(userId); + const appId = await this.appIdService.getAppId(); + const response = await this.configApiService.get(userId, appId); clearTimeout(handle); const newConfig = new ServerConfig(new ServerConfigData(response));