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}