"""凭据落库结果 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")