use rusqlite::OptionalExtension; use tracing::instrument; use crate::{database, types::session::Session}; pub fn init() -> Result<(), rusqlite::Error> { tracing::trace!("Retrieving posts page"); 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) ); "; let conn = database::connect()?; conn.execute(sql, ())?; Ok(()) } #[instrument()] pub fn get_session(token: &str) -> Result, rusqlite::Error> { tracing::trace!("Retrieving session"); let conn = database::connect()?; let mut stmt = conn.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()] pub fn set_session(user_id: u64, token: &str) -> Result<(), Box> { tracing::trace!("Setting new session"); let conn = database::connect()?; let sql = "INSERT OR REPLACE INTO sessions (user_id, token) VALUES (?, ?);"; conn.execute(sql, (user_id, token))?; Ok(()) } #[instrument()] pub fn delete_session(user_id: u64) -> Result<(), Box> { tracing::trace!("Deleting session"); let conn = database::connect()?; let sql = "DELETE FROM sessions WHERE user_id = ?;"; conn.execute(sql, [user_id])?; Ok(()) }