begun to implement a first route
This commit is contained in:
parent
c2e635f9c7
commit
0d99c753ed
4 changed files with 77 additions and 13 deletions
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
}
|
||||
|
|
|
@ -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.;
|
||||
}
|
||||
|
|
|
@ -1,5 +1,3 @@
|
|||
use std::{borrow::Borrow, ops::Deref};
|
||||
|
||||
use super::config::Configuration;
|
||||
use chrono::prelude::*;
|
||||
use colored::Colorize;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue