"""领域事件 dataclass 定义。 规范 §6.1/§7.1:用例在事务内调用 event_publisher.publish,发布聚合产生的领域事件。 所有事件为不可变 dataclass(frozen=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