use async_trait::async_trait;
use serde::{Deserialize, Serialize};
use std::time::SystemTime;
use thiserror::Error;
use uvb_core::{Context, Subject};
#[derive(Debug, Error)]
pub enum TransactionError {
#[error("transaction not found")]
NotFound,
#[error("transaction expired")]
Expired,
#[error("storage error: {0}")]
Storage(String),
#[error("serialization error: {0}")]
Serialization(String),
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct TransactionRecord {
pub id: String,
pub subject: Subject,
pub context: Context,
pub status: TransactionStatus,
pub policy_id: String,
pub completed_factors: Vec<String>,
pub pending_challenges: serde_json::Value,
pub metadata: serde_json::Value,
pub created_at: SystemTime,
pub expires_at: SystemTime,
pub updated_at: SystemTime,
}
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
pub enum TransactionStatus {
InProgress,
Succeeded,
Failed,
Expired,
}
#[async_trait]
pub trait TransactionStore: Send + Sync {
async fn create(&self, record: TransactionRecord) -> Result<(), TransactionError>;
async fn get(&self, id: &str) -> Result<Option<TransactionRecord>, TransactionError>;
async fn update(&self, record: TransactionRecord) -> Result<(), TransactionError>;
async fn delete(&self, id: &str) -> Result<(), TransactionError>;
async fn list_by_user(
&self,
user_id: &str,
limit: usize,
) -> Result<Vec<TransactionRecord>, TransactionError>;
async fn cleanup_expired(&self) -> Result<usize, TransactionError>;
}