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;
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<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 {
@ -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<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)]
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<Id>,
pub name: String,
pub id: Id,
pub messages: Vec<Id>,
}
#[derive(Serialize, Deserialize)]
pub struct Message {
content: String,
id: Id,
pub content: String,
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>) {
//
// TODO: security check
//state.db_manager.;
}

View file

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