From 0d99c753ed58eab25791a8453f19a639cb541a94 Mon Sep 17 00:00:00 2001 From: Jolimaitre Matthieu Date: Sat, 13 Nov 2021 02:24:17 +0100 Subject: [PATCH] begun to implement a first route --- src/lib/db/mod.rs | 55 +++++++++++++++++++++++++++++++++++++++++- src/lib/db/models.rs | 29 +++++++++++++++------- src/lib/http/routes.rs | 4 ++- src/lib/log.rs | 2 -- 4 files changed, 77 insertions(+), 13 deletions(-) diff --git a/src/lib/db/mod.rs b/src/lib/db/mod.rs index 9e3a6a5..168ca61 100644 --- a/src/lib/db/mod.rs +++ b/src/lib/db/mod.rs @@ -1,7 +1,12 @@ pub mod models; +use std::time::{SystemTime, UNIX_EPOCH}; + +use serde::{de::DeserializeOwned, Serialize}; use sled::Db; +use self::models::*; + use super::{ config::Configuration, harsh::Error, @@ -32,11 +37,37 @@ impl DbManager { Ok(result) } - pub fn open_db(&mut self) -> Result<(), Error> { + fn open_db(&mut self) -> Result<(), Error> { let handle = sled::open(&self.path)?; self.handle = Some(handle); Ok(()) } + + pub fn create_user(&self, username: String, password: String) -> Result { + let id = new_id(Prefixes::User); + + let user = User { + username, + password, + id, + }; + + let path = format!("/user/{}", id); + let serialized = serialize(&user)?; + self.handle().insert(path, serialized)?; + + Ok(user) + } + + // pub fn verify_user(&self, username: String, password: String) -> Result {} + + fn handle(&self) -> &Db { + let db = match &self.handle { + None => unreachable!(), + Some(h) => h, + }; + db + } } impl Loggable for DbManager { @@ -48,3 +79,25 @@ impl Loggable for DbManager { self.logger.clone() } } + +fn new_id(prefix: Prefixes) -> Id { + let prefix = prefix as u8; + let timestamp = SystemTime::now(); + let duration = timestamp.duration_since(UNIX_EPOCH).unwrap(); + let result = duration.as_millis() as Id; + let result = (result << 256) + (prefix as Id); + result +} + +fn serialize(item: &T) -> Result, Error> { + let serialized = serde_json::to_string(item)?; + let array = serialized.as_bytes(); + let result = Vec::from(array); + Ok(result) +} + +fn deserialize(serialized: &[u8]) -> Result { + let data = String::from_utf8(serialized.to_vec())?.clone(); + let result = serde_json::from_str::(&data)?; + Ok(result) +} diff --git a/src/lib/db/models.rs b/src/lib/db/models.rs index ab4d2a5..63d16ed 100644 --- a/src/lib/db/models.rs +++ b/src/lib/db/models.rs @@ -1,20 +1,31 @@ #![allow(unused, dead_code)] -type Id = u64; +use serde::{Deserialize, Serialize}; +pub type Id = u64; + +pub enum Prefixes { + Message = 0, + User = 10, + Channel = 20, +} + +#[derive(Serialize, Deserialize)] pub struct User { - username: String, - password: String, - id: Id, + pub username: String, + pub password: String, + pub id: Id, } +#[derive(Serialize, Deserialize)] pub struct Channel { - name: String, - id: Id, - messages: Vec, + pub name: String, + pub id: Id, + pub messages: Vec, } +#[derive(Serialize, Deserialize)] pub struct Message { - content: String, - id: Id, + pub content: String, + pub id: Id, } diff --git a/src/lib/http/routes.rs b/src/lib/http/routes.rs index fe7886a..a43cb62 100644 --- a/src/lib/http/routes.rs +++ b/src/lib/http/routes.rs @@ -11,5 +11,7 @@ pub fn setup_routes(app: Router) -> Router { } async fn create_user(Extension(state): Extension, Json(payload): Json) { - // + // TODO: security check + + //state.db_manager.; } diff --git a/src/lib/log.rs b/src/lib/log.rs index 31891df..2d0e0cc 100644 --- a/src/lib/log.rs +++ b/src/lib/log.rs @@ -1,5 +1,3 @@ -use std::{borrow::Borrow, ops::Deref}; - use super::config::Configuration; use chrono::prelude::*; use colored::Colorize;