ForcePilot/backend/package/yuxi/channels/contract/dtos/credential_result.py

50 lines
2.0 KiB
Python
Raw Normal View History

"""凭据落库结果 DTO。
供扫码登录 finalize 阶段返回统一携带最终落库的渠道账户onboarding
状态与失败原因供应用层驱动后续 onboarding 流转与控制面响应
渠道账号运营流程优化 Task 1 契约层扩展
"""
from __future__ import annotations
from dataclasses import dataclass
from yuxi.channels.contract.dtos.channel import ChannelAccount, OnboardingStatus
from yuxi.channels.contract.errors import ValidationError
@dataclass(frozen=True)
class FinalizeResult:
"""扫码登录 finalize 结果。
描述扫码登录凭据落库finalize阶段的返回结果携带最终落库的
渠道账户与 onboarding 状态供应用层决定下一步 onboarding 流转
如触发配置校验连接测试或直接置为 ACTIVE
字段
account: 已落库的渠道账户``ChannelAccount``成功时携带
加密后的配置失败时仍可能携带已创建的占位账户以便上游
重试或清理
onboarding_status: 账户 onboarding 状态``OnboardingStatus``
成功落库通常为 ``CONFIGURED`` ``VERIFIED``接入失败为
``FAILED````StrEnum`` 兼容 JSON 序列化可直接用于控制面
响应与持久化层字符串字段
failure_reason: 失败原因失败时填充成功时为 ``None``
关联约束INV-8必填字段在 ``__post_init__`` 中校验端口 @pre
"""
account: ChannelAccount
onboarding_status: OnboardingStatus
failure_reason: str | None = None
def __post_init__(self) -> None:
"""校验 ``account`` 不可为 ``None``INV-8 / 端口 @pre
``account`` finalize 流程的核心载体``None`` 表示上游未
正确构造账户对象在契约层即拦截避免空值流入应用层
onboarding 管道后才暴露
"""
if self.account is None:
raise ValidationError("account", "must not be None")