begun to implement a first route

This commit is contained in:
Jolimaitre Matthieu 2021-11-13 02:24:17 +01:00
parent c2e635f9c7
commit 0d99c753ed
4 changed files with 77 additions and 13 deletions

View file

@ -1,7 +1,12 @@
pub mod models; pub mod models;
use std::time::{SystemTime, UNIX_EPOCH};
use serde::{de::DeserializeOwned, Serialize};
use sled::Db; use sled::Db;
use self::models::*;
use super::{ use super::{
config::Configuration, config::Configuration,
harsh::Error, harsh::Error,
@ -32,11 +37,37 @@ impl DbManager {
Ok(result) Ok(result)
} }
pub fn open_db(&mut self) -> Result<(), Error> { fn open_db(&mut self) -> Result<(), Error> {
let handle = sled::open(&self.path)?; let handle = sled::open(&self.path)?;
self.handle = Some(handle); self.handle = Some(handle);
Ok(()) Ok(())
} }
pub fn create_user(&self, username: String, password: String) -> Result<User, Error> {
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<User, Error> {}
fn handle(&self) -> &Db {
let db = match &self.handle {
None => unreachable!(),
Some(h) => h,
};
db
}
} }
impl Loggable for DbManager { impl Loggable for DbManager {
@ -48,3 +79,25 @@ impl Loggable for DbManager {
self.logger.clone() 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<T: Serialize + Sized>(item: &T) -> Result<Vec<u8>, Error> {
let serialized = serde_json::to_string(item)?;
let array = serialized.as_bytes();
let result = Vec::from(array);
Ok(result)
}
fn deserialize<T: DeserializeOwned + Sized>(serialized: &[u8]) -> Result<T, Error> {
let data = String::from_utf8(serialized.to_vec())?.clone();
let result = serde_json::from_str::<T>(&data)?;
Ok(result)
}

View file

@ -1,20 +1,31 @@
#![allow(unused, dead_code)] #![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 { pub struct User {
username: String, pub username: String,
password: String, pub password: String,
id: Id, pub id: Id,
} }
#[derive(Serialize, Deserialize)]
pub struct Channel { pub struct Channel {
name: String, pub name: String,
id: Id, pub id: Id,
messages: Vec<Id>, pub messages: Vec<Id>,
} }
#[derive(Serialize, Deserialize)]
pub struct Message { pub struct Message {
content: String, pub content: String,
id: Id, pub id: Id,
} }

View file

@ -11,5 +11,7 @@ pub fn setup_routes(app: Router) -> Router {
} }
async fn create_user(Extension(state): Extension<SharedState>, Json(payload): Json<CreateUser>) { async fn create_user(Extension(state): Extension<SharedState>, Json(payload): Json<CreateUser>) {
// // TODO: security check
//state.db_manager.;
} }

View file

@ -1,5 +1,3 @@
use std::{borrow::Borrow, ops::Deref};
use super::config::Configuration; use super::config::Configuration;
use chrono::prelude::*; use chrono::prelude::*;
use colored::Colorize; use colored::Colorize;