From 4ca9ffaa0e521734d32818bd0a352fcc11e350a6 Mon Sep 17 00:00:00 2001 From: "Philip (a-0)" <@ph:a-0.me> Date: Thu, 4 Apr 2024 22:56:50 +0200 Subject: [PATCH] Improved `Peer` type, adjusted `database` module accordingly. Fixes #18 --- ubisync-lib/src/lib.rs | 1 - ubisync-lib/src/types/mod.rs | 3 ++ ubisync-lib/src/{ => types}/peer.rs | 12 +++-- ubisync/src/comm/message_processor.rs | 4 +- ubisync/src/lib.rs | 5 +- ubisync/src/state/comm_state.rs | 3 +- .../src/state/database/collections/peers.rs | 51 ++++++++++++++----- .../database/collections/pot_memberships.rs | 1 - ubisync/src/state/mod.rs | 3 +- 9 files changed, 53 insertions(+), 30 deletions(-) rename ubisync-lib/src/{ => types}/peer.rs (83%) diff --git a/ubisync-lib/src/lib.rs b/ubisync-lib/src/lib.rs index b06f1fb..1ac89c4 100644 --- a/ubisync-lib/src/lib.rs +++ b/ubisync-lib/src/lib.rs @@ -1,4 +1,3 @@ pub mod api; pub mod messages; -pub mod peer; pub mod types; diff --git a/ubisync-lib/src/types/mod.rs b/ubisync-lib/src/types/mod.rs index ecdda15..700cca7 100644 --- a/ubisync-lib/src/types/mod.rs +++ b/ubisync-lib/src/types/mod.rs @@ -22,6 +22,9 @@ pub use message_id::MessageId; mod peer_id; pub use peer_id::PeerId; +mod peer; +pub use peer::Peer; + mod pot_id; pub use pot_id::PotId; diff --git a/ubisync-lib/src/peer.rs b/ubisync-lib/src/types/peer.rs similarity index 83% rename from ubisync-lib/src/peer.rs rename to ubisync-lib/src/types/peer.rs index 51c3bfe..2306403 100644 --- a/ubisync-lib/src/peer.rs +++ b/ubisync-lib/src/types/peer.rs @@ -5,19 +5,21 @@ use serde::{Deserialize, Serialize}; use crate::types::PeerId; +use super::Family; + #[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] pub struct Peer { id: PeerId, name: Option, - family: Vec, + family: Option, } impl Peer { - pub fn new(id: PeerId, name: Option) -> Self { + pub fn new(id: PeerId, name: Option, family: Option) -> Self { Peer { - id: id, - name: name, - family: vec![], + id, + name, + family, } } diff --git a/ubisync/src/comm/message_processor.rs b/ubisync/src/comm/message_processor.rs index 97753a6..4e2dd5f 100644 --- a/ubisync/src/comm/message_processor.rs +++ b/ubisync/src/comm/message_processor.rs @@ -1,6 +1,6 @@ use tracing::debug; -use ubisync_lib::peer::Peer; +use ubisync_lib::types::Peer; use ubisync_lib::types::{ContentUpdateStrategy, PeerId}; use ubisync_lib::messages::{Message, MessageContent}; @@ -19,7 +19,7 @@ pub fn handle(state: &CommState, peer: &PeerId, message: Message) { match message.content() { MessageContent::Hello { peer_name } => { 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"); } MessageContent::JoinFamily => state.request_family_join(peer.to_owned()), diff --git a/ubisync/src/lib.rs b/ubisync/src/lib.rs index 3bfd88a..5cea11f 100644 --- a/ubisync/src/lib.rs +++ b/ubisync/src/lib.rs @@ -10,8 +10,7 @@ use state::{ApiState, CommState, State}; use ubisync_lib::{ messages::{Message, MessageContent}, - peer::Peer, - types::{AppId, Family, PeerId, PotId}, + types::{AppId, Family, Peer, PeerId, PotId}, }; pub mod api; @@ -69,7 +68,7 @@ impl Ubisync { pub fn add_peer_from_id(&self, id: PeerId) -> anyhow::Result<()> { // 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<()> { diff --git a/ubisync/src/state/comm_state.rs b/ubisync/src/state/comm_state.rs index 045eedc..3c24f5b 100644 --- a/ubisync/src/state/comm_state.rs +++ b/ubisync/src/state/comm_state.rs @@ -4,10 +4,9 @@ use tracing::debug; use ubisync_lib::{ api::events::AppEvent, - peer::Peer, types::{ ContentUpdateStrategy, Element, ElementContent, ElementId, Family, FamilyId, MessageId, - PeerId, PotId, + Peer, PeerId, PotId, }, }; diff --git a/ubisync/src/state/database/collections/peers.rs b/ubisync/src/state/database/collections/peers.rs index 074302b..db655ab 100644 --- a/ubisync/src/state/database/collections/peers.rs +++ b/ubisync/src/state/database/collections/peers.rs @@ -1,3 +1,5 @@ +use std::ops::Deref; + use anyhow::{anyhow, Error}; use bonsaidb::{ core::schema::{Collection, SerializedCollection}, @@ -5,7 +7,7 @@ use bonsaidb::{ }; use itertools::Itertools; 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}; @@ -17,17 +19,12 @@ pub(super) struct DbPeer { pub(super) name: Option, } -impl From for Peer { - fn from(value: DbPeer) -> Self { - Peer::new((*value.id).clone(), value.name) - } -} - pub(crate) struct Peers<'a> { parent: &'a StateDB, db: &'a Database, } + impl<'a> Peers<'a> { pub const fn new(parent: &'a StateDB, bonsai: &'a Database) -> Self { Self { parent, db: bonsai } @@ -50,8 +47,15 @@ impl<'a> Peers<'a> { } pub fn get(&self, id: PeerId) -> anyhow::Result> { + 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) - .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)) } @@ -61,7 +65,22 @@ impl<'a> Peers<'a> { .map(|peers| { peers .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() }) .map_err(|e| anyhow!(e)) @@ -78,7 +97,7 @@ impl<'a> Peers<'a> { #[cfg(test)] mod tests { - use ubisync_lib::{peer::Peer, types::PeerId}; + use ubisync_lib::types::{Peer, PeerId}; use crate::state::database::StateDB; @@ -86,7 +105,7 @@ mod tests { fn add_get() { 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(); let retrieved_peer = db.peers().get(peer.id()).unwrap(); @@ -98,7 +117,7 @@ mod tests { fn get_all() { 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(); let all_peers = db.peers().get_all().unwrap(); @@ -109,7 +128,7 @@ mod tests { fn set_peer_name() { 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() .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(); 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 ) } diff --git a/ubisync/src/state/database/collections/pot_memberships.rs b/ubisync/src/state/database/collections/pot_memberships.rs index 8c2c7fb..f121e88 100644 --- a/ubisync/src/state/database/collections/pot_memberships.rs +++ b/ubisync/src/state/database/collections/pot_memberships.rs @@ -9,7 +9,6 @@ use bonsaidb::{ }; use itertools::Itertools; use serde::{Deserialize, Serialize}; -use tracing::debug; use ubisync_lib::types::{AppId, PotId}; use crate::state::database::{as_key::AsKey, StateDB}; diff --git a/ubisync/src/state/mod.rs b/ubisync/src/state/mod.rs index 639e93d..5f716bb 100644 --- a/ubisync/src/state/mod.rs +++ b/ubisync/src/state/mod.rs @@ -9,8 +9,7 @@ use std::{ use ubisync_lib::{ api::events::AppEvent, messages::{Message, MessageContent}, - peer::Peer, - types::{AppId, Element, ElementContent, ElementId, Family, FamilyId, PeerId, PotId, Tag}, + types::{AppId, Element, ElementContent, ElementId, Family, FamilyId, Peer, PeerId, PotId, Tag}, }; use anyhow::Error;