Improved Peer type, adjusted database module accordingly. Fixes #18

This commit is contained in:
Philip (a-0) 2024-04-04 22:56:50 +02:00
parent f2c9fe48a1
commit 4ca9ffaa0e
9 changed files with 53 additions and 30 deletions

View file

@ -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;

View file

@ -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;

View file

@ -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,
} }
} }

View file

@ -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()),

View file

@ -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<()> {

View file

@ -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,
}, },
}; };

View file

@ -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
) )
} }

View file

@ -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};

View file

@ -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;