handle add_user function

This commit is contained in:
Horhik 2021-03-31 07:12:26 +03:00
parent e582194b25
commit b2f8474c97
10 changed files with 113 additions and 39 deletions

View File

@ -13,22 +13,18 @@
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Cargo.lock" beforeDir="false" afterPath="$PROJECT_DIR$/Cargo.lock" afterDir="false" /> <change beforePath="$PROJECT_DIR$/Cargo.lock" beforeDir="false" afterPath="$PROJECT_DIR$/Cargo.lock" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Cargo.toml" beforeDir="false" afterPath="$PROJECT_DIR$/Cargo.toml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/Cargo.toml" beforeDir="false" afterPath="$PROJECT_DIR$/Cargo.toml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/chat/front_conn.rs" beforeDir="false" afterPath="$PROJECT_DIR$/src/chat/front_conn.rs" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/api/handlers.rs" beforeDir="false" afterPath="$PROJECT_DIR$/src/api/handlers.rs" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/chat/mod.rs" beforeDir="false" afterPath="$PROJECT_DIR$/src/chat/mod.rs" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/api/request.rs" beforeDir="false" afterPath="$PROJECT_DIR$/src/api/request.rs" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/api/response.rs" beforeDir="false" afterPath="$PROJECT_DIR$/src/api/response.rs" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/chat/serv_conn.rs" beforeDir="false" afterPath="$PROJECT_DIR$/src/chat/serv_conn.rs" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/chat/serv_conn.rs" beforeDir="false" afterPath="$PROJECT_DIR$/src/chat/serv_conn.rs" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/chat/types.rs" beforeDir="false" afterPath="$PROJECT_DIR$/src/chat/types.rs" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/db/mod.rs" beforeDir="false" afterPath="$PROJECT_DIR$/src/db/mod.rs" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/db/mod.rs" beforeDir="false" afterPath="$PROJECT_DIR$/src/db/mod.rs" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/lib.rs" beforeDir="false" afterPath="$PROJECT_DIR$/src/lib.rs" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/db/types.rs" beforeDir="false" afterPath="$PROJECT_DIR$/src/db/types.rs" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main.rs" beforeDir="false" afterPath="$PROJECT_DIR$/src/main.rs" afterDir="false" />
</list> </list>
<option name="SHOW_DIALOG" value="false" /> <option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" /> <option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" /> <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" /> <option name="LAST_RESOLUTION" value="IGNORE" />
</component> </component>
<component name="ClangdSettings">
<option name="formatViaClangd" value="false" />
</component>
<component name="Git.Settings"> <component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" /> <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component> </component>
@ -46,7 +42,7 @@
<property name="RunOnceActivity.ShowReadmeOnStart" value="true" /> <property name="RunOnceActivity.ShowReadmeOnStart" value="true" />
<property name="WebServerToolWindowFactoryState" value="false" /> <property name="WebServerToolWindowFactoryState" value="false" />
<property name="cf.first.check.clang-format" value="false" /> <property name="cf.first.check.clang-format" value="false" />
<property name="last_opened_file_path" value="$PROJECT_DIR$/../../../olymp/mosh" /> <property name="last_opened_file_path" value="$PROJECT_DIR$" />
<property name="nodejs_package_manager_path" value="npm" /> <property name="nodejs_package_manager_path" value="npm" />
<property name="org.rust.cargo.project.model.PROJECT_DISCOVERY" value="true" /> <property name="org.rust.cargo.project.model.PROJECT_DISCOVERY" value="true" />
</component> </component>
@ -88,6 +84,7 @@
<workItem from="1613570542642" duration="4470000" /> <workItem from="1613570542642" duration="4470000" />
<workItem from="1614190476350" duration="9000" /> <workItem from="1614190476350" duration="9000" />
<workItem from="1614277959074" duration="31000" /> <workItem from="1614277959074" duration="31000" />
<workItem from="1617097697890" duration="1371000" />
</task> </task>
<servers /> <servers />
</component> </component>

11
Cargo.lock generated
View File

@ -647,6 +647,7 @@ dependencies = [
"tokio 0.3.6", "tokio 0.3.6",
"toml", "toml",
"tungstenite 0.12.0", "tungstenite 0.12.0",
"uuid",
] ]
[[package]] [[package]]
@ -1605,6 +1606,16 @@ version = "0.7.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "05e42f7c18b8f902290b009cde6d651262f956c98bc51bca4cd1d511c9cd85c7" 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]] [[package]]
name = "value-bag" name = "value-bag"
version = "1.0.0-alpha.6" version = "1.0.0-alpha.6"

View File

@ -23,6 +23,7 @@ serde_derive = "1.0.116"
async-trait = "0.1.42" async-trait = "0.1.42"
simple_logger = "1.11.0" simple_logger = "1.11.0"
chrono = {version = "0.4.19", features = ["serde"]} chrono = {version = "0.4.19", features = ["serde"]}
uuid = {version = "0.8.2", features = ["serde" , "v4"]}
[dependencies.fcpv2] [dependencies.fcpv2]
path = "../FCPv2" path = "../FCPv2"

View File

@ -1,12 +1,14 @@
use super::request::*; use super::{request::*, response::{AppStatus, ResponseType}};
use super::response::User; use super::response::User;
use super::response::UserList; use super::response::UserList;
use crate::chat::types::PackedMessage; use crate::chat::types::PackedMessage;
use crate::chat::types::SP; use crate::chat::types::SP;
use crate::db::{messages, users}; use crate::db::{self, messages, types, users};
use async_std::io::Result; use async_std::io::Result;
use fcpv2::types::{traits::FcpParser, SSK};
use rusqlite::Connection; use rusqlite::Connection;
use serde_json::json; use serde_json::json;
use uuid::Uuid;
pub fn start_app(request: StartAppReq, server_sender: &SP) -> Result<()> { pub fn start_app(request: StartAppReq, server_sender: &SP) -> Result<()> {
Ok(()) Ok(())
//sending *JSON*, what everything is OK //sending *JSON*, what everything is OK
@ -24,8 +26,9 @@ pub fn load_users(request: LoadUsersReq, conn: &Connection, server_sender: &SP)
.collect(); .collect();
let users: String = serde_json::to_string(&UserList { let users: String = serde_json::to_string(&UserList {
users: jsoned_users, users: jsoned_users,
}).unwrap(); })
let _ =server_sender.send(PackedMessage::ToClient(users)).unwrap(); .unwrap();
let _ = server_sender.send(PackedMessage::ToClient(users)).unwrap();
Ok(()) Ok(())
} }
pub fn send_message(request: SendMessageReq, conn: &Connection, server_sender: &SP) -> Result<()> { pub fn send_message(request: SendMessageReq, conn: &Connection, server_sender: &SP) -> Result<()> {
@ -42,6 +45,14 @@ pub fn load_messages(
//sending *JSON* //sending *JSON*
} }
pub fn add_user(request: AddUserReq, conn: &Connection, server_sender: &SP) -> Result<()> { pub fn add_user(request: AddUserReq, conn: &Connection, server_sender: &SP) -> Result<()> {
unimplemented!() let user = db::types::User {
//sending *JSON* what user is created 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(())
} }

View File

@ -62,6 +62,7 @@ pub struct LoadMessagesReq {
#[derive(Deserialize, Debug)] #[derive(Deserialize, Debug)]
pub struct AddUserReq { pub struct AddUserReq {
pub req_type: AddUser, pub req_type: AddUser,
pub name: String,
pub sign_key: String, pub sign_key: String,
pub insert_key: String, pub insert_key: String,
} }

View File

@ -1,9 +1,10 @@
use crate::db::types::User as SqliteUser; use crate::db::types::User as SqliteUser;
use serde_derive::{Deserialize, Serialize}; use serde_derive::{Deserialize, Serialize};
use tungstenite::http::Response;
use crate::db::types::SignKey; use crate::db::types::SignKey;
pub type InsertKey = String; pub type InsertKey = String;
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
enum ResponseType{ pub enum ResponseType{
Error, Error,
NewMessage, NewMessage,
UserList, UserList,
@ -11,27 +12,30 @@ enum ResponseType{
FetchedMessages, FetchedMessages,
InstanceCreated, InstanceCreated,
InstanceAccepted, InstanceAccepted,
UserAdded
} }
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
enum ErrorType{ pub enum ErrorType{
WrongKey WrongKey,
FailedToAddUser
} }
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
struct AppError{ pub struct AppError{
res_type: ResponseType, pub res_type: ErrorType,
} }
// Status of last requested action. Like `Create Instance` or `LoadUsers` // 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)] #[derive(Debug, Deserialize, Serialize)]
pub struct User { pub struct User {
pub id: u32, pub id: String,
pub name: String, pub name: String,
pub sign_key: SignKey, pub sign_key: SignKey,
pub insert_key: InsertKey, pub insert_key: InsertKey,

View File

@ -1,7 +1,11 @@
use crate::chat::types::SP; use crate::chat::types::{PackedMessage, SP};
use rusqlite; use rusqlite;
use super::{request::*, handlers}; use super::{
handlers,
request::*,
response::{AppError, ErrorType, ResponseType},
};
use async_std::io::Result; use async_std::io::Result;
use rusqlite::Connection; use rusqlite::Connection;
use serde_json::from_str; 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(()); //TODO v0.3 Add Instances return Ok(());
// } // }
if let Ok(res) = from_str::<StartAppReq>(&json) { if let Ok(res) = from_str::<StartAppReq>(&json) {
handlers::start_app(res, server_sender)? handlers::start_app(res, server_sender)?
} }
if let Ok(res) = from_str::<StopAppReq>(&json) { if let Ok(res) = from_str::<StopAppReq>(&json) {
handlers::stop_app(res, conn, server_sender)? handlers::stop_app(res, conn, server_sender)?
} }
if let Ok(res) = from_str::<LoadUsersReq>(&json) { if let Ok(res) = from_str::<LoadUsersReq>(&json) {
handlers::load_users(res, conn, server_sender)? 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)? handlers::load_messages(res, conn, server_sender)?
} }
if let Ok(res) = from_str::<AddUserReq>(&json) { if let Ok(res) = from_str::<AddUserReq>(&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( Err(async_std::io::Error::new(
async_std::io::ErrorKind::InvalidData, async_std::io::ErrorKind::InvalidData,
"Wrong request", "Wrong request",
)) ))
} }

View File

@ -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<()> { async fn server_responce_getter(mut receiver: OwnedReadHalf, client_sender: SP) -> io::Result<()> {
loop { 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]; let mut buffer = [0; 1024];
match receiver.read(&mut buffer).await { match receiver.read(&mut buffer).await {
Ok(_) => { Ok(_) => {

View File

@ -10,7 +10,7 @@ fn create_db(conn: &Connection) -> Result<()> {
"CREATE TABLE users ( "CREATE TABLE users (
id INTEGER PRIMARY KEY, id INTEGER PRIMARY KEY,
name TEXT UNIQUE NOT NULL, name TEXT UNIQUE NOT NULL,
sign_key BLOB NOT NULL, sign_key BLOB NOT NULL,
insert_key BLOB NOT NULL, insert_key BLOB NOT NULL,
messages_count INTEGER messages_count INTEGER
)", )",

View File

@ -1,6 +1,13 @@
use std::io;
use chrono::prelude::*; use chrono::prelude::*;
use fcpv2::types::{traits::FcpRequest, SSK}; use fcpv2::types::{traits::{FcpRequest, FcpParser}, SSK};
use serde_derive::{Serialize, Deserialize}; 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; use crate::api::response::User as JsonableUser;
@ -8,26 +15,52 @@ pub const DB_PATH: &str = "hole.db";
pub type SignKey = String; pub type SignKey = String;
pub type InsertKey = SSK; pub type InsertKey = SSK;
#[derive(Debug, Deserialize, Serialize)]
pub struct Id(pub uuid::Uuid);
#[derive(Debug, Deserialize, Serialize)] #[derive(Debug, Deserialize, Serialize)]
pub struct User { pub struct User {
pub id: u32, pub id: Id,
pub name: String, pub name: String,
pub sign_key: SignKey, pub sign_key: SignKey,
pub insert_key: InsertKey, pub insert_key: InsertKey,
pub messages_count: u32, pub messages_count: u32,
} }
impl User{ /// converting SSK to rusqlite type
pub fn to_jsonable(self) -> JsonableUser{ impl ToSql for Id {
JsonableUser{ fn to_sql(&self) -> Result<ToSqlOutput<'_>> {
id: self.id, Ok(ToSqlOutput::from(self.0.to_string()))
}
}
/// converting from rusqlite type to SSK
impl FromSql for Id {
fn column_result(value: ValueRef<'_>) -> FromSqlResult<Id> {
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, name: self.name,
sign_key: self.sign_key, sign_key: self.sign_key,
insert_key: SSK::convert(&self.insert_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<User> {
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)] #[derive(Debug, Deserialize, Serialize)]