332 lines
5.6 KiB
Python
332 lines
5.6 KiB
Python
|
|
"""领域事件 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
|