From d7a55f6579b119fcb081c5dfeb747b4237bf17c5 Mon Sep 17 00:00:00 2001 From: JMARyA Date: Tue, 24 Dec 2024 13:17:01 +0100 Subject: [PATCH] add session creation ts --- src/auth/auth.sql | 15 +++++++++++++++ src/auth/mod.rs | 3 +++ src/auth/user.rs | 11 ++++++++++- 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 src/auth/auth.sql diff --git a/src/auth/auth.sql b/src/auth/auth.sql new file mode 100644 index 0000000..fb95da5 --- /dev/null +++ b/src/auth/auth.sql @@ -0,0 +1,15 @@ +CREATE TYPE user_role AS ENUM ('regular', 'admin'); + +CREATE TABLE IF NOT EXISTS users ( + username VARCHAR(255) NOT NULL PRIMARY KEY, + "password" text NOT NULL, + user_role user_role NOT NULL DEFAULT 'regular' +); + +CREATE TABLE IF NOT EXISTS user_session ( + id UUID NOT NULL PRIMARY KEY DEFAULT gen_random_uuid(), + token text NOT NULL, + "user" varchar(255) NOT NULL, + "created" timestamptz NOT NULL DEFAULT NOW(), + FOREIGN KEY("user") REFERENCES users(username) +); \ No newline at end of file diff --git a/src/auth/mod.rs b/src/auth/mod.rs index 82585bb..74d429a 100644 --- a/src/auth/mod.rs +++ b/src/auth/mod.rs @@ -1,3 +1,4 @@ +use chrono::Utc; use data_encoding::HEXUPPER; use rand::RngCore; use serde::{Deserialize, Serialize}; @@ -25,6 +26,8 @@ pub struct Session { pub token: String, /// The username associated with the session token pub user: String, + /// Session creation time + pub created: chrono::DateTime } /// A macro to check if a user has admin privileges. diff --git a/src/auth/user.rs b/src/auth/user.rs index ad85fb0..0b960b5 100644 --- a/src/auth/user.rs +++ b/src/auth/user.rs @@ -26,6 +26,8 @@ pub struct User { pub password: String, /// The role of the user pub user_role: UserRole, + #[sqlx(default)] + pub session: String } #[derive(Debug, Clone, Serialize, Deserialize, sqlx::Type)] @@ -40,7 +42,14 @@ pub enum UserRole { impl User { // Get a user from session ID pub async fn from_session(session: &str) -> Option { - sqlx::query_as("SELECT * FROM users WHERE username = (SELECT \"user\" FROM user_session WHERE token = $1)").bind(session).fetch_optional(get_pg!()).await.unwrap() + let user: Option = sqlx::query_as("SELECT * FROM users WHERE username = (SELECT \"user\" FROM user_session WHERE token = $1)").bind(session).fetch_optional(get_pg!()).await.unwrap(); + + if let Some(mut user) = user { + user.session = session.to_string(); + return Some(user); + } + + None } /// Find a user by their username