summaryrefslogtreecommitdiff
path: root/src/types/session.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/types/session.rs')
-rw-r--r--src/types/session.rs38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/types/session.rs b/src/types/session.rs
new file mode 100644
index 0000000..8064fb1
--- /dev/null
+++ b/src/types/session.rs
@@ -0,0 +1,38 @@
+use rand::{distributions::Alphanumeric, Rng};
+use serde::Serialize;
+
+use crate::database;
+use crate::types::response::{Result, ResponseCode};
+
+#[derive(Serialize)]
+pub struct Session {
+ pub user_id: u64,
+ pub token: String
+}
+
+impl Session {
+
+ pub fn from_token(token: &str) -> Result<Self> {
+ let Ok(Some(session)) = database::sessions::get_session(token) else {
+ return Err(ResponseCode::BadRequest.msg("Invalid auth token"));
+ };
+
+ Ok(session)
+ }
+
+ pub fn new(user_id: u64) -> Result<Self> {
+ let token: String = rand::thread_rng().sample_iter(&Alphanumeric).take(32).map(char::from).collect();
+ match database::sessions::set_session(user_id, &token) {
+ Err(_) => return Err(ResponseCode::BadRequest.msg("Failed to create session")),
+ Ok(_) => return Ok(Session {user_id, token})
+ };
+ }
+
+ pub fn delete(user_id: u64) -> Result<()> {
+ if let Err(_) = database::sessions::delete_session(user_id) {
+ return Err(ResponseCode::InternalServerError.msg("Failed to logout"));
+ };
+ Ok(())
+ }
+
+} \ No newline at end of file