use crate::schema::tokens; use crate::schema::tokens::dsl::*; use crate::{SqliteLike, lock_db_write, lock_db_read}; use chrono::NaiveDateTime; use diesel::prelude::*; use std::sync::{RwLockReadGuard, RwLockWriteGuard}; use uuid::Uuid; #[derive(Queryable, Insertable)] #[table_name = "tokens"] pub struct Token { id: String, uid: i32, timestamp: Option } impl Token { // Return user id if any pub fn find_token_by_id(db: &impl SqliteLike, tid: &str) -> Option { (lock_db_read!() as Result, String>).ok() .and_then(|_| { tokens.filter(id.eq(tid)) .load::(db) .ok() .and_then(|mut v| { if !v.is_empty() { Some(v.remove(0).uid) } else { None } }) }) } // Create a new token for a user pub fn create_token(db: &impl SqliteLike, user: i32) -> Option { let tid = Uuid::new_v4().to_hyphenated().to_string(); (lock_db_write!() as Result, String>).ok() .and_then(|_| { diesel::insert_into(tokens::table) .values(Token { id: tid.clone(), uid: user, timestamp: None // There's default value from SQLite }) .execute(db) .ok() .map(|_| tid) }) } }