Skip to main content

keepsake_sqlx/repository/
types.rs

1use chrono::{DateTime, Utc};
2use keepsake::Keepsake;
3use serde::{Deserialize, Serialize};
4use sqlx::FromRow;
5use uuid::Uuid;
6
7/// Keyset cursor for active relation membership scans.
8#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
9pub struct MembershipCursor {
10    /// Last seen subject kind.
11    pub subject_kind: String,
12    /// Last seen subject id.
13    pub subject_id: String,
14    /// Last seen keepsake id.
15    pub keepsake_id: Uuid,
16}
17
18impl MembershipCursor {
19    /// Creates a cursor positioned after a returned keepsake.
20    #[must_use]
21    pub fn after(keepsake: &Keepsake) -> Self {
22        Self {
23            subject_kind: keepsake.subject().kind.clone(),
24            subject_id: keepsake.subject().id.clone(),
25            keepsake_id: keepsake.id(),
26        }
27    }
28}
29
30/// Result of an apply operation.
31#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
32pub struct AppliedKeepsake {
33    /// Created keepsake, or the existing active keepsake for duplicate applies.
34    pub keepsake: Keepsake,
35    /// Whether a duplicate active keepsake was prevented.
36    pub duplicate_prevented: bool,
37}
38
39/// Due timed expiry candidate.
40#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, FromRow)]
41pub struct TimedExpiryCandidate {
42    /// Keepsake id.
43    pub keepsake_id: Uuid,
44    /// Relation id.
45    pub relation_id: Uuid,
46    /// Subject kind.
47    pub subject_kind: String,
48    /// Subject id.
49    pub subject_id: String,
50    /// Due timestamp.
51    pub due_at: DateTime<Utc>,
52}