Files
insistence a89aec54aa feat: 新增 OAuth 2.0 / OIDC 统一认证中心 (#129)
* feat: 新增统一认证中心

* perf: 优化代码

* fix: 修复问题

* perf: 优化页面

* fix: 修复部分接口缺失Request参数的问题

* perf: 优化访问控制机制

* perf: 优化代码

* fix: 修复 Logout Token 缺少 exp

* perf&fix: 优化和修复

* perf: 优化代码

* perf: 优化代码

* fix: 修复测试问题
2026-10-01 22:56:05 +08:00

100 lines
2.8 KiB
Python

from dataclasses import dataclass
from cli.tui.actions.builders import TuiActionSpecFactory, TuiActionTemplate
from cli.tui.actions.models import ActionSlot, TuiActionSpec
from cli.tui.adapters.models import BrowserRecordSnapshot
@dataclass(frozen=True)
class TuiActionSlotResolver:
"""
TUI 动作槽位解析器。
该对象将一个页面支持的槽位动作集中定义为映射关系,避免继续在
`resolve_*_action` 中堆叠条件分支。
:param slot_templates: 槽位到动作模板的映射
:param spec_factory: 动作规格构建器
"""
slot_templates: dict[ActionSlot, TuiActionTemplate]
spec_factory: TuiActionSpecFactory
def resolve(
self,
*,
slot: ActionSlot,
record: BrowserRecordSnapshot | None,
env: str,
) -> TuiActionSpec | None:
"""
解析指定槽位的动作定义。
:param slot: 动作槽位
:param record: 当前选中记录
:param env: 当前运行环境
:return: 动作定义
"""
template = self.slot_templates.get(slot)
if template is None:
return None
return template.build(record=record, env=env, spec_factory=self.spec_factory)
@dataclass(frozen=True)
class TuiActionRegistry:
"""
TUI 动作注册表。
该注册表负责集中维护浏览页和详情页的动作解析器,从而将
原本散落的条件分发收敛为可声明的映射关系。
:param browser_resolvers: 浏览页动作槽位解析器映射
:param detail_resolvers: 详情页动作槽位解析器映射
"""
browser_resolvers: dict[str, TuiActionSlotResolver]
detail_resolvers: dict[str, TuiActionSlotResolver]
def resolve_browser_action(
self,
*,
view_key: str,
slot: ActionSlot,
record: BrowserRecordSnapshot | None,
env: str,
) -> TuiActionSpec | None:
"""
解析浏览页动作。
:param view_key: 当前页面视图标识
:param slot: 动作槽位
:param record: 当前选中记录
:param env: 当前运行环境
:return: 动作定义
"""
resolver = self.browser_resolvers.get(view_key)
if resolver is None:
return None
return resolver.resolve(slot=slot, record=record, env=env)
def resolve_detail_action(
self,
*,
view_key: str,
slot: ActionSlot,
env: str,
) -> TuiActionSpec | None:
"""
解析详情页动作。
:param view_key: 当前页面视图标识
:param slot: 动作槽位
:param env: 当前运行环境
:return: 动作定义
"""
resolver = self.detail_resolvers.get(view_key)
if resolver is None:
return None
return resolver.resolve(slot=slot, record=None, env=env)