From f7d0630fe61cf304afeeaf519d18be108e54ab75 Mon Sep 17 00:00:00 2001 From: CNWei Date: Fri, 6 Nov 2026 13:51:28 +0800 Subject: [PATCH] =?UTF-8?q?chore(settings):=20=E5=8E=BB=E6=8E=89=E8=80=81?= =?UTF-8?q?=E5=BA=93=E8=87=AA=E5=8A=A8=E8=A1=A5=E5=86=85=E7=BD=AE=E5=BC=95?= =?UTF-8?q?=E6=93=8E=E7=9A=84=E5=85=BC=E5=AE=B9=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - load() 不再把缺的内置引擎补进返回结果;老库缺内置引擎时保存会被 400 拒绝(不做自动迁移) - 删除对应的 load_merges_new_builtin_engines 测试 - HANDOFF 同步说明 --- HANDOFF.md | 2 +- src/db/settings.rs | 54 +--------------------------------------------- 2 files changed, 2 insertions(+), 54 deletions(-) diff --git a/HANDOFF.md b/HANDOFF.md index 3642e75..17b596e 100644 --- a/HANDOFF.md +++ b/HANDOFF.md @@ -134,7 +134,7 @@ stash-ui/src/components/ SearchField / Input / EngineIcon 等 - 上面是字段结构示例;实际值以 `GET /api/settings` 为准(交接时 `search.default=internal`、`site.theme=light`,background 两项使用自定义 picsum 图)。 - 外部引擎 URL 必须以 `http(s)://` 开头并包含 `{query}`,否则后端 400。 - 引擎 id 只能用小写字母 / 数字 / `-` / `_`(1–30 位,`internal` 保留);内置六个(含 DuckDuckGo)用品牌图标, - 且**不能删除**(只能改名 / 改地址 / 停用;老库读取时自动补齐缺的内置引擎); + 且**不能删除**(只能改名 / 改地址 / 停用)。不做老库兼容:库里的设置缺内置引擎时,保存会 400; 后台新加的引擎 id 自动生成为 `custom-xxx`、图标用通用地球(组件库 EngineIcon 自动回落)。 - 每个引擎可带 `icon`(png / svg 地址,`/` 开头的托管路径或 http(s) 链接):给了就用 `` 渲染自己 的图标,留空回落到品牌图标 / 地球;SVG 走 img 是静态的,不执行脚本。 diff --git a/src/db/settings.rs b/src/db/settings.rs index 7c97307..059b55a 100644 --- a/src/db/settings.rs +++ b/src/db/settings.rs @@ -567,32 +567,7 @@ pub fn load(conn: &Connection) -> Result { Settings::default() }); - Ok(SettingsDocument { - version, - settings: with_builtin_engines(settings), - }) -} - -/// 老库里没有后来新增的内置引擎时补一份默认配置; -/// 用户已经改过的名称 / 地址 / 启停保持不动(按 id 判断),新增的插在内置引擎那一组里。 -fn with_builtin_engines(mut settings: Settings) -> Settings { - let builtin_ids: std::collections::HashSet<&str> = - BUILTIN_ENGINE_IDS.iter().copied().collect(); - - for engine in SearchSettings::default().engines { - if settings.search.engines.iter().any(|item| item.id == engine.id) { - continue; - } - let insert_at = settings - .search - .engines - .iter() - .rposition(|item| builtin_ids.contains(item.id.as_str())) - .map(|position| position + 1) - .unwrap_or(0); - settings.search.engines.insert(insert_at, engine); - } - settings + Ok(SettingsDocument { version, settings }) } /// 保存设置;`expected_version` 与库里不一致时返回冲突。 @@ -741,33 +716,6 @@ mod tests { assert!(save(&mut conn, renamed, 0).is_ok()); } - #[test] - fn load_merges_new_builtin_engines() { - let conn = db(); - let mut old = Settings::default(); - old.search.engines.retain(|engine| engine.id != "duckduckgo"); - old.search.engines[0].name = "我改过的 Google".into(); - let raw = serde_json::to_string(&old).expect("应能序列化"); - conn.execute( - "INSERT INTO setting (key, value, version, updated_at) VALUES (?1, ?2, 5, 0)", - params![SETTINGS_KEY, raw], - ) - .expect("应能写入旧设置"); - - let loaded = load(&conn).expect("应能读取"); - assert_eq!(loaded.version, 5); - assert_eq!(loaded.settings.search.engines[0].name, "我改过的 Google"); - assert!( - loaded - .settings - .search - .engines - .iter() - .any(|engine| engine.id == "duckduckgo"), - "老设置里缺的 DuckDuckGo 应被补上" - ); - } - #[test] fn invalid_settings_are_rejected() { let mut conn = db();