ForcePilot/backend/package/yuxi/channels/contract/dtos/doctor.py
Kris 00092c818e chore: 批量代码优化与规范完善
本次提交包含多项代码优化与规范修正:
1. 文档与注释优化:修正注释术语、补充注解与FR编号
2. 代码格式调整:统一空格、换行与缩进规范
3. 类型与接口完善:补充__all__导出、修正返回类型注解
4. 错误处理增强:新增领域错误类与校验逻辑
5. 依赖与导入调整:修复路径引用、统一时区导入
6. 协议与契约更新:完善接口文档与一致性注解
2026-07-03 19:18:13 +08:00

160 lines
4.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""配置诊断 DTO。
定义渠道配置诊断与修复的不可变值对象,包括诊断严重级别、诊断检查项、诊断
结果、修复结果、连通性结果与权限结果。所有 DTO 均为
``dataclass(frozen=True)``,仅依赖标准库,用于配置诊断流程的结果回传与
修复策略决策。集合字段使用 tuple 以保证 frozen dataclass 的不可变语义。
"""
from __future__ import annotations
from dataclasses import dataclass
from enum import StrEnum
from yuxi.channels.contract.errors import ValidationError
class DiagnosticSeverity(StrEnum):
"""诊断严重级别。
标识诊断检查项的严重程度,用于结果聚合与修复优先级决策。继承
``str, Enum`` 以支持 JSON 序列化与字符串比较。
取值:
INFO: 提示信息。
WARNING: 警告。
ERROR: 错误。
CRITICAL: 严重错误。
"""
INFO = "info"
WARNING = "warning"
ERROR = "error"
CRITICAL = "critical"
@dataclass(frozen=True)
class DiagnosticCheck:
"""诊断检查项。
描述一项配置诊断检查的元信息,包括检查 ID、名称、严重级别、描述与是否
支持自动修复。
字段:
check_id: 检查 ID。
name: 检查名称。
severity: 严重级别。
description: 检查描述。
auto_repairable: 是否支持自动修复(默认 False
"""
check_id: str
name: str
severity: DiagnosticSeverity
description: str
auto_repairable: bool = False
def __post_init__(self) -> None:
"""校验 check_id 与 name 非空。
``check_id`` 与 ``name`` 必须非空,在构造时即抛出 ``ValidationError``
避免空检查 ID 或空名称导致诊断项无法定位与展示INV-8
"""
if not self.check_id:
raise ValidationError("check_id", "must not be empty")
if not self.name:
raise ValidationError("name", "must not be empty")
@dataclass(frozen=True)
class DiagnosticResult:
"""诊断结果。
描述一项诊断检查的执行结果,携带是否通过、消息与可选的修复计划。
字段:
check_id: 检查 ID。
passed: 是否通过。
severity: 严重级别。
message: 结果消息。
auto_repairable: 是否支持自动修复(默认 False
repair_plan: 修复计划(未失败或不可修复时为 None
"""
check_id: str
passed: bool
severity: DiagnosticSeverity
message: str
auto_repairable: bool = False
repair_plan: str | None = None
def __post_init__(self) -> None:
"""校验 check_id 非空。
``check_id`` 必须非空,在构造时即抛出 ``ValidationError``,避免空
检查 ID 导致诊断结果无法关联到对应检查项INV-8
"""
if not self.check_id:
raise ValidationError("check_id", "must not be empty")
@dataclass(frozen=True)
class RepairResult:
"""修复结果。
描述一项自动修复操作的执行结果。
字段:
check_id: 检查 ID。
passed: 是否修复成功。
message: 修复结果消息。
"""
check_id: str
passed: bool
message: str
def __post_init__(self) -> None:
"""校验 check_id 非空。
``check_id`` 必须非空,在构造时即抛出 ``ValidationError``,避免空
检查 ID 导致修复结果无法关联到对应检查项INV-8
"""
if not self.check_id:
raise ValidationError("check_id", "must not be empty")
@dataclass(frozen=True)
class ConnectivityResult:
"""连通性结果。
描述渠道账户的连通性检测结果,包括是否可达、延迟与错误信息。
字段:
reachable: 是否可达。
latency_ms: 延迟(毫秒,不可达时为 None
error: 错误信息(可达时为 None
"""
reachable: bool
latency_ms: int | None = None
error: str | None = None
@dataclass(frozen=True)
class PermissionResult:
"""权限结果。
描述渠道账户权限校验的结果,包括是否授权、缺失权限列表与错误信息。
集合字段使用 tuple 以保证不可变。
字段:
granted: 是否授权。
missing_permissions: 缺失权限列表(默认空 tuple
error: 错误信息(无错误时为 None
"""
granted: bool
missing_permissions: tuple[str, ...] = ()
error: str | None = None