use crate::database::universal_types::UniversalTimestamp;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum DeliveryState {
Pending,
Delivered,
Acked,
}
impl DeliveryState {
pub fn as_str(&self) -> &'static str {
match self {
DeliveryState::Pending => "pending",
DeliveryState::Delivered => "delivered",
DeliveryState::Acked => "acked",
}
}
pub fn from_db(s: &str) -> Option<DeliveryState> {
match s {
"pending" => Some(DeliveryState::Pending),
"delivered" => Some(DeliveryState::Delivered),
"acked" => Some(DeliveryState::Acked),
_ => None,
}
}
pub fn can_transition_to(self, next: DeliveryState) -> bool {
use DeliveryState::*;
matches!(
(self, next),
(Pending, Delivered) | (Delivered, Acked) | (Delivered, Pending)
)
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DeliveryOutbox {
pub id: i64,
pub recipient: String,
pub kind: String,
pub tenant_id: Option<String>,
pub payload: Vec<u8>,
pub delivery_state: String,
pub delivery_attempts: i32,
pub created_at: UniversalTimestamp,
pub delivered_at: Option<UniversalTimestamp>,
pub acked_at: Option<UniversalTimestamp>,
}
impl DeliveryOutbox {
pub fn state(&self) -> Option<DeliveryState> {
DeliveryState::from_db(&self.delivery_state)
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NewDeliveryOutbox {
pub recipient: String,
pub kind: String,
pub tenant_id: Option<String>,
pub payload: Vec<u8>,
}