Files
2026-05-12 18:49:52 +08:00

202 lines
8.4 KiB
Go

package domain
import "time"
type AccountStatus string
const (
AccountStatusActive AccountStatus = "active"
AccountStatusSuspended AccountStatus = "suspended"
AccountStatusDisabled AccountStatus = "disabled"
AccountStatusPendingVerify AccountStatus = "pending_verify"
AccountStatusPendingEnable AccountStatus = "pending_enable"
)
type ProbeClassification string
const (
ProbeClassificationSuccess ProbeClassification = "success"
ProbeClassificationExplicitFailure ProbeClassification = "explicit_failure"
ProbeClassificationInconclusive ProbeClassification = "inconclusive"
)
type DiscoveryCandidateStatus string
const (
DiscoveryCandidateStatusDiscovered DiscoveryCandidateStatus = "discovered"
DiscoveryCandidateStatusTesting DiscoveryCandidateStatus = "testing"
DiscoveryCandidateStatusPendingAdmission DiscoveryCandidateStatus = "pending_admission"
DiscoveryCandidateStatusAdmitted DiscoveryCandidateStatus = "admitted"
DiscoveryCandidateStatusTestPassed DiscoveryCandidateStatus = "test_passed"
DiscoveryCandidateStatusTestFailed DiscoveryCandidateStatus = "test_failed"
DiscoveryCandidateStatusRetryPending DiscoveryCandidateStatus = "retry_pending"
DiscoveryCandidateStatusIgnored DiscoveryCandidateStatus = "ignored"
DiscoveryCandidateStatusPublished DiscoveryCandidateStatus = "published"
DiscoveryCandidateStatusDeprecated DiscoveryCandidateStatus = "deprecated"
DiscoveryCandidateStatusClosed DiscoveryCandidateStatus = "closed"
)
type GatewaySyncStatus string
const (
GatewaySyncStatusPending GatewaySyncStatus = "pending"
GatewaySyncStatusApplied GatewaySyncStatus = "applied"
GatewaySyncStatusFailed GatewaySyncStatus = "failed"
)
type GatewayAckResult string
const (
GatewayAckResultPending GatewayAckResult = "pending"
GatewayAckResultApplied GatewayAckResult = "applied"
GatewayAckResultFailed GatewayAckResult = "failed"
)
func (r GatewayAckResult) SyncStatus() GatewaySyncStatus {
switch r {
case GatewayAckResultApplied:
return GatewaySyncStatusApplied
case GatewayAckResultFailed:
return GatewaySyncStatusFailed
default:
return GatewaySyncStatusPending
}
}
type GatewayFailureCategory string
const (
GatewayFailureCategoryTemporaryNetwork GatewayFailureCategory = "temporary_network"
GatewayFailureCategoryTemporaryTimeout GatewayFailureCategory = "temporary_timeout"
GatewayFailureCategoryTemporary5xx GatewayFailureCategory = "temporary_5xx"
GatewayFailureCategoryTemporaryUnavailable GatewayFailureCategory = "temporary_unavailable"
GatewayFailureCategoryContractInvalid GatewayFailureCategory = "contract_invalid"
GatewayFailureCategoryAuthForbidden GatewayFailureCategory = "auth_forbidden"
GatewayFailureCategoryIdempotencyConflict GatewayFailureCategory = "idempotency_conflict"
GatewayFailureCategoryBusinessRejected GatewayFailureCategory = "business_rejected"
GatewayFailureCategoryUnknown GatewayFailureCategory = "unknown"
)
type ProbeResult struct {
AccountID int64
Classification ProbeClassification
ReasonCode string
ObservedAt time.Time
}
// SupplyAccount represents a platform account with credentials for API access.
type SupplyAccount struct {
AccountID int64 `json:"account_id"`
Platform string `json:"platform"`
APIKey string `json:"api_key"`
ConsumerTag string `json:"consumer_tag"` // gateway consumer that owns this account
Status string `json:"status"` // 'active' | 'suspended'
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
type AccountRoutingState struct {
AccountID int64 `json:"account_id"`
Platform string `json:"platform"`
APIKey string `json:"api_key,omitempty"`
AccountStatus AccountStatus `json:"account_status"`
RoutingEnabled bool `json:"routing_enabled"`
RiskScore int `json:"risk_score"`
ReasonCode string `json:"reason_code"`
LastProbeAt time.Time `json:"last_probe_at"`
Version int64 `json:"version"`
}
type PackageChangeEvent struct {
EventID string `json:"event_id"`
AccountID int64 `json:"account_id"`
EventType string `json:"event_type"`
PackageID int64 `json:"package_id"`
Platform string `json:"platform"`
Model string `json:"model"`
OccurredAt time.Time `json:"occurred_at"`
Version int64 `json:"version"`
GatewaySyncStatus GatewaySyncStatus `json:"gateway_sync_status"`
Consumer string `json:"consumer,omitempty"`
ConsumerDetail string `json:"consumer_detail,omitempty"`
AckedAt *time.Time `json:"acked_at,omitempty"`
RetryCount int `json:"retry_count"`
LastRetryAt *time.Time `json:"last_retry_at,omitempty"`
NextRetryAt *time.Time `json:"next_retry_at,omitempty"`
LastFailureCategory GatewayFailureCategory `json:"last_failure_category,omitempty"`
LastFailureDetail string `json:"last_failure_detail,omitempty"`
}
type PackageChangeAck struct {
EventID string `json:"event_id"`
Consumer string `json:"consumer"`
Result GatewayAckResult `json:"result"`
Detail string `json:"detail,omitempty"`
AckedAt time.Time `json:"acked_at"`
SyncState GatewaySyncStatus `json:"gateway_sync_status"`
}
type GatewayAppliedSnapshot struct {
Consumer string `json:"consumer"`
LastEventID string `json:"last_event_id"`
LastPackageID int64 `json:"last_package_id"`
LastPlatform string `json:"last_platform"`
LastModel string `json:"last_model"`
LastAppliedVersion int64 `json:"last_applied_version"`
LastResult string `json:"last_result"`
UpdatedAt time.Time `json:"updated_at"`
}
type DiscoveryCandidate struct {
CandidateID string `json:"candidate_id"`
AccountID int64 `json:"account_id"`
Platform string `json:"platform"`
Model string `json:"model"`
Source string `json:"source"`
Status DiscoveryCandidateStatus `json:"status"`
ReasonCode string `json:"reason_code,omitempty"`
DiscoveredAt time.Time `json:"discovered_at"`
UpdatedAt time.Time `json:"updated_at"`
Version int64 `json:"version"`
}
// SupplyPackage represents a supply package in the system
type SupplyPackage struct {
PackageID int64 `json:"package_id"`
Platform string `json:"platform"`
Model string `json:"model"`
Status string `json:"status"` // draft, active, deprecated
Source string `json:"source"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
Version int64 `json:"version"`
}
// ProbeExecutionLog records a probe result for historical tracking
type ProbeExecutionLog struct {
LogID int64 `json:"log_id"`
AccountID int64 `json:"account_id"`
Platform string `json:"platform"`
ProbeResult string `json:"probe_result"`
FailureClass string `json:"failure_class,omitempty"`
HTTPStatus int `json:"http_status,omitempty"`
LatencyMs int `json:"latency_ms,omitempty"`
RiskScore int `json:"risk_score"`
EvaluatedTransition string `json:"evaluated_transition"`
ExecutedAt time.Time `json:"executed_at"`
RequestID string `json:"request_id"`
Version int64 `json:"version"`
}
// AdmissionTestLog records a single admission test run for audit/history.
// TestID is auto-generated by the underlying store (DB serial or in-memory counter).
type AdmissionTestLog struct {
TestID int64 `json:"test_id,omitempty"`
CandidateID string `json:"candidate_id"`
Status string `json:"status"` // passed, failed
FailureCode string `json:"failure_code,omitempty"`
FailureSummary string `json:"failure_summary,omitempty"`
TestedAt time.Time `json:"tested_at"`
Version int64 `json:"version,omitempty"`
}