1use anyhow::Result;
2use chrono::{DateTime, Utc};
3use serde::{Deserialize, Serialize};
4
5use crate::keychain::Keychain;
6
7#[derive(Debug, Clone, Serialize, Deserialize)]
8pub struct Session {
9 pub access_jwt: String,
10 pub refresh_jwt: String,
11 pub did: String,
12 pub handle: String,
13 #[serde(default)]
14 pub created_at: DateTime<Utc>,
15}
16
17impl Default for Session {
18 fn default() -> Self {
19 Self {
20 access_jwt: String::new(),
21 refresh_jwt: String::new(),
22 did: String::new(),
23 handle: String::new(),
24 created_at: Utc::now(),
25 }
26 }
27}
28
29pub struct SessionManager {
30 service: String,
31 account: String,
32}
33
34impl Default for SessionManager {
35 fn default() -> Self {
36 Self { service: "tangled-cli".into(), account: "default".into() }
37 }
38}
39
40impl SessionManager {
41 pub fn new(service: &str, account: &str) -> Self { Self { service: service.into(), account: account.into() } }
42
43 pub fn save(&self, session: &Session) -> Result<()> {
44 let keychain = Keychain::new(&self.service, &self.account);
45 let json = serde_json::to_string(session)?;
46 keychain.set_password(&json)
47 }
48
49 pub fn load(&self) -> Result<Option<Session>> {
50 let keychain = Keychain::new(&self.service, &self.account);
51 match keychain.get_password() {
52 Ok(json) => Ok(Some(serde_json::from_str(&json)?)),
53 Err(_) => Ok(None),
54 }
55 }
56
57 pub fn clear(&self) -> Result<()> {
58 let keychain = Keychain::new(&self.service, &self.account);
59 keychain.delete_password()
60 }
61}
62