ForcePilot/backend/package/yuxi/external_systems/use_cases/events.py
Kris 74709ba2d3 feat: 完成外部系统限界上下文核心代码实现
新增六边形架构核心代码包,包含:
1. 协议适配器层:HTTP/SMTP/IMAP/SSH/GRPC等多协议适配器实现
2. 认证插件体系:基础认证、API密钥、HMAC等多类型认证插件
3. 执行编排框架:工具执行器、上下文构建、运行时治理组件
4. 用例端口与DTO:定义领域服务端口与数据传输对象
5. 厂商集成包框架:支持第三方系统集成扩展
6. 基础设施装配层:实现依赖注入与服务装配

所有代码遵循六边形架构设计原则,实现端口与适配器解耦,支持动态扩展与自动发现。
2026-06-20 22:12:42 +08:00

332 lines
5.6 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.

"""领域事件 dataclass 定义。
规范 §6.1/§7.1:用例在事务内调用 event_publisher.publish发布聚合产生的领域事件。
所有事件为不可变 dataclassfrozen=True
"""
from __future__ import annotations
from dataclasses import dataclass
from datetime import datetime
# ========== 系统子域 ==========
@dataclass(frozen=True)
class SystemCreated:
"""系统创建事件。"""
system_id: int
slug: str
@dataclass(frozen=True)
class SystemUpdated:
system_id: int
slug: str
@dataclass(frozen=True)
class SystemDeleted:
system_id: int
slug: str
@dataclass(frozen=True)
class SystemStatusChanged:
system_id: int
slug: str
enabled: bool
# ========== 工具子域 ==========
@dataclass(frozen=True)
class ToolCreated:
tool_slug: str
system_id: int | None
@dataclass(frozen=True)
class ToolUpdated:
tool_slug: str
system_id: int | None
@dataclass(frozen=True)
class ToolDeleted:
tool_slug: str
system_id: int | None
@dataclass(frozen=True)
class ToolExecuted:
execution_id: str
tool_slug: str
status: str
# ========== 环境子域 ==========
@dataclass(frozen=True)
class EnvironmentCreated:
environment_id: int
system_id: int
env_key: str
@dataclass(frozen=True)
class EnvironmentUpdated:
environment_id: int
system_id: int
env_key: str
@dataclass(frozen=True)
class EnvironmentDeleted:
environment_id: int
system_id: int
env_key: str
@dataclass(frozen=True)
class EnvironmentStatusChanged:
environment_id: int
system_id: int
env_key: str
enabled: bool
# ========== Token 子域 ==========
@dataclass(frozen=True)
class TokenInvalidated:
system_id: int
env_key: str | None
# ========== 执行子域 ==========
@dataclass(frozen=True)
class ExecutionRetried:
execution_id: str
retry_of: str
@dataclass(frozen=True)
class ExecutionCleanedUp:
affected: int
# ========== 资产子域 ==========
@dataclass(frozen=True)
class AssetCreated:
asset_id: int
asset_type: str
@dataclass(frozen=True)
class AssetUpdated:
asset_id: int
asset_type: str
@dataclass(frozen=True)
class AssetDeleted:
asset_id: int
asset_type: str
# ========== 导入子域 ==========
@dataclass(frozen=True)
class ImportConfirmed:
system_slug: str
tool_count: int
# ========== Webhook 子域 ==========
@dataclass(frozen=True)
class WebhookSubscriptionCreated:
subscription_slug: str
@dataclass(frozen=True)
class WebhookSubscriptionUpdated:
subscription_slug: str
@dataclass(frozen=True)
class WebhookSubscriptionDeleted:
subscription_slug: str
@dataclass(frozen=True)
class WebhookEventReceived:
subscription_slug: str
external_event_id: str | None
# ========== 配额子域 ==========
@dataclass(frozen=True)
class QuotaConfigured:
quota_id: int
resource: str
@dataclass(frozen=True)
class QuotaThresholdChanged:
quota_id: int
resource: str
threshold: int
@dataclass(frozen=True)
class QuotaDeleted:
quota_id: int
resource: str
# ========== 告警子域 ==========
@dataclass(frozen=True)
class AlertFired:
alert_id: int
alert_type: str
severity: str
@dataclass(frozen=True)
class AlertAcknowledged:
alert_id: int
@dataclass(frozen=True)
class AlertResolved:
alert_id: int
# ========== 通知子域 ==========
@dataclass(frozen=True)
class NotificationSent:
notification_id: int
channel: str
@dataclass(frozen=True)
class NotificationChannelCreated:
channel_id: int
channel_type: str
@dataclass(frozen=True)
class NotificationChannelUpdated:
channel_id: int
channel_type: str
@dataclass(frozen=True)
class NotificationChannelDeleted:
channel_id: int
# ========== 密钥轮换子域 ==========
@dataclass(frozen=True)
class SecretRotated:
policy_id: int
system_id: int
@dataclass(frozen=True)
class SecretRotationPolicyCreated:
policy_id: int
system_id: int
@dataclass(frozen=True)
class SecretRotationPolicyUpdated:
policy_id: int
system_id: int
@dataclass(frozen=True)
class SecretRotationPolicyDeleted:
policy_id: int
# ========== 访问规则子域 ==========
@dataclass(frozen=True)
class AccessRuleCreated:
rule_id: int
tool_slug: str
@dataclass(frozen=True)
class AccessRuleUpdated:
rule_id: int
tool_slug: str
@dataclass(frozen=True)
class AccessRuleDeleted:
rule_id: int
# ========== 测试用例子域 ==========
@dataclass(frozen=True)
class TestCaseCreated:
__test__ = False # 避免 pytest 误收集为测试类
test_case_id: int
tool_slug: str
@dataclass(frozen=True)
class TestCaseUpdated:
__test__ = False # 避免 pytest 误收集为测试类
test_case_id: int
tool_slug: str
@dataclass(frozen=True)
class TestCaseDeleted:
__test__ = False # 避免 pytest 误收集为测试类
test_case_id: int
@dataclass(frozen=True)
class RegressionCompleted:
"""测试回归批量执行完成事件。"""
due_count: int
succeeded: int
failed: int
# ========== 集成工具子域 ==========
@dataclass(frozen=True)
class IntegrationToolsPersisted:
integration_slug: str
tool_count: int
# ========== 回收站子域 ==========
@dataclass(frozen=True)
class ResourceRestored:
"""资源从回收站恢复事件。"""
resource_type: str
resource_id: int
@dataclass(frozen=True)
class ResourceHardDeleted:
"""资源从回收站物理删除事件。"""
resource_type: str
resource_id: int
@dataclass(frozen=True)
class TrashPurged:
"""回收站批量清理事件。"""
purged_count: int
by_type: dict[str, int]
cutoff_at: datetime