mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-09-05 23:47:41 +08:00
refactor(notification): 建立通知渠道通用管理契约 channel_manage
- schemas 层新增 NotificationAction 公共动作词汇表(状态/二维码/退出/连通性/缓存迁移) - 模块实现统一 channel_manage(channel, action, **params),按渠道名路由, 非本渠道返回 None;动作语义、表单参数解释与临时参数初始化封闭在模块内 - NotificationChain 收敛为单一 manage_channel 纯透明转发, chain 层不再出现任何渠道名与模块特色 - endpoint 路由路径保持前端兼容,内部统一走通用接口 - 新增 6 项契约守护测试,文档记录通用模式:新渠道接入无需改 chain
This commit is contained in:
+19
-103
@@ -1,114 +1,30 @@
|
||||
from typing import Any, Dict, Tuple
|
||||
from typing import Any, Dict
|
||||
|
||||
from app.chain import ChainBase
|
||||
from app.schemas.types import MessageChannel, NotificationAction
|
||||
|
||||
|
||||
class NotificationChain(ChainBase):
|
||||
"""
|
||||
通知渠道管理链,仅做模块方法名契约的薄分发,渠道连接与能力全部封闭在模块内部
|
||||
通知渠道管理链,仅按渠道名透明转发管理动作到模块
|
||||
|
||||
不包含任何渠道特定逻辑:动作语义、表单参数解释、客户端实例解析与
|
||||
临时参数初始化全部封闭在实现 channel_manage 契约的模块内部
|
||||
"""
|
||||
|
||||
def get_wechatclawbot_status(
|
||||
def manage_channel(
|
||||
self,
|
||||
source=None,
|
||||
fallback_source=None,
|
||||
WECHATCLAWBOT_BASE_URL=None,
|
||||
WECHATCLAWBOT_DEFAULT_TARGET=None,
|
||||
WECHATCLAWBOT_ADMINS=None,
|
||||
WECHATCLAWBOT_POLL_TIMEOUT=None,
|
||||
refresh_remote: bool = True,
|
||||
auto_generate_qrcode: bool = True,
|
||||
channel: MessageChannel,
|
||||
action: NotificationAction,
|
||||
**params: Any,
|
||||
) -> Dict[str, Any]:
|
||||
"""查询微信 ClawBot 登录状态与二维码。"""
|
||||
result = self.run_module(
|
||||
"wechatclawbot_status",
|
||||
source=source,
|
||||
fallback_source=fallback_source,
|
||||
WECHATCLAWBOT_BASE_URL=WECHATCLAWBOT_BASE_URL,
|
||||
WECHATCLAWBOT_DEFAULT_TARGET=WECHATCLAWBOT_DEFAULT_TARGET,
|
||||
WECHATCLAWBOT_ADMINS=WECHATCLAWBOT_ADMINS,
|
||||
WECHATCLAWBOT_POLL_TIMEOUT=WECHATCLAWBOT_POLL_TIMEOUT,
|
||||
refresh_remote=refresh_remote,
|
||||
auto_generate_qrcode=auto_generate_qrcode,
|
||||
)
|
||||
return result or {"success": False, "message": "微信 ClawBot 通知未启用或配置尚未保存"}
|
||||
"""
|
||||
对指定通知渠道执行管理动作
|
||||
|
||||
def refresh_wechatclawbot_qrcode(
|
||||
self,
|
||||
source=None,
|
||||
fallback_source=None,
|
||||
WECHATCLAWBOT_BASE_URL=None,
|
||||
WECHATCLAWBOT_DEFAULT_TARGET=None,
|
||||
WECHATCLAWBOT_ADMINS=None,
|
||||
WECHATCLAWBOT_POLL_TIMEOUT=None,
|
||||
) -> Dict[str, Any]:
|
||||
"""刷新微信 ClawBot 登录二维码。"""
|
||||
result = self.run_module(
|
||||
"wechatclawbot_refresh_qrcode",
|
||||
source=source,
|
||||
fallback_source=fallback_source,
|
||||
WECHATCLAWBOT_BASE_URL=WECHATCLAWBOT_BASE_URL,
|
||||
WECHATCLAWBOT_DEFAULT_TARGET=WECHATCLAWBOT_DEFAULT_TARGET,
|
||||
WECHATCLAWBOT_ADMINS=WECHATCLAWBOT_ADMINS,
|
||||
WECHATCLAWBOT_POLL_TIMEOUT=WECHATCLAWBOT_POLL_TIMEOUT,
|
||||
)
|
||||
return result or {"success": False, "message": "微信 ClawBot 通知未启用或配置尚未保存"}
|
||||
|
||||
def logout_wechatclawbot(
|
||||
self,
|
||||
source=None,
|
||||
fallback_source=None,
|
||||
WECHATCLAWBOT_BASE_URL=None,
|
||||
WECHATCLAWBOT_DEFAULT_TARGET=None,
|
||||
WECHATCLAWBOT_ADMINS=None,
|
||||
WECHATCLAWBOT_POLL_TIMEOUT=None,
|
||||
) -> Dict[str, Any]:
|
||||
"""退出微信 ClawBot 登录。"""
|
||||
result = self.run_module(
|
||||
"wechatclawbot_logout",
|
||||
source=source,
|
||||
fallback_source=fallback_source,
|
||||
WECHATCLAWBOT_BASE_URL=WECHATCLAWBOT_BASE_URL,
|
||||
WECHATCLAWBOT_DEFAULT_TARGET=WECHATCLAWBOT_DEFAULT_TARGET,
|
||||
WECHATCLAWBOT_ADMINS=WECHATCLAWBOT_ADMINS,
|
||||
WECHATCLAWBOT_POLL_TIMEOUT=WECHATCLAWBOT_POLL_TIMEOUT,
|
||||
)
|
||||
return result or {"success": False, "message": "微信 ClawBot 通知未启用或配置尚未保存"}
|
||||
|
||||
def test_wechatclawbot_connection(
|
||||
self,
|
||||
source=None,
|
||||
fallback_source=None,
|
||||
WECHATCLAWBOT_BASE_URL=None,
|
||||
WECHATCLAWBOT_DEFAULT_TARGET=None,
|
||||
WECHATCLAWBOT_ADMINS=None,
|
||||
WECHATCLAWBOT_POLL_TIMEOUT=None,
|
||||
) -> Dict[str, Any]:
|
||||
"""测试微信 ClawBot 当前登录态是否可用。"""
|
||||
result = self.run_module(
|
||||
"wechatclawbot_test_connection",
|
||||
source=source,
|
||||
fallback_source=fallback_source,
|
||||
WECHATCLAWBOT_BASE_URL=WECHATCLAWBOT_BASE_URL,
|
||||
WECHATCLAWBOT_DEFAULT_TARGET=WECHATCLAWBOT_DEFAULT_TARGET,
|
||||
WECHATCLAWBOT_ADMINS=WECHATCLAWBOT_ADMINS,
|
||||
WECHATCLAWBOT_POLL_TIMEOUT=WECHATCLAWBOT_POLL_TIMEOUT,
|
||||
)
|
||||
return result or {"success": False, "message": "微信 ClawBot 通知未启用或配置尚未保存"}
|
||||
|
||||
def migrate_wechatclawbot_cache(
|
||||
self,
|
||||
old_name: str,
|
||||
new_name: str,
|
||||
cleanup_old: bool = False,
|
||||
overwrite: bool = False,
|
||||
) -> Tuple[bool, str]:
|
||||
"""在通知名称变更时迁移对应的微信 ClawBot 登录缓存。"""
|
||||
result = self.run_module(
|
||||
"wechatclawbot_migrate_cache",
|
||||
old_name=old_name,
|
||||
new_name=new_name,
|
||||
cleanup_old=cleanup_old,
|
||||
overwrite=overwrite,
|
||||
)
|
||||
return result or (False, "微信 ClawBot 通知未启用")
|
||||
:param channel: 渠道标识,用于模块路由
|
||||
:param action: 通用管理动作,具体语义由渠道模块解释
|
||||
:param params: 表单与动作参数,原样透传给模块
|
||||
:return: 统一结构 {"success": bool, "message": ..., ...}
|
||||
"""
|
||||
result = self.run_module("channel_manage", channel=channel, action=action, **params)
|
||||
return result or {"success": False, "message": "该通知渠道未启用或不支持此管理动作"}
|
||||
|
||||
Reference in New Issue
Block a user