export const PRODUCT_PLANNING_API_CONFIG_KEY = "product_planning_api_config"; export type ProductPlanningApiConfig = { oneboundBaseUrl: string; taobaoApiKey: string; taobaoApiSecret: string; qaApiUrl: string; qaToken: string; saleApiUrl: string; saleToken: string; }; const DEFAULT_ONEBOUND_BASE_URL = "https://api-gw.onebound.cn"; const DEFAULT_QA_API_URL = "http://119.91.237.2:5432/taobao_social_feed_aggregate"; const DEFAULT_SALE_API_URL = "http://119.91.237.2:5432/taobao_item_month_sale"; function normalizeUrl(value: unknown, fallback: string) { const normalized = String(value || "").trim().replace(/\/+$/, ""); const normalizedFallback = String(fallback || "").trim().replace(/\/+$/, ""); return normalized || normalizedFallback; } function normalizeSecret(value: unknown, fallback = "") { const normalized = String(value || "").trim(); const normalizedFallback = String(fallback || "").trim(); return normalized || normalizedFallback; } export function defaultProductPlanningApiConfig(): ProductPlanningApiConfig { return { oneboundBaseUrl: DEFAULT_ONEBOUND_BASE_URL, taobaoApiKey: "", taobaoApiSecret: "", qaApiUrl: DEFAULT_QA_API_URL, qaToken: "", saleApiUrl: DEFAULT_SALE_API_URL, saleToken: "", }; } export function normalizeProductPlanningApiConfig( value: unknown, fallback?: Partial ): ProductPlanningApiConfig { const raw = value && typeof value === "object" && !Array.isArray(value) ? (value as Record) : {}; return { oneboundBaseUrl: normalizeUrl(raw.oneboundBaseUrl, fallback?.oneboundBaseUrl || DEFAULT_ONEBOUND_BASE_URL), taobaoApiKey: normalizeSecret(raw.taobaoApiKey, fallback?.taobaoApiKey || ""), taobaoApiSecret: normalizeSecret(raw.taobaoApiSecret, fallback?.taobaoApiSecret || ""), qaApiUrl: normalizeUrl(raw.qaApiUrl, fallback?.qaApiUrl || DEFAULT_QA_API_URL), qaToken: normalizeSecret(raw.qaToken, fallback?.qaToken || ""), saleApiUrl: normalizeUrl(raw.saleApiUrl, fallback?.saleApiUrl || DEFAULT_SALE_API_URL), saleToken: normalizeSecret(raw.saleToken, fallback?.saleToken || ""), }; }