From c4aafe94136baa1c0d7eb409999587b567a03a7b Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 5 Apr 2026 23:15:25 +0800 Subject: [PATCH] feat: store worldlabs import token in db --- app/api/worldlabs/key-pool/import/route.ts | 6 ++- lib/worldlabs/key-pool-config.ts | 46 ++++++++++++++++++++++ 2 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 lib/worldlabs/key-pool-config.ts diff --git a/app/api/worldlabs/key-pool/import/route.ts b/app/api/worldlabs/key-pool/import/route.ts index b1e760fd9..2ec9205ed 100644 --- a/app/api/worldlabs/key-pool/import/route.ts +++ b/app/api/worldlabs/key-pool/import/route.ts @@ -8,6 +8,7 @@ import { sanitizeWorldLabsApiKey, sanitizeWorldLabsBaseUrl, } from "@/lib/worldlabs/server"; +import { getWorldLabsKeyPoolConfig } from "@/lib/worldlabs/key-pool-config"; export const runtime = "nodejs"; export const maxDuration = 60; @@ -105,13 +106,14 @@ function maskKey(value: string) { export async function POST(request: Request) { try { - const configuredToken = getConfiguredImportToken(); + const dbConfig = await getWorldLabsKeyPoolConfig(); + const configuredToken = dbConfig.importToken || getConfiguredImportToken(); if (!configuredToken) { return Response.json( { success: false, error: - "服务端未配置 WORLDLABS_KEY_POOL_IMPORT_TOKEN,无法使用专用导入接口", + "服务端未配置 World Labs key 池导入令牌,无法使用专用导入接口", }, { status: 503 } ); diff --git a/lib/worldlabs/key-pool-config.ts b/lib/worldlabs/key-pool-config.ts new file mode 100644 index 000000000..2bc21d6f9 --- /dev/null +++ b/lib/worldlabs/key-pool-config.ts @@ -0,0 +1,46 @@ +import "server-only"; + +import { getSystemSetting } from "@/lib/db/queries"; + +export const WORLDLABS_KEY_POOL_CONFIG_KEY = "worldlabs_key_pool_config"; + +export type WorldLabsKeyPoolConfig = { + importToken: string; +}; + +export const defaultWorldLabsKeyPoolConfig: WorldLabsKeyPoolConfig = { + importToken: "", +}; + +function normalizeImportToken(value: unknown) { + return String(value || "") + .replace(/[\u2028\u2029]/g, "") + .replace(/[\u0000-\u001F\u007F]/g, "") + .trim(); +} + +export function normalizeWorldLabsKeyPoolConfig( + value: unknown +): WorldLabsKeyPoolConfig { + if (!value || typeof value !== "object") { + return defaultWorldLabsKeyPoolConfig; + } + + const raw = value as Partial; + return { + importToken: normalizeImportToken(raw.importToken), + }; +} + +export async function getWorldLabsKeyPoolConfig(): Promise { + try { + const setting = await getSystemSetting({ + key: WORLDLABS_KEY_POOL_CONFIG_KEY, + }); + return setting?.value + ? normalizeWorldLabsKeyPoolConfig(setting.value) + : defaultWorldLabsKeyPoolConfig; + } catch (_error) { + return defaultWorldLabsKeyPoolConfig; + } +}