fix: settings PUT 后热更新内存 — 无需重启即生效

问题:修改 Telegram 等设置后需要重启服务器才能生效,
因为 load_settings_from_db() 只在启动时运行。

修复:PUT /api/settings/{key} 写入 DB 后,
同步更新 settings 内存对象(DB_OVERRIDE_MAP 映射 + INT_SETTINGS 类型转换)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Your Name
2026-05-30 20:28:51 +08:00
parent 4c4d41b8f5
commit ede7fbaa64
+17 -1
View File
@@ -102,13 +102,29 @@ async def set_setting(
admin: Admin = Depends(get_current_admin),
db: AsyncSession = Depends(get_db),
):
"""Set a system setting value (immutable keys are rejected)"""
"""Set a system setting value (immutable keys are rejected)
Writes to DB AND hot-reloads the in-memory settings object so changes
take effect immediately without server restart.
"""
if key in IMMUTABLE_KEYS:
raise HTTPException(status_code=403, detail=f"Setting '{key}' is immutable and cannot be modified via API")
repo = SettingRepositoryImpl(db)
setting = await repo.set(key, str(payload.value))
# Hot-reload: update in-memory settings so changes take effect immediately
from server.config import settings as _settings
attr_name = _settings.DB_OVERRIDE_MAP.get(key)
if attr_name and hasattr(_settings, attr_name):
value = setting.value
if attr_name in _settings.INT_SETTINGS:
try:
value = int(value)
except (ValueError, TypeError):
pass
setattr(_settings, attr_name, value)
# Audit log
audit_repo = AuditLogRepositoryImpl(db)
await audit_repo.create(AuditLog(