use rusqlite::OptionalExtension; use tracing::instrument; use crate::types::session::Session; use super::Database; impl Database { pub fn init_sessions(&self) -> Result<(), rusqlite::Error> { let sql = " CREATE TABLE IF NOT EXISTS sessions ( user_id INTEGER PRIMARY KEY NOT NULL, token TEXT NOT NULL, FOREIGN KEY(user_id) REFERENCES users(user_id) ); "; self.0.execute(sql, ())?; Ok(()) } #[instrument(skip(self))] pub fn get_session(&self, token: &str) -> Result, rusqlite::Error> { tracing::trace!("Retrieving session"); let mut stmt = self.0.prepare("SELECT * FROM sessions WHERE token = ?")?; let row = stmt .query_row([token], |row| { Ok(Session { user_id: row.get(0)?, token: row.get(1)?, }) }) .optional()?; Ok(row) } #[instrument(skip(self))] pub fn get_all_sessions(&self) -> Result, rusqlite::Error> { tracing::trace!("Retrieving session"); let mut stmt = self.0.prepare("SELECT * FROM sessions")?; let row = stmt.query_map([], |row| { Ok(Session { user_id: row.get(0)?, token: row.get(1)?, }) })?; Ok(row.into_iter().flatten().collect()) } #[instrument(skip(self))] pub fn set_session(&self, user_id: u64, token: &str) -> Result<(), Box> { tracing::trace!("Setting new session"); let sql = "INSERT OR REPLACE INTO sessions (user_id, token) VALUES (?, ?);"; self.0.execute(sql, (user_id, token))?; Ok(()) } #[instrument(skip(self))] pub fn delete_session(&self, user_id: u64) -> Result<(), Box> { tracing::trace!("Deleting session"); let sql = "DELETE FROM sessions WHERE user_id = ?;"; self.0.execute(sql, [user_id])?; Ok(()) } }