From c18cae31994474b48f61308fbcbb0d28c4903051 Mon Sep 17 00:00:00 2001 From: Zai Shi Date: Fri, 25 Jul 2025 10:02:01 -0700 Subject: [PATCH] Refactor updateConfigOverrides to handle legacy config structure and improve config management in StackAdminInterface --- .../src/interface/admin-interface.ts | 59 ++++++++++++++++++- .../apps/implementations/admin-app-impl.ts | 9 ++- 2 files changed, 64 insertions(+), 4 deletions(-) diff --git a/packages/stack-shared/src/interface/admin-interface.ts b/packages/stack-shared/src/interface/admin-interface.ts index de20ea4dc..d9086b56e 100644 --- a/packages/stack-shared/src/interface/admin-interface.ts +++ b/packages/stack-shared/src/interface/admin-interface.ts @@ -1,4 +1,5 @@ import { InternalSession } from "../sessions"; +import { filterUndefined, typedFromEntries } from "../utils/objects"; import { ConfigOverridesCrud } from "./crud/config-overrides"; import { EmailTemplateCrud, EmailTemplateType } from "./crud/email-templates"; import { InternalEmailsCrud } from "./crud/emails"; @@ -482,10 +483,64 @@ export class StackAdminInterface extends StackServerInterface { return await response.json(); } - async updateConfigOverrides(data: ConfigOverridesCrud["Admin"]["Update"]): Promise { + async updateConfigOverrides(data: { config: any }): Promise { + const legacyConfig = data.config; + + const configOverrideOverride = filterUndefined({ + // ======================= auth ======================= + 'auth.allowSignUp': legacyConfig.sign_up_enabled, + 'auth.password.allowSignIn': legacyConfig.credential_enabled, + 'auth.otp.allowSignIn': legacyConfig.magic_link_enabled, + 'auth.passkey.allowSignIn': legacyConfig.passkey_enabled, + 'auth.oauth.accountMergeStrategy': legacyConfig.oauth_account_merge_strategy, + 'auth.oauth.providers': legacyConfig.oauth_providers ? typedFromEntries(legacyConfig.oauth_providers + .map((provider: any) => { + return [ + provider.id, + { + type: provider.id, + isShared: provider.type === "shared", + clientId: provider.client_id, + clientSecret: provider.client_secret, + facebookConfigId: provider.facebook_config_id, + microsoftTenantId: provider.microsoft_tenant_id, + allowSignIn: true, + allowConnectedAccounts: true, + } + ]; + })) : undefined, + // ======================= users ======================= + 'users.allowClientUserDeletion': legacyConfig.client_user_deletion_enabled, + // ======================= teams ======================= + 'teams.allowClientTeamCreation': legacyConfig.client_team_creation_enabled, + 'teams.createPersonalTeamOnSignUp': legacyConfig.create_team_on_sign_up, + // ======================= domains ======================= + 'domains.allowLocalhost': legacyConfig.allow_localhost ?? true, + 'domains.trustedDomains': legacyConfig.domains ? legacyConfig.domains.map((domain: any) => { + return { + baseUrl: domain.domain, + handlerPath: domain.handler_path, + }; + }) : undefined, + // ======================= api keys ======================= + 'apiKeys.enabled.user': legacyConfig.allow_user_api_keys, + 'apiKeys.enabled.team': legacyConfig.allow_team_api_keys, + // ======================= emails ======================= + 'emails.server': legacyConfig.email_config ? { + isShared: legacyConfig.email_config.type === 'shared', + host: legacyConfig.email_config.host, + port: legacyConfig.email_config.port, + username: legacyConfig.email_config.username, + password: legacyConfig.email_config.password, + senderName: legacyConfig.email_config.sender_name, + senderEmail: legacyConfig.email_config.sender_email, + } : undefined, + 'emails.theme': legacyConfig.email_theme, + }); + const response = await this.sendAdminRequest( `/internal/config-overrides`, - { method: "PATCH", body: JSON.stringify(data) }, + { method: "PATCH", body: JSON.stringify({ config: JSON.stringify(configOverrideOverride) }) }, null, ); return await response.json(); diff --git a/packages/template/src/lib/stack-app/apps/implementations/admin-app-impl.ts b/packages/template/src/lib/stack-app/apps/implementations/admin-app-impl.ts index 3a574c649..119ed55ba 100644 --- a/packages/template/src/lib/stack-app/apps/implementations/admin-app-impl.ts +++ b/packages/template/src/lib/stack-app/apps/implementations/admin-app-impl.ts @@ -5,7 +5,7 @@ import { EmailTemplateCrud, EmailTemplateType } from "@stackframe/stack-shared/d import { InternalApiKeysCrud } from "@stackframe/stack-shared/dist/interface/crud/internal-api-keys"; import { ProjectsCrud } from "@stackframe/stack-shared/dist/interface/crud/projects"; import { StackAssertionError, throwErr } from "@stackframe/stack-shared/dist/utils/errors"; -import { pick } from "@stackframe/stack-shared/dist/utils/objects"; +import { filterUndefined, pick } from "@stackframe/stack-shared/dist/utils/objects"; import { Result } from "@stackframe/stack-shared/dist/utils/results"; import { useMemo } from "react"; // THIS_LINE_PLATFORM react-like import { AdminSentEmail } from "../.."; @@ -152,7 +152,12 @@ export class _StackAdminAppImplIncomplete