chore(settings): 去掉老库自动补内置引擎的兼容逻辑
- load() 不再把缺的内置引擎补进返回结果;老库缺内置引擎时保存会被 400 拒绝(不做自动迁移) - 删除对应的 load_merges_new_builtin_engines 测试 - HANDOFF 同步说明
This commit is contained in:
+1
-1
@@ -134,7 +134,7 @@ stash-ui/src/components/ SearchField / Input / EngineIcon 等
|
|||||||
- 上面是字段结构示例;实际值以 `GET /api/settings` 为准(交接时 `search.default=internal`、`site.theme=light`,background 两项使用自定义 picsum 图)。
|
- 上面是字段结构示例;实际值以 `GET /api/settings` 为准(交接时 `search.default=internal`、`site.theme=light`,background 两项使用自定义 picsum 图)。
|
||||||
- 外部引擎 URL 必须以 `http(s)://` 开头并包含 `{query}`,否则后端 400。
|
- 外部引擎 URL 必须以 `http(s)://` 开头并包含 `{query}`,否则后端 400。
|
||||||
- 引擎 id 只能用小写字母 / 数字 / `-` / `_`(1–30 位,`internal` 保留);内置六个(含 DuckDuckGo)用品牌图标,
|
- 引擎 id 只能用小写字母 / 数字 / `-` / `_`(1–30 位,`internal` 保留);内置六个(含 DuckDuckGo)用品牌图标,
|
||||||
且**不能删除**(只能改名 / 改地址 / 停用;老库读取时自动补齐缺的内置引擎);
|
且**不能删除**(只能改名 / 改地址 / 停用)。不做老库兼容:库里的设置缺内置引擎时,保存会 400;
|
||||||
后台新加的引擎 id 自动生成为 `custom-xxx`、图标用通用地球(组件库 EngineIcon 自动回落)。
|
后台新加的引擎 id 自动生成为 `custom-xxx`、图标用通用地球(组件库 EngineIcon 自动回落)。
|
||||||
- 每个引擎可带 `icon`(png / svg 地址,`/` 开头的托管路径或 http(s) 链接):给了就用 `<img>` 渲染自己
|
- 每个引擎可带 `icon`(png / svg 地址,`/` 开头的托管路径或 http(s) 链接):给了就用 `<img>` 渲染自己
|
||||||
的图标,留空回落到品牌图标 / 地球;SVG 走 img 是静态的,不执行脚本。
|
的图标,留空回落到品牌图标 / 地球;SVG 走 img 是静态的,不执行脚本。
|
||||||
|
|||||||
+1
-53
@@ -567,32 +567,7 @@ pub fn load(conn: &Connection) -> Result<SettingsDocument, StashError> {
|
|||||||
Settings::default()
|
Settings::default()
|
||||||
});
|
});
|
||||||
|
|
||||||
Ok(SettingsDocument {
|
Ok(SettingsDocument { version, settings })
|
||||||
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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// 保存设置;`expected_version` 与库里不一致时返回冲突。
|
/// 保存设置;`expected_version` 与库里不一致时返回冲突。
|
||||||
@@ -741,33 +716,6 @@ mod tests {
|
|||||||
assert!(save(&mut conn, renamed, 0).is_ok());
|
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]
|
#[test]
|
||||||
fn invalid_settings_are_rejected() {
|
fn invalid_settings_are_rejected() {
|
||||||
let mut conn = db();
|
let mut conn = db();
|
||||||
|
|||||||
Reference in New Issue
Block a user