use chrono::{DateTime, Utc};
use keepsake::{AuditEvent, ExpiryPolicy, Keepsake};
use serde::{Deserialize, Serialize};
use uuid::Uuid;
#[cfg(feature = "postgres")]
use sqlx::{Row, postgres::PgRow};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct MembershipCursor {
pub subject_kind: String,
pub subject_id: String,
pub keepsake_id: Uuid,
}
impl MembershipCursor {
#[must_use]
pub fn after(keepsake: &Keepsake) -> Self {
Self {
subject_kind: keepsake.subject().kind().to_owned(),
subject_id: keepsake.subject().id().to_owned(),
keepsake_id: keepsake.id(),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct AuditEventRecord {
pub id: i64,
pub event: AuditEvent,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct AuditCursor {
pub occurred_at: DateTime<Utc>,
pub id: i64,
}
impl AuditCursor {
#[must_use]
pub const fn after(record: &AuditEventRecord) -> Self {
Self {
occurred_at: record.event.at,
id: record.id,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct AuditOutboxCursor {
pub id: i64,
}
impl AuditOutboxCursor {
#[must_use]
pub const fn after(record: &AuditOutboxRecord) -> Self {
Self { id: record.id }
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct AuditOutboxRecord {
pub id: i64,
pub audit_event_id: i64,
pub event_type: String,
pub payload: AuditEvent,
pub claimed_by: Option<String>,
pub claimed_until: Option<DateTime<Utc>>,
pub delivered_at: Option<DateTime<Utc>>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct AppliedKeepsake {
pub keepsake: Keepsake,
pub duplicate_prevented: bool,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "postgres", derive(sqlx::FromRow))]
pub struct TimedExpiryCandidate {
pub keepsake_id: Uuid,
pub relation_id: Uuid,
pub subject_kind: String,
pub subject_id: String,
pub due_at: DateTime<Utc>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct FulfilledExpiryCandidate {
pub keepsake_id: Uuid,
pub relation_id: Uuid,
pub subject_kind: String,
pub subject_id: String,
pub expiry_policy: ExpiryPolicy,
}
#[cfg(feature = "postgres")]
impl<'row> sqlx::FromRow<'row, PgRow> for FulfilledExpiryCandidate {
fn from_row(row: &'row PgRow) -> Result<Self, sqlx::Error> {
let expiry_policy = serde_json::from_value(row.try_get("expiry_policy")?)
.map_err(|error| sqlx::Error::Decode(Box::new(error)))?;
Ok(Self {
keepsake_id: row.try_get("keepsake_id")?,
relation_id: row.try_get("relation_id")?,
subject_kind: row.try_get("subject_kind")?,
subject_id: row.try_get("subject_id")?,
expiry_policy,
})
}
}