Skip to main content

mxr_store/
account.rs

1use mxr_core::{Account, AccountId, BackendRef};
2
3impl super::Store {
4    pub async fn insert_account(&self, account: &Account) -> Result<(), sqlx::Error> {
5        let id = account.id.as_str();
6        let sync_provider = account
7            .sync_backend
8            .as_ref()
9            .map(|b| serde_json::to_string(&b.provider_kind).unwrap());
10        let send_provider = account
11            .send_backend
12            .as_ref()
13            .map(|b| serde_json::to_string(&b.provider_kind).unwrap());
14        let sync_config = account
15            .sync_backend
16            .as_ref()
17            .map(|b| serde_json::to_string(b).unwrap());
18        let send_config = account
19            .send_backend
20            .as_ref()
21            .map(|b| serde_json::to_string(b).unwrap());
22        let now = chrono::Utc::now().timestamp();
23
24        sqlx::query!(
25            "INSERT INTO accounts (id, name, email, sync_provider, send_provider, sync_config, send_config, enabled, created_at, updated_at)
26             VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
27             ON CONFLICT(id) DO UPDATE SET
28                name = excluded.name,
29                email = excluded.email,
30                sync_provider = excluded.sync_provider,
31                send_provider = excluded.send_provider,
32                sync_config = excluded.sync_config,
33                send_config = excluded.send_config,
34                enabled = excluded.enabled,
35                updated_at = excluded.updated_at",
36            id,
37            account.name,
38            account.email,
39            sync_provider,
40            send_provider,
41            sync_config,
42            send_config,
43            account.enabled,
44            now,
45            now,
46        )
47        .execute(self.writer())
48        .await?;
49
50        Ok(())
51    }
52
53    pub async fn get_account(&self, id: &AccountId) -> Result<Option<Account>, sqlx::Error> {
54        let id_str = id.as_str();
55        let row = sqlx::query!(
56            r#"SELECT id as "id!", name as "name!", email as "email!", sync_config, send_config, enabled as "enabled!: bool" FROM accounts WHERE id = ?"#,
57            id_str,
58        )
59        .fetch_optional(self.reader())
60        .await?;
61
62        Ok(row.map(|r| Account {
63            id: AccountId::from_uuid(uuid::Uuid::parse_str(&r.id).unwrap()),
64            name: r.name,
65            email: r.email,
66            sync_backend: r
67                .sync_config
68                .and_then(|c| serde_json::from_str::<BackendRef>(&c).ok()),
69            send_backend: r
70                .send_config
71                .and_then(|c| serde_json::from_str::<BackendRef>(&c).ok()),
72            enabled: r.enabled,
73        }))
74    }
75
76    pub async fn list_accounts(&self) -> Result<Vec<Account>, sqlx::Error> {
77        let rows = sqlx::query!(
78            r#"SELECT id as "id!", name as "name!", email as "email!", sync_config, send_config, enabled as "enabled!: bool" FROM accounts WHERE enabled = 1"#
79        )
80        .fetch_all(self.reader())
81        .await?;
82
83        Ok(rows
84            .into_iter()
85            .map(|r| Account {
86                id: AccountId::from_uuid(uuid::Uuid::parse_str(&r.id).unwrap()),
87                name: r.name,
88                email: r.email,
89                sync_backend: r
90                    .sync_config
91                    .and_then(|c| serde_json::from_str::<BackendRef>(&c).ok()),
92                send_backend: r
93                    .send_config
94                    .and_then(|c| serde_json::from_str::<BackendRef>(&c).ok()),
95                enabled: r.enabled,
96            })
97            .collect())
98    }
99}