use iso8601_timestamp::Timestamp;
use crate::{events::client::EventV1, Database};
use revolt_result::Result;
auto_derived_partial!(
pub struct Session {
#[serde(rename = "_id")]
pub id: String,
pub user_id: String,
pub token: String,
pub name: String,
pub last_seen: Timestamp,
#[serde(skip_serializing_if = "Option::is_none")]
pub origin: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub subscription: Option<WebPushSubscription>,
},
"PartialSession"
);
auto_derived!(
pub struct WebPushSubscription {
pub endpoint: String,
pub p256dh: String,
pub auth: String,
}
);
impl Session {
pub async fn save(&self, db: &Database) -> Result<()> {
db.save_session(self).await
}
pub async fn delete(self, db: &Database) -> Result<()> {
db.delete_session(&self.id).await?;
EventV1::DeleteSession {
user_id: self.user_id.clone(),
session_id: self.id,
}
.private(self.user_id)
.await;
Ok(())
}
}