Skip to main content

mxr_store/
snooze.rs

1use chrono::{DateTime, Utc};
2use mxr_core::id::*;
3use mxr_core::types::*;
4
5impl super::Store {
6    pub async fn insert_snooze(&self, snoozed: &Snoozed) -> Result<(), sqlx::Error> {
7        let mid = snoozed.message_id.as_str();
8        let aid = snoozed.account_id.as_str();
9        let original_labels = serde_json::to_string(&snoozed.original_labels).unwrap();
10        let snoozed_at = snoozed.snoozed_at.timestamp();
11        let wake_at = snoozed.wake_at.timestamp();
12
13        sqlx::query!(
14            "INSERT INTO snoozed (message_id, account_id, snoozed_at, wake_at, original_labels)
15             VALUES (?, ?, ?, ?, ?)",
16            mid,
17            aid,
18            snoozed_at,
19            wake_at,
20            original_labels,
21        )
22        .execute(self.writer())
23        .await?;
24
25        Ok(())
26    }
27
28    pub async fn get_due_snoozes(&self, now: DateTime<Utc>) -> Result<Vec<Snoozed>, sqlx::Error> {
29        let now_ts = now.timestamp();
30        let rows = sqlx::query!(
31            r#"SELECT message_id as "message_id!", account_id as "account_id!",
32                      snoozed_at as "snoozed_at!", wake_at as "wake_at!",
33                      original_labels as "original_labels!"
34               FROM snoozed WHERE wake_at <= ?"#,
35            now_ts,
36        )
37        .fetch_all(self.reader())
38        .await?;
39
40        Ok(rows
41            .into_iter()
42            .map(|r| Snoozed {
43                message_id: MessageId::from_uuid(uuid::Uuid::parse_str(&r.message_id).unwrap()),
44                account_id: AccountId::from_uuid(uuid::Uuid::parse_str(&r.account_id).unwrap()),
45                snoozed_at: DateTime::from_timestamp(r.snoozed_at, 0).unwrap_or_default(),
46                wake_at: DateTime::from_timestamp(r.wake_at, 0).unwrap_or_default(),
47                original_labels: serde_json::from_str(&r.original_labels).unwrap_or_default(),
48            })
49            .collect())
50    }
51
52    pub async fn list_snoozed(&self) -> Result<Vec<Snoozed>, sqlx::Error> {
53        let rows = sqlx::query!(
54            r#"SELECT message_id as "message_id!", account_id as "account_id!",
55                      snoozed_at as "snoozed_at!", wake_at as "wake_at!",
56                      original_labels as "original_labels!"
57               FROM snoozed ORDER BY wake_at ASC"#,
58        )
59        .fetch_all(self.reader())
60        .await?;
61
62        Ok(rows
63            .into_iter()
64            .map(|r| Snoozed {
65                message_id: MessageId::from_uuid(uuid::Uuid::parse_str(&r.message_id).unwrap()),
66                account_id: AccountId::from_uuid(uuid::Uuid::parse_str(&r.account_id).unwrap()),
67                snoozed_at: DateTime::from_timestamp(r.snoozed_at, 0).unwrap_or_default(),
68                wake_at: DateTime::from_timestamp(r.wake_at, 0).unwrap_or_default(),
69                original_labels: serde_json::from_str(&r.original_labels).unwrap_or_default(),
70            })
71            .collect())
72    }
73
74    pub async fn get_snooze(&self, message_id: &MessageId) -> Result<Option<Snoozed>, sqlx::Error> {
75        let mid = message_id.as_str();
76        let row = sqlx::query_as::<_, (String, String, i64, i64, String)>(
77            r#"SELECT message_id, account_id, snoozed_at, wake_at, original_labels
78               FROM snoozed WHERE message_id = ?"#,
79        )
80        .bind(mid)
81        .fetch_optional(self.reader())
82        .await?;
83
84        Ok(row.map(
85            |(message_id, account_id, snoozed_at, wake_at, original_labels)| Snoozed {
86                message_id: MessageId::from_uuid(uuid::Uuid::parse_str(&message_id).unwrap()),
87                account_id: AccountId::from_uuid(uuid::Uuid::parse_str(&account_id).unwrap()),
88                snoozed_at: DateTime::from_timestamp(snoozed_at, 0).unwrap_or_default(),
89                wake_at: DateTime::from_timestamp(wake_at, 0).unwrap_or_default(),
90                original_labels: serde_json::from_str(&original_labels).unwrap_or_default(),
91            },
92        ))
93    }
94
95    pub async fn remove_snooze(&self, message_id: &MessageId) -> Result<(), sqlx::Error> {
96        let mid = message_id.as_str();
97        sqlx::query!("DELETE FROM snoozed WHERE message_id = ?", mid)
98            .execute(self.writer())
99            .await?;
100        Ok(())
101    }
102}