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();