diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 9650c16..b839506 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -13,22 +13,18 @@
-
-
+
+
+
-
-
-
+
-
-
-
@@ -46,7 +42,7 @@
-
+
@@ -88,6 +84,7 @@
+
diff --git a/Cargo.lock b/Cargo.lock
index 8901fff..38ab6a9 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -647,6 +647,7 @@ dependencies = [
"tokio 0.3.6",
"toml",
"tungstenite 0.12.0",
+ "uuid",
]
[[package]]
@@ -1605,6 +1606,16 @@ version = "0.7.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "05e42f7c18b8f902290b009cde6d651262f956c98bc51bca4cd1d511c9cd85c7"
+[[package]]
+name = "uuid"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7"
+dependencies = [
+ "getrandom 0.2.1",
+ "serde",
+]
+
[[package]]
name = "value-bag"
version = "1.0.0-alpha.6"
diff --git a/Cargo.toml b/Cargo.toml
index af8435d..9cc3d61 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -23,6 +23,7 @@ serde_derive = "1.0.116"
async-trait = "0.1.42"
simple_logger = "1.11.0"
chrono = {version = "0.4.19", features = ["serde"]}
+uuid = {version = "0.8.2", features = ["serde" , "v4"]}
[dependencies.fcpv2]
path = "../FCPv2"
diff --git a/src/api/handlers.rs b/src/api/handlers.rs
index fca116e..3cc8bd6 100644
--- a/src/api/handlers.rs
+++ b/src/api/handlers.rs
@@ -1,12 +1,14 @@
-use super::request::*;
+use super::{request::*, response::{AppStatus, ResponseType}};
use super::response::User;
use super::response::UserList;
use crate::chat::types::PackedMessage;
use crate::chat::types::SP;
-use crate::db::{messages, users};
+use crate::db::{self, messages, types, users};
use async_std::io::Result;
+use fcpv2::types::{traits::FcpParser, SSK};
use rusqlite::Connection;
use serde_json::json;
+use uuid::Uuid;
pub fn start_app(request: StartAppReq, server_sender: &SP) -> Result<()> {
Ok(())
//sending *JSON*, what everything is OK
@@ -24,8 +26,9 @@ pub fn load_users(request: LoadUsersReq, conn: &Connection, server_sender: &SP)
.collect();
let users: String = serde_json::to_string(&UserList {
users: jsoned_users,
- }).unwrap();
- let _ =server_sender.send(PackedMessage::ToClient(users)).unwrap();
+ })
+ .unwrap();
+ let _ = server_sender.send(PackedMessage::ToClient(users)).unwrap();
Ok(())
}
pub fn send_message(request: SendMessageReq, conn: &Connection, server_sender: &SP) -> Result<()> {
@@ -42,6 +45,14 @@ pub fn load_messages(
//sending *JSON*
}
pub fn add_user(request: AddUserReq, conn: &Connection, server_sender: &SP) -> Result<()> {
- unimplemented!()
- //sending *JSON* what user is created
+ let user = db::types::User {
+ id: db::types::Id(Uuid::new_v4()),
+ name: request.name,
+ sign_key: request.sign_key,
+ insert_key: SSK::parse(&request.insert_key[..]).unwrap(),
+ messages_count: 0,
+ };
+ db::users::add_user(user, &conn).unwrap();
+ server_sender.send(PackedMessage::ToClient(json!(AppStatus{res_type: ResponseType::UserAdded}).to_string())).unwrap();
+ Ok(())
}
diff --git a/src/api/request.rs b/src/api/request.rs
index 93d1018..8604237 100644
--- a/src/api/request.rs
+++ b/src/api/request.rs
@@ -62,6 +62,7 @@ pub struct LoadMessagesReq {
#[derive(Deserialize, Debug)]
pub struct AddUserReq {
pub req_type: AddUser,
+ pub name: String,
pub sign_key: String,
pub insert_key: String,
}
diff --git a/src/api/response.rs b/src/api/response.rs
index a961e7e..2ee80d5 100644
--- a/src/api/response.rs
+++ b/src/api/response.rs
@@ -1,9 +1,10 @@
use crate::db::types::User as SqliteUser;
use serde_derive::{Deserialize, Serialize};
+use tungstenite::http::Response;
use crate::db::types::SignKey;
pub type InsertKey = String;
#[derive(Serialize, Deserialize)]
-enum ResponseType{
+pub enum ResponseType{
Error,
NewMessage,
UserList,
@@ -11,27 +12,30 @@ enum ResponseType{
FetchedMessages,
InstanceCreated,
InstanceAccepted,
+ UserAdded
}
#[derive(Serialize, Deserialize)]
-enum ErrorType{
- WrongKey
+pub enum ErrorType{
+ WrongKey,
+ FailedToAddUser
}
#[derive(Serialize, Deserialize)]
-struct AppError{
- res_type: ResponseType,
+pub struct AppError{
+ pub res_type: ErrorType,
}
// Status of last requested action. Like `Create Instance` or `LoadUsers`
-struct ActionStatus{
-
+#[derive(Serialize, Deserialize)]
+pub struct AppStatus{
+ pub res_type: ResponseType
}
#[derive(Debug, Deserialize, Serialize)]
pub struct User {
- pub id: u32,
+ pub id: String,
pub name: String,
pub sign_key: SignKey,
pub insert_key: InsertKey,
diff --git a/src/api/selector.rs b/src/api/selector.rs
index 9714255..a5ce8c0 100644
--- a/src/api/selector.rs
+++ b/src/api/selector.rs
@@ -1,7 +1,11 @@
-use crate::chat::types::SP;
+use crate::chat::types::{PackedMessage, SP};
use rusqlite;
-use super::{request::*, handlers};
+use super::{
+ handlers,
+ request::*,
+ response::{AppError, ErrorType, ResponseType},
+};
use async_std::io::Result;
use rusqlite::Connection;
use serde_json::from_str;
@@ -12,12 +16,11 @@ pub async fn request_selector(json: String, server_sender: &SP, conn: &Connectio
//TODO v0.3 Add Instances return Ok(());
// }
- if let Ok(res) = from_str::(&json) {
- handlers::start_app(res, server_sender)?
+ if let Ok(res) = from_str::(&json) {
+ handlers::start_app(res, server_sender)?
}
if let Ok(res) = from_str::(&json) {
handlers::stop_app(res, conn, server_sender)?
-
}
if let Ok(res) = from_str::(&json) {
handlers::load_users(res, conn, server_sender)?
@@ -29,11 +32,22 @@ pub async fn request_selector(json: String, server_sender: &SP, conn: &Connectio
handlers::load_messages(res, conn, server_sender)?
}
if let Ok(res) = from_str::(&json) {
- handlers::add_user(res, conn, server_sender)?
+ match handlers::add_user(res, conn, server_sender) {
+ Ok(_) => {},
+ Err(e) => {
+ let _ = server_sender
+ .send(PackedMessage::ToClient(
+ json!(AppError {
+ res_type: ErrorType::FailedToAddUser
+ })
+ .to_string(),
+ ))
+ .unwrap();
+ }
+ }
}
Err(async_std::io::Error::new(
async_std::io::ErrorKind::InvalidData,
"Wrong request",
))
}
-
diff --git a/src/chat/serv_conn.rs b/src/chat/serv_conn.rs
index 70c9423..3001bb8 100644
--- a/src/chat/serv_conn.rs
+++ b/src/chat/serv_conn.rs
@@ -30,6 +30,8 @@ async fn connect_to_server(client_sender: SP, server_receiver: RP) -> io::Result
}
async fn server_responce_getter(mut receiver: OwnedReadHalf, client_sender: SP) -> io::Result<()> {
loop {
+ // each freenet responce have an identifier and program will define what to do with request by this identifier
+ //TODO create handle_fcp_response function
let mut buffer = [0; 1024];
match receiver.read(&mut buffer).await {
Ok(_) => {
diff --git a/src/db/mod.rs b/src/db/mod.rs
index f4b3218..2fc4aa0 100644
--- a/src/db/mod.rs
+++ b/src/db/mod.rs
@@ -10,7 +10,7 @@ fn create_db(conn: &Connection) -> Result<()> {
"CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT UNIQUE NOT NULL,
- sign_key BLOB NOT NULL,
+ sign_key BLOB NOT NULL,
insert_key BLOB NOT NULL,
messages_count INTEGER
)",
diff --git a/src/db/types.rs b/src/db/types.rs
index 434b82d..4b5542f 100644
--- a/src/db/types.rs
+++ b/src/db/types.rs
@@ -1,6 +1,13 @@
+use std::io;
+
use chrono::prelude::*;
-use fcpv2::types::{traits::FcpRequest, SSK};
-use serde_derive::{Serialize, Deserialize};
+use fcpv2::types::{traits::{FcpRequest, FcpParser}, SSK};
+use rusqlite::{
+ types::{FromSql, FromSqlError, FromSqlResult, ToSqlOutput, ValueRef},
+ Result, ToSql,
+};
+use serde_derive::{Deserialize, Serialize};
+use uuid::Uuid;
use crate::api::response::User as JsonableUser;
@@ -8,26 +15,52 @@ pub const DB_PATH: &str = "hole.db";
pub type SignKey = String;
pub type InsertKey = SSK;
+#[derive(Debug, Deserialize, Serialize)]
+pub struct Id(pub uuid::Uuid);
#[derive(Debug, Deserialize, Serialize)]
pub struct User {
- pub id: u32,
+ pub id: Id,
pub name: String,
pub sign_key: SignKey,
pub insert_key: InsertKey,
pub messages_count: u32,
}
-impl User{
- pub fn to_jsonable(self) -> JsonableUser{
- JsonableUser{
- id: self.id,
+/// converting SSK to rusqlite type
+impl ToSql for Id {
+ fn to_sql(&self) -> Result> {
+ Ok(ToSqlOutput::from(self.0.to_string()))
+ }
+}
+
+/// converting from rusqlite type to SSK
+impl FromSql for Id {
+ fn column_result(value: ValueRef<'_>) -> FromSqlResult {
+ let id = Uuid::parse_str(&(value.as_str()?)[..]).unwrap();
+ Ok(Id(id))
+ }
+}
+
+impl User {
+ pub fn to_jsonable(self) -> JsonableUser {
+ JsonableUser {
+ id: self.id.0.to_string(),
name: self.name,
sign_key: self.sign_key,
insert_key: SSK::convert(&self.insert_key),
- messages_count: self.messages_count
+ messages_count: self.messages_count,
}
}
+ pub fn from_jsonable(json: JsonableUser) -> io::Result {
+ Ok(User {
+ id: Id(Uuid::parse_str(&json.id[..]).unwrap()),
+ name: json.name,
+ sign_key: json.sign_key,
+ insert_key: SSK::parse(&json.insert_key[..]).unwrap(),
+ messages_count: json.messages_count,
+ })
+ }
}
#[derive(Debug, Deserialize, Serialize)]