use actionqueue_core::budget::BudgetDimension;
use actionqueue_core::ids::{ActorId, LedgerEntryId, RunId, TaskId, TenantId};
use actionqueue_core::platform::{Capability, Role};
use actionqueue_core::run::run_instance::RunInstance as CoreRunInstance;
use actionqueue_core::subscription::{EventFilter, SubscriptionId};
use actionqueue_core::task::task_spec::TaskSpec;
use crate::recovery::reducer::{AttemptHistoryEntry, LeaseMetadata, RunStateHistoryEntry};
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Snapshot {
pub version: u32,
pub timestamp: u64,
pub metadata: SnapshotMetadata,
pub tasks: Vec<SnapshotTask>,
pub runs: Vec<SnapshotRun>,
#[cfg_attr(feature = "serde", serde(default))]
pub engine: SnapshotEngineControl,
#[cfg_attr(feature = "serde", serde(default))]
pub dependency_declarations: Vec<SnapshotDependencyDeclaration>,
#[cfg_attr(feature = "serde", serde(default))]
pub budgets: Vec<SnapshotBudget>,
#[cfg_attr(feature = "serde", serde(default))]
pub subscriptions: Vec<SnapshotSubscription>,
#[cfg_attr(feature = "serde", serde(default))]
pub actors: Vec<SnapshotActor>,
#[cfg_attr(feature = "serde", serde(default))]
pub tenants: Vec<SnapshotTenant>,
#[cfg_attr(feature = "serde", serde(default))]
pub role_assignments: Vec<SnapshotRoleAssignment>,
#[cfg_attr(feature = "serde", serde(default))]
pub capability_grants: Vec<SnapshotCapabilityGrant>,
#[cfg_attr(feature = "serde", serde(default))]
pub ledger_entries: Vec<SnapshotLedgerEntry>,
}
#[derive(Debug, Clone, PartialEq, Eq, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct SnapshotEngineControl {
pub paused: bool,
pub paused_at: Option<u64>,
pub resumed_at: Option<u64>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct SnapshotDependencyDeclaration {
pub task_id: TaskId,
pub depends_on: Vec<TaskId>,
pub declared_at: u64,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct SnapshotMetadata {
pub schema_version: u32,
pub wal_sequence: u64,
pub task_count: u64,
pub run_count: u64,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct SnapshotTask {
pub task_spec: TaskSpec,
pub created_at: u64,
pub updated_at: Option<u64>,
#[cfg_attr(feature = "serde", serde(default))]
pub canceled_at: Option<u64>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct SnapshotRun {
pub run_instance: CoreRunInstance,
pub state_history: Vec<SnapshotRunStateHistoryEntry>,
pub attempts: Vec<SnapshotAttemptHistoryEntry>,
pub lease: Option<SnapshotLeaseMetadata>,
}
impl SnapshotRun {
pub fn run_id(&self) -> RunId {
self.run_instance.id()
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct SnapshotRunStateHistoryEntry {
pub from: Option<actionqueue_core::run::state::RunState>,
pub to: actionqueue_core::run::state::RunState,
pub timestamp: u64,
}
impl From<RunStateHistoryEntry> for SnapshotRunStateHistoryEntry {
fn from(entry: RunStateHistoryEntry) -> Self {
Self { from: entry.from, to: entry.to, timestamp: entry.timestamp }
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct SnapshotAttemptHistoryEntry {
pub attempt_id: actionqueue_core::ids::AttemptId,
pub started_at: u64,
pub finished_at: Option<u64>,
pub result: Option<actionqueue_core::mutation::AttemptResultKind>,
pub error: Option<String>,
#[cfg_attr(feature = "serde", serde(default))]
pub output: Option<Vec<u8>>,
}
impl From<AttemptHistoryEntry> for SnapshotAttemptHistoryEntry {
fn from(entry: AttemptHistoryEntry) -> Self {
Self {
attempt_id: entry.attempt_id,
started_at: entry.started_at,
finished_at: entry.finished_at,
result: entry.result,
error: entry.error,
output: entry.output,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct SnapshotLeaseMetadata {
pub owner: String,
pub expiry: u64,
pub acquired_at: u64,
pub updated_at: u64,
}
impl From<LeaseMetadata> for SnapshotLeaseMetadata {
fn from(metadata: LeaseMetadata) -> Self {
Self {
owner: metadata.owner,
expiry: metadata.expiry,
acquired_at: metadata.acquired_at,
updated_at: metadata.updated_at,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct SnapshotBudget {
pub task_id: actionqueue_core::ids::TaskId,
pub dimension: BudgetDimension,
pub limit: u64,
pub consumed: u64,
pub allocated_at: u64,
pub exhausted: bool,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct SnapshotSubscription {
pub subscription_id: SubscriptionId,
pub task_id: actionqueue_core::ids::TaskId,
pub filter: EventFilter,
pub created_at: u64,
pub triggered_at: Option<u64>,
pub canceled_at: Option<u64>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct SnapshotActor {
pub actor_id: ActorId,
pub identity: String,
pub capabilities: Vec<String>,
pub department: Option<String>,
pub heartbeat_interval_secs: u64,
pub tenant_id: Option<TenantId>,
pub registered_at: u64,
pub last_heartbeat_at: Option<u64>,
pub deregistered_at: Option<u64>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct SnapshotTenant {
pub tenant_id: TenantId,
pub name: String,
pub created_at: u64,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct SnapshotRoleAssignment {
pub actor_id: ActorId,
pub role: Role,
pub tenant_id: TenantId,
pub assigned_at: u64,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct SnapshotCapabilityGrant {
pub actor_id: ActorId,
pub capability: Capability,
pub tenant_id: TenantId,
pub granted_at: u64,
pub revoked_at: Option<u64>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct SnapshotLedgerEntry {
pub entry_id: LedgerEntryId,
pub tenant_id: TenantId,
pub ledger_key: String,
pub actor_id: Option<ActorId>,
pub payload: Vec<u8>,
pub timestamp: u64,
}