mirror of https://github.com/CympleTech/ESSE.git
11 changed files with 474 additions and 53 deletions
@ -0,0 +1,54 @@
@@ -0,0 +1,54 @@
|
||||
use std::path::PathBuf; |
||||
use std::sync::Arc; |
||||
use tdn::types::{ |
||||
group::GroupId, |
||||
message::{RecvType, SendType}, |
||||
primitive::{HandleResult, PeerAddr, Result}, |
||||
}; |
||||
use tokio::sync::RwLock; |
||||
|
||||
use domain_types::{LayerPeerEvent, LayerServerEvent, ServerEvent}; |
||||
use tdn_did::Proof; |
||||
use tdn_storage::local::DStorage; |
||||
|
||||
use crate::layer::{Layer, Online}; |
||||
use crate::storage::domain_db; |
||||
|
||||
use super::models::{Name, Provider}; |
||||
use super::{add_layer, rpc}; |
||||
|
||||
pub(crate) async fn handle( |
||||
layer: &Arc<RwLock<Layer>>, |
||||
ogid: GroupId, |
||||
msg: RecvType, |
||||
) -> Result<HandleResult> { |
||||
let results = HandleResult::new(); |
||||
|
||||
match msg { |
||||
RecvType::Connect(..) |
||||
| RecvType::Leave(..) |
||||
| RecvType::Result(..) |
||||
| RecvType::ResultConnect(..) |
||||
| RecvType::Stream(..) => { |
||||
info!("domain message nerver to here.") |
||||
} |
||||
RecvType::Event(addr, bytes) => { |
||||
// server & client handle it.
|
||||
let LayerServerEvent(event, proof) = bincode::deserialize(&bytes)?; |
||||
|
||||
match event { |
||||
ServerEvent::Status => { |
||||
println!("------ DEBUG DOMAIN SERVICE IS OK"); |
||||
} |
||||
ServerEvent::Result(_name, _is_ok) => {} |
||||
ServerEvent::Info(_ugid, _uaddr, _uname, _ubio, _uavatar) => {} |
||||
ServerEvent::Response(_ugid, _uname, _is_ok) => {} |
||||
} |
||||
} |
||||
RecvType::Delivery(_t, _tid, _is_ok) => { |
||||
// MAYBE
|
||||
} |
||||
} |
||||
|
||||
Ok(results) |
||||
} |
@ -1,50 +1,30 @@
@@ -1,50 +1,30 @@
|
||||
use std::sync::Arc; |
||||
mod layer; |
||||
mod models; |
||||
|
||||
pub use domain_types::DOMAIN_ID as GROUP_ID; |
||||
use domain_types::{LayerPeerEvent, PeerEvent}; |
||||
use tdn::types::{ |
||||
group::GroupId, |
||||
primitive::{HandleResult, PeerAddr}, |
||||
rpc::{json, rpc_response, RpcError, RpcHandler, RpcParam}, |
||||
message::SendType, |
||||
primitive::{HandleResult, PeerAddr, Result}, |
||||
}; |
||||
|
||||
use crate::rpc::RpcState; |
||||
|
||||
pub(crate) fn new_rpc_handler(handler: &mut RpcHandler<RpcState>) { |
||||
handler.add_method("domain-echo", |_, params, _| async move { |
||||
Ok(HandleResult::rpc(json!(params))) |
||||
}); |
||||
|
||||
handler.add_method( |
||||
"domain-add", |
||||
|_gid: GroupId, params: Vec<RpcParam>, _state: Arc<RpcState>| async move { |
||||
let _provider = PeerAddr::from_hex(params[1].as_str().ok_or(RpcError::ParseError)?)?; |
||||
let _name = params[2].as_str().ok_or(RpcError::ParseError)?.to_string(); |
||||
|
||||
Ok(HandleResult::rpc(json!(params))) |
||||
}, |
||||
); |
||||
|
||||
handler.add_method( |
||||
"domain-remove", |
||||
|_gid: GroupId, params: Vec<RpcParam>, _state: Arc<RpcState>| async move { |
||||
let _id = params[0].as_i64().ok_or(RpcError::ParseError)?; |
||||
|
||||
Ok(HandleResult::rpc(json!(params))) |
||||
}, |
||||
); |
||||
|
||||
handler.add_method( |
||||
"domain-register", |
||||
|gid: GroupId, params: Vec<RpcParam>, state: Arc<RpcState>| async move { |
||||
let _provider = PeerAddr::from_hex(params[1].as_str().ok_or(RpcError::ParseError)?)?; |
||||
let _symbol = params[2].as_str().ok_or(RpcError::ParseError)?.to_string(); |
||||
let _bio = params[3].as_str().ok_or(RpcError::ParseError)?.to_string(); |
||||
|
||||
let _me = state.group.read().await.clone_user(&gid)?; |
||||
|
||||
// Send to remote domain service.
|
||||
|
||||
//
|
||||
|
||||
Ok(HandleResult::rpc(json!(params))) |
||||
}, |
||||
); |
||||
use tdn_did::Proof; |
||||
|
||||
/// Send to domain service.
|
||||
#[inline] |
||||
pub(crate) fn add_layer( |
||||
results: &mut HandleResult, |
||||
addr: PeerAddr, |
||||
event: PeerEvent, |
||||
ogid: GroupId, |
||||
) -> Result<()> { |
||||
let proof = Proof::default(); |
||||
let data = bincode::serialize(&LayerPeerEvent(event, proof))?; |
||||
let s = SendType::Event(0, addr, data); |
||||
results.layers.push((ogid, GROUP_ID, s)); |
||||
Ok(()) |
||||
} |
||||
|
||||
pub(crate) mod rpc; |
||||
pub(crate) use layer::handle as layer_handle; |
||||
pub(crate) use rpc::new_rpc_handler; |
||||
|
@ -0,0 +1,242 @@
@@ -0,0 +1,242 @@
|
||||
use tdn::types::{ |
||||
primitive::{PeerAddr, Result}, |
||||
rpc::{json, RpcParam}, |
||||
}; |
||||
use tdn_storage::local::{DStorage, DsValue}; |
||||
|
||||
/// Provider Model.
|
||||
pub(crate) struct Provider { |
||||
/// db auto-increment id.
|
||||
id: i64, |
||||
/// name.
|
||||
name: String, |
||||
/// address.
|
||||
addr: PeerAddr, |
||||
/// is add ok.
|
||||
is_ok: bool, |
||||
/// is default.
|
||||
is_default: bool, |
||||
/// is actived.
|
||||
is_actived: bool, |
||||
} |
||||
|
||||
impl Provider { |
||||
pub fn to_rpc(&self) -> RpcParam { |
||||
json!([ |
||||
self.id, |
||||
self.name, |
||||
self.addr.to_hex(), |
||||
self.is_ok, |
||||
self.is_default, |
||||
]) |
||||
} |
||||
|
||||
fn from_values(mut v: Vec<DsValue>) -> Self { |
||||
Self { |
||||
is_actived: v.pop().unwrap().as_bool(), |
||||
is_default: v.pop().unwrap().as_bool(), |
||||
is_ok: v.pop().unwrap().as_bool(), |
||||
addr: PeerAddr::from_hex(v.pop().unwrap().as_string()).unwrap_or(Default::default()), |
||||
name: v.pop().unwrap().as_string(), |
||||
id: v.pop().unwrap().as_i64(), |
||||
} |
||||
} |
||||
|
||||
/// use in rpc when load providers.
|
||||
pub fn list(db: &DStorage) -> Result<Vec<Self>> { |
||||
let matrix = |
||||
db.query("SELECT id, name, addr, is_ok, is_default, is_actived FROM providers")?; |
||||
let mut providers = vec![]; |
||||
for values in matrix { |
||||
providers.push(Self::from_values(values)); |
||||
} |
||||
Ok(providers) |
||||
} |
||||
|
||||
/// use in rpc when load provider by id.
|
||||
pub fn get(db: &DStorage, id: &i64) -> Result<Self> { |
||||
let sql = format!( |
||||
"SELECT id, name, addr, is_ok, is_default, is_actived FROM providers WHERE id = {}", |
||||
id |
||||
); |
||||
let mut matrix = db.query(&sql)?; |
||||
if matrix.len() > 0 { |
||||
let values = matrix.pop().unwrap(); // safe unwrap()
|
||||
return Ok(Self::from_values(values)); |
||||
} |
||||
Err(anyhow!("provider is missing")) |
||||
} |
||||
|
||||
/// insert a new provider.
|
||||
pub fn get_by_addr(db: &DStorage, addr: &PeerAddr) -> Result<Self> { |
||||
let sql = format!( |
||||
"SELECT id, name, addr, is_ok, is_default, is_actived FROM providers WHERE addr = '{}'", |
||||
addr.to_hex() |
||||
); |
||||
let mut matrix = db.query(&sql)?; |
||||
if matrix.len() > 0 { |
||||
let values = matrix.pop().unwrap(); // safe unwrap()
|
||||
return Ok(Self::from_values(values)); |
||||
} |
||||
Err(anyhow!("provider is missing")) |
||||
} |
||||
|
||||
pub fn insert(&mut self, db: &DStorage) -> Result<()> { |
||||
let mut unique_check = db.query(&format!( |
||||
"SELECT id from providers WHERE addr = '{}'", |
||||
self.addr.to_hex() |
||||
))?; |
||||
if unique_check.len() > 0 { |
||||
let id = unique_check.pop().unwrap().pop().unwrap().as_i64(); |
||||
self.id = id; |
||||
let sql = format!("UPDATE providers SET name = '{}', addr = '{}', is_ok = {}, is_default = {}, is_actived = {} WHERE id = {}", |
||||
self.name, |
||||
self.addr.to_hex(), |
||||
self.is_ok, |
||||
self.is_default, |
||||
self.is_actived, |
||||
self.id |
||||
); |
||||
db.update(&sql)?; |
||||
} else { |
||||
let sql = format!( |
||||
"INSERT INTO providers (name, addr, is_ok, is_default, is_actived) VALUES ('{}', '{}', {}, {}, {})", |
||||
self.name, |
||||
self.addr.to_hex(), |
||||
self.is_ok, |
||||
self.is_default, |
||||
self.is_actived, |
||||
); |
||||
let id = db.insert(&sql)?; |
||||
self.id = id; |
||||
} |
||||
Ok(()) |
||||
} |
||||
|
||||
/// return if is closed
|
||||
pub fn delete(db: &DStorage, id: &i64) -> Result<()> { |
||||
let sql = format!("UPDATE providers SET is_actived = false WHERE id = {}", id); |
||||
db.update(&sql)?; |
||||
Ok(()) |
||||
} |
||||
} |
||||
|
||||
/// Provider Model.
|
||||
pub(crate) struct Name { |
||||
/// db auto-increment id.
|
||||
id: i64, |
||||
/// provider database id.
|
||||
provider: i64, |
||||
/// name.
|
||||
name: String, |
||||
/// bio.
|
||||
bio: String, |
||||
/// is add ok.
|
||||
is_ok: bool, |
||||
/// is actived.
|
||||
is_actived: bool, |
||||
} |
||||
|
||||
impl Name { |
||||
pub fn to_rpc(&self) -> RpcParam { |
||||
json!([ |
||||
self.id, |
||||
self.provider, |
||||
self.name, |
||||
self.bio, |
||||
self.is_ok, |
||||
self.is_actived, |
||||
]) |
||||
} |
||||
|
||||
fn from_values(mut v: Vec<DsValue>) -> Self { |
||||
Self { |
||||
is_actived: v.pop().unwrap().as_bool(), |
||||
is_ok: v.pop().unwrap().as_bool(), |
||||
bio: v.pop().unwrap().as_string(), |
||||
name: v.pop().unwrap().as_string(), |
||||
provider: v.pop().unwrap().as_i64(), |
||||
id: v.pop().unwrap().as_i64(), |
||||
} |
||||
} |
||||
|
||||
/// use in rpc when load providers.
|
||||
pub fn list(db: &DStorage) -> Result<Vec<Self>> { |
||||
let matrix = db.query("SELECT id, provider, name, bio, is_ok, is_actived FROM names")?; |
||||
let mut names = vec![]; |
||||
for values in matrix { |
||||
names.push(Self::from_values(values)); |
||||
} |
||||
Ok(names) |
||||
} |
||||
|
||||
/// use in rpc when load provider by id.
|
||||
pub fn get(db: &DStorage, id: &i64) -> Result<Self> { |
||||
let sql = format!( |
||||
"SELECT id, provider, name, bio, is_ok, is_actived FROM names WHERE id = {}", |
||||
id |
||||
); |
||||
let mut matrix = db.query(&sql)?; |
||||
if matrix.len() > 0 { |
||||
let values = matrix.pop().unwrap(); // safe unwrap()
|
||||
return Ok(Self::from_values(values)); |
||||
} |
||||
Err(anyhow!("name is missing")) |
||||
} |
||||
|
||||
/// insert a new provider.
|
||||
pub fn get_by_addr(db: &DStorage, addr: &PeerAddr) -> Result<Self> { |
||||
let sql = format!( |
||||
"SELECT id, name, addr, is_ok, is_default, is_actived FROM providers WHERE addr = '{}'", |
||||
addr.to_hex() |
||||
); |
||||
let mut matrix = db.query(&sql)?; |
||||
if matrix.len() > 0 { |
||||
let values = matrix.pop().unwrap(); // safe unwrap()
|
||||
return Ok(Self::from_values(values)); |
||||
} |
||||
Err(anyhow!("name is missing")) |
||||
} |
||||
|
||||
pub fn insert(&mut self, db: &DStorage) -> Result<()> { |
||||
let mut unique_check = db.query(&format!( |
||||
"SELECT id from names WHERE provider = {} AND name = '{}'", |
||||
self.provider, self.name |
||||
))?; |
||||
if unique_check.len() > 0 { |
||||
let id = unique_check.pop().unwrap().pop().unwrap().as_i64(); |
||||
self.id = id; |
||||
let sql = format!( |
||||
"UPDATE names SET bio = '{}', is_ok = {}, is_actived = {} WHERE id = {}", |
||||
self.bio, self.is_ok, self.is_actived, self.id |
||||
); |
||||
db.update(&sql)?; |
||||
} else { |
||||
let sql = format!( |
||||
"INSERT INTO names (provider, name, bio, is_ok, is_actived) VALUES ({}, '{}', '{}', {}, {})", |
||||
self.provider, |
||||
self.name, |
||||
self.bio, |
||||
self.is_ok, |
||||
self.is_actived, |
||||
); |
||||
let id = db.insert(&sql)?; |
||||
self.id = id; |
||||
} |
||||
Ok(()) |
||||
} |
||||
|
||||
/// delete the name.
|
||||
pub fn delete(db: &DStorage, id: &i64) -> Result<()> { |
||||
let sql = format!("DELETE names WHERE id = {}", id); |
||||
db.delete(&sql)?; |
||||
Ok(()) |
||||
} |
||||
|
||||
/// active/suspend the name.
|
||||
pub fn active(db: &DStorage, id: &i64, active: bool) -> Result<()> { |
||||
let sql = format!("UPDATE names SET is_actived = {} WHERE id = {}", active, id); |
||||
db.update(&sql)?; |
||||
Ok(()) |
||||
} |
||||
} |
@ -0,0 +1,90 @@
@@ -0,0 +1,90 @@
|
||||
use std::sync::Arc; |
||||
use tdn::types::{ |
||||
group::GroupId, |
||||
primitive::{HandleResult, PeerAddr}, |
||||
rpc::{json, RpcError, RpcHandler, RpcParam}, |
||||
}; |
||||
|
||||
use domain_types::PeerEvent; |
||||
|
||||
use super::add_layer; |
||||
use crate::rpc::RpcState; |
||||
|
||||
pub(crate) fn new_rpc_handler(handler: &mut RpcHandler<RpcState>) { |
||||
handler.add_method("domain-echo", |_, params, _| async move { |
||||
Ok(HandleResult::rpc(json!(params))) |
||||
}); |
||||
|
||||
handler.add_method( |
||||
"domain-provider-add", |
||||
|gid: GroupId, params: Vec<RpcParam>, _state: Arc<RpcState>| async move { |
||||
let provider = PeerAddr::from_hex(params[0].as_str().ok_or(RpcError::ParseError)?)?; |
||||
|
||||
let mut results = HandleResult::new(); |
||||
add_layer(&mut results, provider, PeerEvent::Check, gid)?; |
||||
Ok(results) |
||||
}, |
||||
); |
||||
|
||||
handler.add_method( |
||||
"domain-provider-default", |
||||
|_gid: GroupId, params: Vec<RpcParam>, _state: Arc<RpcState>| async move { |
||||
let _id = params[0].as_i64().ok_or(RpcError::ParseError)?; |
||||
|
||||
Ok(HandleResult::rpc(json!(params))) |
||||
}, |
||||
); |
||||
|
||||
handler.add_method( |
||||
"domain-provider-remove", |
||||
|_gid: GroupId, params: Vec<RpcParam>, _state: Arc<RpcState>| async move { |
||||
let _id = params[0].as_i64().ok_or(RpcError::ParseError)?; |
||||
|
||||
Ok(HandleResult::rpc(json!(params))) |
||||
}, |
||||
); |
||||
|
||||
handler.add_method( |
||||
"domain-register", |
||||
|gid: GroupId, params: Vec<RpcParam>, state: Arc<RpcState>| async move { |
||||
let _provider = params[0].as_i64().ok_or(RpcError::ParseError)?; |
||||
let _symbol = params[1].as_str().ok_or(RpcError::ParseError)?.to_string(); |
||||
let _bio = params[2].as_str().ok_or(RpcError::ParseError)?.to_string(); |
||||
|
||||
let _me = state.group.read().await.clone_user(&gid)?; |
||||
|
||||
// Send to remote domain service.
|
||||
|
||||
//
|
||||
|
||||
Ok(HandleResult::rpc(json!(params))) |
||||
}, |
||||
); |
||||
|
||||
handler.add_method( |
||||
"domain-active", |
||||
|_gid: GroupId, params: Vec<RpcParam>, _state: Arc<RpcState>| async move { |
||||
let _id = params[0].as_i64().ok_or(RpcError::ParseError)?; |
||||
|
||||
Ok(HandleResult::rpc(json!(params))) |
||||
}, |
||||
); |
||||
|
||||
handler.add_method( |
||||
"domain-remove", |
||||
|_gid: GroupId, params: Vec<RpcParam>, _state: Arc<RpcState>| async move { |
||||
let _id = params[0].as_i64().ok_or(RpcError::ParseError)?; |
||||
|
||||
Ok(HandleResult::rpc(json!(params))) |
||||
}, |
||||
); |
||||
|
||||
handler.add_method( |
||||
"domain-search", |
||||
|_gid: GroupId, params: Vec<RpcParam>, _state: Arc<RpcState>| async move { |
||||
let _name = params[0].as_str().ok_or(RpcError::ParseError)?; |
||||
|
||||
Ok(HandleResult::rpc(json!(params))) |
||||
}, |
||||
); |
||||
} |
@ -0,0 +1,17 @@
@@ -0,0 +1,17 @@
|
||||
#[rustfmt::skip] |
||||
pub(super) const DOMAIN_VERSIONS: [&str; 2] = [ |
||||
"CREATE TABLE IF NOT EXISTS names( |
||||
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, |
||||
provider INTEGER NOT NULL, |
||||
name TEXT NOT NULL, |
||||
bio TEXT NOT NULL, |
||||
is_ok INTEGER NOT NULL, |
||||
is_actived INTEGER NOT NULL);", |
||||
"CREATE TABLE IF NOT EXISTS providers( |
||||
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, |
||||
name TEXT NOT NULL, |
||||
addr TEXT NOT NULL, |
||||
is_ok INTEGER NOT NULL, |
||||
is_default INTEGER NOT NULL, |
||||
is_actived INTEGER NOT NULL);", |
||||
]; |
Loading…
Reference in new issue