diff --git a/Cargo.lock b/Cargo.lock index 808c31c..8b5b30c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1209,6 +1209,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d5f38ee71cbab2c827ec0ac24e76f82eca723cee92c509a65f67dee393c25112" dependencies = [ "bitflags", + "chrono", "fallible-iterator", "fallible-streaming-iterator", "hashlink", diff --git a/Cargo.toml b/Cargo.toml index aca9d41..ac53802 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,7 +8,7 @@ edition = "2018" [dependencies] ntru = "0.5.6" -rusqlite = "0.24.2" +rusqlite = {version = "0.24.2", features = ["chrono"]} toml = "0.5.6" tungstenite = "0.12.0" tokio = { version = "0.3.3", features = ["full"] } diff --git a/public/Group 1.svg b/public/Group 1.svg new file mode 100644 index 0000000..f08eb61 --- /dev/null +++ b/public/Group 1.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/db/messages.rs b/src/db/messages.rs index be050af..505edd5 100644 --- a/src/db/messages.rs +++ b/src/db/messages.rs @@ -1,4 +1,5 @@ use super::types::Message; + use rusqlite::{params, Connection, Result}; pub fn select_message_by_id(id: u64, conn: &Connection) -> Result { @@ -9,10 +10,40 @@ pub fn select_all_user_message(id: u64, conn: &Connection) -> Result Result> { - unimplemented!(); +pub fn select_n_last_messages(user_id: u32, start: u32, count: u32, conn: &Connection) -> Result> { + let mut selected = conn.prepare("SELECT * FROM messages WHERE user_id = ?1 AND id > ?2 LIMIT ?3")?; + let message_iter = selected.query_map(params![user_id, start, count], |row| { + Ok(Message { + id: row.get(0)?, + date: row.get(1)?, + user_id: row.get(2)?, + message: row.get(3)?, + }) + })?; + let mut users: Vec = Vec::new(); + for message in message_iter { + log::info!("User: {:?}", (&message)); + users.push(message?); + } + log::info!("All users loaded to memory"); + Ok(users) } -pub fn add_message(message: Message, conn: &Connection) -> Result<()>{ - unimplemented!(); +pub fn add_message(message: Message, conn: &Connection) -> Result<()> { + match conn.execute( + "INSERT INTO messages ( + id, + user_id, + date, + message + ) VALUES (?1, ?2, ?3, ?4)", + params![message.id,message.user_id, message.date, message.message], + ) { + Ok(_) => log::info!("message {:} added succsessfully!", message.id), + Err(e) => { + log::error!("failed to insert message {:?}", e); + return Err(e); + } + } + Ok(()) } diff --git a/src/db/mod.rs b/src/db/mod.rs index eac9bf4..8427a49 100644 --- a/src/db/mod.rs +++ b/src/db/mod.rs @@ -23,6 +23,7 @@ fn create_db(conn: &Connection) -> Result<()> { "CREATE TABLE messages ( id INTEGER PRIMARY KEY, user_id TEXT NOT NULL, + date datetime NOT NULL, message TEXT NOT NULL )", params![], diff --git a/src/db/types.rs b/src/db/types.rs index 3d09b4e..acc0ac3 100644 --- a/src/db/types.rs +++ b/src/db/types.rs @@ -4,8 +4,8 @@ use fcpv2::types::{traits::FcpRequest, SSK}; pub const DB_PATH: &str = "hole.db"; -pub type SignKey = SSK; -pub type InsertKey = String; +pub type SignKey = String; +pub type InsertKey = SSK; #[derive(Debug)] pub struct User { @@ -19,7 +19,7 @@ pub struct User { #[derive(Debug)] pub struct Message { pub id: u32, - pub date: DateTime, + pub date: NaiveDateTime, pub user_id: u32, pub message: String, } diff --git a/src/db/users.rs b/src/db/users.rs index 5426a84..56071b0 100644 --- a/src/db/users.rs +++ b/src/db/users.rs @@ -4,16 +4,23 @@ use fcpv2::types::{SSK, traits::FcpParser}; use rusqlite::{params, Connection, Result, NO_PARAMS}; pub fn get_user_by_id(id: u32, conn: &Connection) -> Result { - unimplemented!(); -} - -pub fn get_user_by_name(String: u32, conn: &Connection) -> Result { - unimplemented!(); + let mut selected = conn.prepare("SELECT * FROM users WHERE id = ?")?; + let mut user_iter = selected.query_map(params![id], |row| { + Ok(User { + id: row.get(0)?, + name: row.get(1)?, + sign_key: row.get(2)?, + insert_key: row.get(3)?, + messages_count: row.get(4)?, + }) + })?; + let user = user_iter.next().unwrap(); + log::info!("User {:} founded", id); + user } pub fn load_all_users(conn: &Connection) -> Result> { let mut selected = conn.prepare("SELECT * FROM users")?; - log::info!("add user to USERS successfully!"); let user_iter = selected.query_map(params![], |row| { Ok(User { id: row.get(0)?, @@ -28,6 +35,7 @@ pub fn load_all_users(conn: &Connection) -> Result> { log::info!("User: {:?}", (&user)); users.push(user?); } + log::info!("All users loaded to memory"); Ok(users) } diff --git a/src/main.rs b/src/main.rs index d388ded..765ab8a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,12 +1,15 @@ mod chat; mod db; mod encrypting; -mod fcpv2; use async_std::io; use chat::front_conn::listen_client; use chat::serv_conn::listen_server; use chat::types::PackedMessage; +use chrono::Utc; +use db::users; +use fcpv2::types::{traits::FcpParser, SSK}; use log; +use simple_logger::SimpleLogger; use std::{ sync::{ mpsc, @@ -14,7 +17,6 @@ use std::{ }, thread, }; -use simple_logger::SimpleLogger; /* +-----------------------------------------------------------------------------------+ | Client | @@ -45,7 +47,46 @@ use simple_logger::SimpleLogger; fn main() -> io::Result<()> { SimpleLogger::new().init().unwrap(); - db::start_db().unwrap(); + let conn = db::start_db().unwrap(); + users::add_user(db::types::User{ + id: 9349, + name: "Nick".to_string(), + sign_key: "string".to_string(), + insert_key: fcpv2::types::SSK::parse("SSK@Rgt0qM8D24DltliV2-JE9tYLcrgGAKeDwkz41I3JBPs,p~c8c7FXcJjhcf2vA-Xm0Mjyw1o~xn7L2-T8zlBA1IU").unwrap(), + messages_count: 1, + }, &conn); + let time: chrono::DateTime = + chrono::DateTime::parse_from_rfc3339("2021-03-18T04:22:42.501Z").unwrap(); + db::messages::add_message( + db::types::Message { + user_id: 9349, + id: 1, + date: time.naive_utc(), + message: "hey duude".to_string(), + }, + &conn, + ) + .unwrap(); + db::messages::add_message( + db::types::Message { + user_id: 9349, + id: 2, + date: time.naive_utc(), + message: "what do you think".to_string(), + }, + &conn, + ) + .unwrap(); + db::messages::add_message( + db::types::Message { + user_id: 9349, + id: 3, + date: time.naive_utc(), + message: "about that".to_string(), + }, + &conn, + ) + .unwrap(); let (to_server_sender, server_receiver): (Sender, Receiver) = mpsc::channel();