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}