Improved Peer
type, adjusted database
module accordingly. Fixes #18
This commit is contained in:
parent
f2c9fe48a1
commit
4ca9ffaa0e
9 changed files with 53 additions and 30 deletions
|
@ -1,4 +1,3 @@
|
||||||
pub mod api;
|
pub mod api;
|
||||||
pub mod messages;
|
pub mod messages;
|
||||||
pub mod peer;
|
|
||||||
pub mod types;
|
pub mod types;
|
||||||
|
|
|
@ -22,6 +22,9 @@ pub use message_id::MessageId;
|
||||||
mod peer_id;
|
mod peer_id;
|
||||||
pub use peer_id::PeerId;
|
pub use peer_id::PeerId;
|
||||||
|
|
||||||
|
mod peer;
|
||||||
|
pub use peer::Peer;
|
||||||
|
|
||||||
mod pot_id;
|
mod pot_id;
|
||||||
pub use pot_id::PotId;
|
pub use pot_id::PotId;
|
||||||
|
|
||||||
|
|
|
@ -5,19 +5,21 @@ use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
use crate::types::PeerId;
|
use crate::types::PeerId;
|
||||||
|
|
||||||
|
use super::Family;
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
|
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
|
||||||
pub struct Peer {
|
pub struct Peer {
|
||||||
id: PeerId,
|
id: PeerId,
|
||||||
name: Option<String>,
|
name: Option<String>,
|
||||||
family: Vec<PeerId>,
|
family: Option<Family>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Peer {
|
impl Peer {
|
||||||
pub fn new(id: PeerId, name: Option<String>) -> Self {
|
pub fn new(id: PeerId, name: Option<String>, family: Option<Family>) -> Self {
|
||||||
Peer {
|
Peer {
|
||||||
id: id,
|
id,
|
||||||
name: name,
|
name,
|
||||||
family: vec![],
|
family,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
use tracing::debug;
|
use tracing::debug;
|
||||||
|
|
||||||
use ubisync_lib::peer::Peer;
|
use ubisync_lib::types::Peer;
|
||||||
use ubisync_lib::types::{ContentUpdateStrategy, PeerId};
|
use ubisync_lib::types::{ContentUpdateStrategy, PeerId};
|
||||||
|
|
||||||
use ubisync_lib::messages::{Message, MessageContent};
|
use ubisync_lib::messages::{Message, MessageContent};
|
||||||
|
@ -19,7 +19,7 @@ pub fn handle(state: &CommState, peer: &PeerId, message: Message) {
|
||||||
match message.content() {
|
match message.content() {
|
||||||
MessageContent::Hello { peer_name } => {
|
MessageContent::Hello { peer_name } => {
|
||||||
state
|
state
|
||||||
.set_peer(Peer::new(peer.to_owned(), Some(peer_name.to_string())))
|
.set_peer(Peer::new(peer.to_owned(), Some(peer_name.to_string()), None)) //TODO: Allow sending Family in Hello message
|
||||||
.expect("State failed");
|
.expect("State failed");
|
||||||
}
|
}
|
||||||
MessageContent::JoinFamily => state.request_family_join(peer.to_owned()),
|
MessageContent::JoinFamily => state.request_family_join(peer.to_owned()),
|
||||||
|
|
|
@ -10,8 +10,7 @@ use state::{ApiState, CommState, State};
|
||||||
|
|
||||||
use ubisync_lib::{
|
use ubisync_lib::{
|
||||||
messages::{Message, MessageContent},
|
messages::{Message, MessageContent},
|
||||||
peer::Peer,
|
types::{AppId, Family, Peer, PeerId, PotId},
|
||||||
types::{AppId, Family, PeerId, PotId},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
pub mod api;
|
pub mod api;
|
||||||
|
@ -69,7 +68,7 @@ impl Ubisync {
|
||||||
|
|
||||||
pub fn add_peer_from_id(&self, id: PeerId) -> anyhow::Result<()> {
|
pub fn add_peer_from_id(&self, id: PeerId) -> anyhow::Result<()> {
|
||||||
// TODO: resolve peer's name before setting
|
// TODO: resolve peer's name before setting
|
||||||
self.state_handle.add_peer(Peer::new(id, None))
|
self.state_handle.add_peer(Peer::new(id, None, None))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn add_family_member_from_id(&self, id: PeerId) -> anyhow::Result<()> {
|
pub fn add_family_member_from_id(&self, id: PeerId) -> anyhow::Result<()> {
|
||||||
|
|
|
@ -4,10 +4,9 @@ use tracing::debug;
|
||||||
|
|
||||||
use ubisync_lib::{
|
use ubisync_lib::{
|
||||||
api::events::AppEvent,
|
api::events::AppEvent,
|
||||||
peer::Peer,
|
|
||||||
types::{
|
types::{
|
||||||
ContentUpdateStrategy, Element, ElementContent, ElementId, Family, FamilyId, MessageId,
|
ContentUpdateStrategy, Element, ElementContent, ElementId, Family, FamilyId, MessageId,
|
||||||
PeerId, PotId,
|
Peer, PeerId, PotId,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
use std::ops::Deref;
|
||||||
|
|
||||||
use anyhow::{anyhow, Error};
|
use anyhow::{anyhow, Error};
|
||||||
use bonsaidb::{
|
use bonsaidb::{
|
||||||
core::schema::{Collection, SerializedCollection},
|
core::schema::{Collection, SerializedCollection},
|
||||||
|
@ -5,7 +7,7 @@ use bonsaidb::{
|
||||||
};
|
};
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use ubisync_lib::{peer::Peer, types::PeerId};
|
use ubisync_lib::types::{Peer, PeerId};
|
||||||
|
|
||||||
use crate::state::database::{as_key::AsKey, StateDB};
|
use crate::state::database::{as_key::AsKey, StateDB};
|
||||||
|
|
||||||
|
@ -17,17 +19,12 @@ pub(super) struct DbPeer {
|
||||||
pub(super) name: Option<String>,
|
pub(super) name: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<DbPeer> for Peer {
|
|
||||||
fn from(value: DbPeer) -> Self {
|
|
||||||
Peer::new((*value.id).clone(), value.name)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub(crate) struct Peers<'a> {
|
pub(crate) struct Peers<'a> {
|
||||||
parent: &'a StateDB,
|
parent: &'a StateDB,
|
||||||
db: &'a Database,
|
db: &'a Database,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
impl<'a> Peers<'a> {
|
impl<'a> Peers<'a> {
|
||||||
pub const fn new(parent: &'a StateDB, bonsai: &'a Database) -> Self {
|
pub const fn new(parent: &'a StateDB, bonsai: &'a Database) -> Self {
|
||||||
Self { parent, db: bonsai }
|
Self { parent, db: bonsai }
|
||||||
|
@ -50,8 +47,15 @@ impl<'a> Peers<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get(&self, id: PeerId) -> anyhow::Result<Option<Peer>> {
|
pub fn get(&self, id: PeerId) -> anyhow::Result<Option<Peer>> {
|
||||||
|
let fam = match self.parent.families().get_by_peer(id.clone())? {
|
||||||
|
Some(fam_id) => self.parent.families().get(fam_id)?,
|
||||||
|
None => None,
|
||||||
|
};
|
||||||
|
|
||||||
DbPeer::get(&AsKey::new(id), self.db)
|
DbPeer::get(&AsKey::new(id), self.db)
|
||||||
.map(|doc| doc.map(|peer| Peer::new((*peer.contents.id).clone(), peer.contents.name)))
|
.map(|doc| {
|
||||||
|
doc.map(|peer| Peer::new((*peer.contents.id).clone(), peer.contents.name, fam))
|
||||||
|
})
|
||||||
.map_err(|e| anyhow!(e))
|
.map_err(|e| anyhow!(e))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -61,7 +65,22 @@ impl<'a> Peers<'a> {
|
||||||
.map(|peers| {
|
.map(|peers| {
|
||||||
peers
|
peers
|
||||||
.iter()
|
.iter()
|
||||||
.map(|p| p.contents.clone().into())
|
.map(|p| {
|
||||||
|
let family = match self
|
||||||
|
.parent
|
||||||
|
.families()
|
||||||
|
.get_by_peer(p.contents.id.deref().clone())
|
||||||
|
{
|
||||||
|
Ok(Some(fam_id)) => self.parent.families().get(fam_id).ok().flatten(),
|
||||||
|
_ => None,
|
||||||
|
};
|
||||||
|
|
||||||
|
Peer::new(
|
||||||
|
p.contents.id.deref().clone(),
|
||||||
|
p.contents.name.clone(),
|
||||||
|
family,
|
||||||
|
)
|
||||||
|
})
|
||||||
.collect_vec()
|
.collect_vec()
|
||||||
})
|
})
|
||||||
.map_err(|e| anyhow!(e))
|
.map_err(|e| anyhow!(e))
|
||||||
|
@ -78,7 +97,7 @@ impl<'a> Peers<'a> {
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use ubisync_lib::{peer::Peer, types::PeerId};
|
use ubisync_lib::types::{Peer, PeerId};
|
||||||
|
|
||||||
use crate::state::database::StateDB;
|
use crate::state::database::StateDB;
|
||||||
|
|
||||||
|
@ -86,7 +105,7 @@ mod tests {
|
||||||
fn add_get() {
|
fn add_get() {
|
||||||
let db = StateDB::init(None);
|
let db = StateDB::init(None);
|
||||||
|
|
||||||
let peer = Peer::new(PeerId::default(), Some("Peer name".to_string()));
|
let peer = Peer::new(PeerId::default(), Some("Peer name".to_string()), None);
|
||||||
db.peers().add(peer.clone()).unwrap();
|
db.peers().add(peer.clone()).unwrap();
|
||||||
|
|
||||||
let retrieved_peer = db.peers().get(peer.id()).unwrap();
|
let retrieved_peer = db.peers().get(peer.id()).unwrap();
|
||||||
|
@ -98,7 +117,7 @@ mod tests {
|
||||||
fn get_all() {
|
fn get_all() {
|
||||||
let db = StateDB::init(None);
|
let db = StateDB::init(None);
|
||||||
|
|
||||||
let peer = Peer::new(PeerId::default(), Some("Peer name".to_string()));
|
let peer = Peer::new(PeerId::default(), Some("Peer name".to_string()), None);
|
||||||
db.peers().add(peer.clone()).unwrap();
|
db.peers().add(peer.clone()).unwrap();
|
||||||
|
|
||||||
let all_peers = db.peers().get_all().unwrap();
|
let all_peers = db.peers().get_all().unwrap();
|
||||||
|
@ -109,7 +128,7 @@ mod tests {
|
||||||
fn set_peer_name() {
|
fn set_peer_name() {
|
||||||
let db = StateDB::init(None);
|
let db = StateDB::init(None);
|
||||||
|
|
||||||
let peer = Peer::new(PeerId::default(), Some("Peer name".to_string()));
|
let peer = Peer::new(PeerId::default(), Some("Peer name".to_string()), None);
|
||||||
db.peers().add(peer.clone()).unwrap();
|
db.peers().add(peer.clone()).unwrap();
|
||||||
db.peers()
|
db.peers()
|
||||||
.set_name(peer.id().clone(), &Some("New peer name".to_string()))
|
.set_name(peer.id().clone(), &Some("New peer name".to_string()))
|
||||||
|
@ -118,7 +137,11 @@ mod tests {
|
||||||
let retrieved_peer = db.peers().get(peer.id()).unwrap();
|
let retrieved_peer = db.peers().get(peer.id()).unwrap();
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
Some(Peer::new(peer.id(), Some("New peer name".to_string()))),
|
Some(Peer::new(
|
||||||
|
peer.id(),
|
||||||
|
Some("New peer name".to_string()),
|
||||||
|
None
|
||||||
|
)),
|
||||||
retrieved_peer
|
retrieved_peer
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,6 @@ use bonsaidb::{
|
||||||
};
|
};
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use tracing::debug;
|
|
||||||
use ubisync_lib::types::{AppId, PotId};
|
use ubisync_lib::types::{AppId, PotId};
|
||||||
|
|
||||||
use crate::state::database::{as_key::AsKey, StateDB};
|
use crate::state::database::{as_key::AsKey, StateDB};
|
||||||
|
|
|
@ -9,8 +9,7 @@ use std::{
|
||||||
use ubisync_lib::{
|
use ubisync_lib::{
|
||||||
api::events::AppEvent,
|
api::events::AppEvent,
|
||||||
messages::{Message, MessageContent},
|
messages::{Message, MessageContent},
|
||||||
peer::Peer,
|
types::{AppId, Element, ElementContent, ElementId, Family, FamilyId, Peer, PeerId, PotId, Tag},
|
||||||
types::{AppId, Element, ElementContent, ElementId, Family, FamilyId, PeerId, PotId, Tag},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
use anyhow::Error;
|
use anyhow::Error;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue