planetwars.dev/planetwars-server/src/db/sessions.rs
2022-03-13 15:20:03 +01:00

46 lines
1.1 KiB
Rust

use super::users::User;
use crate::schema::{sessions, users};
use base64;
use diesel::PgConnection;
use diesel::{insert_into, prelude::*, Insertable, RunQueryDsl};
use rand::{self, Rng};
#[derive(Insertable)]
#[table_name = "sessions"]
struct NewSession {
token: String,
user_id: i32,
}
#[derive(Queryable, Debug, PartialEq)]
pub struct Session {
pub id: i32,
pub user_id: i32,
pub token: String,
}
pub fn create_session(user: &User, conn: &PgConnection) -> Session {
let new_session = NewSession {
token: gen_session_token(),
user_id: user.id,
};
insert_into(sessions::table)
.values(&new_session)
.get_result::<Session>(conn)
.unwrap()
}
pub fn find_user_by_session(token: &str, conn: &PgConnection) -> QueryResult<(Session, User)> {
sessions::table
.inner_join(users::table)
.filter(sessions::token.eq(&token))
.first::<(Session, User)>(conn)
}
pub fn gen_session_token() -> String {
let mut rng = rand::thread_rng();
let token: [u8; 32] = rng.gen();
base64::encode(&token)
}