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;
|
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)
|
||||||
|
}
|
||||||
|
|
|
@ -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,
|
||||||
}
|
}
|
||||||
|
|
|
@ -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.;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue