fix(notify): 环境变量只给模板 id 时保留内置的字段映射

站长在 Gitea 里设了 WECHAT_MINI_SUBSCRIBE_TEMPLATES。若值里只写 id 不写 fields,
原来会把该模板的字段映射整个替换掉 → buildTemplateData 退回默认映射
(thing1/time2/thing3)→ 发给微信直接 47003。

现在按键合并:给了 fields 就用,没给就沿用内置的(SONG_REJECTED: thing6←songTitle,
thing4←reason)。坏 JSON / 裸字符串 / 空对象一律忽略,仍用内置模板。

已验证(8 项断言):内置默认、只给 id(保住映射)、id+fields(完全覆盖)、三种坏值。
This commit is contained in:
2026-09-27 15:30:17 +08:00
parent 575e8b9f57
commit 64a81393b5
+13 -1
View File
@@ -61,7 +61,19 @@ export function getSubscribeTemplates(): Record<string, TemplateConf> {
if (parsed && typeof parsed === 'object') { if (parsed && typeof parsed === 'object') {
Object.keys(parsed).forEach((k) => { Object.keys(parsed).forEach((k) => {
const conf = parsed[k] const conf = parsed[k]
if (conf && conf.id) merged[k] = conf if (!conf || !conf.id) return
const base = merged[k]
/*
* 环境变量**按键覆盖内置模板**,但只覆盖它给到的部分:
* · 给了 id 但没给 fields → 沿用内置的字段映射(否则会退化成
* thing1/time2/thing3 的默认映射,发给微信直接 47003);
* · 给了 fields → 用它。
* 这样"只想换个模板 ID"时不用把 fields 一起抄一遍。
*/
merged[k] = {
id: conf.id,
fields: conf.fields && typeof conf.fields === 'object' ? conf.fields : base && base.fields
}
}) })
} }
} catch (err) { } catch (err) {