From a01eb7ce9bc3931d60524c0f7198f170d3c6ceff Mon Sep 17 00:00:00 2001 From: Naomi Plasterer Date: Mon, 1 Jul 2024 11:28:24 -0700 Subject: [PATCH 1/4] first pass at exposing description bindings --- bindings_ffi/src/mls.rs | 3 ++ bindings_node/src/conversations.rs | 2 ++ xmtp_mls/src/groups/group_mutable_metadata.rs | 2 +- xmtp_mls/src/groups/intents.rs | 7 ++++ xmtp_mls/src/groups/mod.rs | 36 +++++++++++++++++++ 5 files changed, 49 insertions(+), 1 deletion(-) diff --git a/bindings_ffi/src/mls.rs b/bindings_ffi/src/mls.rs index 68d89996b..b1daefc5b 100644 --- a/bindings_ffi/src/mls.rs +++ b/bindings_ffi/src/mls.rs @@ -638,6 +638,7 @@ pub struct FfiCreateGroupOptions { pub permissions: Option, pub group_name: Option, pub group_image_url_square: Option, + pub group_description: Option, } impl FfiCreateGroupOptions { @@ -645,6 +646,7 @@ impl FfiCreateGroupOptions { GroupMetadataOptions { name: self.group_name, image_url_square: self.group_image_url_square, + description: self.group_description, } } } @@ -1538,6 +1540,7 @@ mod tests { permissions: Some(FfiGroupPermissionsOptions::AdminOnly), group_name: Some("Group Name".to_string()), group_image_url_square: Some("url".to_string()), + group_description: Some("group description".to_string()) }, ) .await diff --git a/bindings_node/src/conversations.rs b/bindings_node/src/conversations.rs index a57cb09e3..54c4e3839 100644 --- a/bindings_node/src/conversations.rs +++ b/bindings_node/src/conversations.rs @@ -27,6 +27,7 @@ pub struct NapiCreateGroupOptions { pub permissions: Option, pub group_name: Option, pub group_image_url_square: Option, + pub group_description: Option, } impl NapiCreateGroupOptions { @@ -34,6 +35,7 @@ impl NapiCreateGroupOptions { GroupMetadataOptions { name: self.group_name, image_url_square: self.group_image_url_square, + description: self.group_description, } } } diff --git a/xmtp_mls/src/groups/group_mutable_metadata.rs b/xmtp_mls/src/groups/group_mutable_metadata.rs index 41e4e67b7..9ff1a925d 100644 --- a/xmtp_mls/src/groups/group_mutable_metadata.rs +++ b/xmtp_mls/src/groups/group_mutable_metadata.rs @@ -89,7 +89,7 @@ impl GroupMutableMetadata { ); attributes.insert( MetadataField::Description.to_string(), - DEFAULT_GROUP_DESCRIPTION.to_string(), + opts.description.unwrap_or_else(|| DEFAULT_GROUP_DESCRIPTION.to_string()), ); attributes.insert( MetadataField::GroupImageUrlSquare.to_string(), diff --git a/xmtp_mls/src/groups/intents.rs b/xmtp_mls/src/groups/intents.rs index 832622c42..15f61c044 100644 --- a/xmtp_mls/src/groups/intents.rs +++ b/xmtp_mls/src/groups/intents.rs @@ -174,6 +174,13 @@ impl UpdateMetadataIntentData { field_value: group_image_url_square, } } + + pub fn new_update_group_description(group_description: String) -> Self { + Self { + field_name: MetadataField::Description.to_string(), + field_value: group_description, + } + } } impl From for Vec { diff --git a/xmtp_mls/src/groups/mod.rs b/xmtp_mls/src/groups/mod.rs index 5c510ae19..14940c7cc 100644 --- a/xmtp_mls/src/groups/mod.rs +++ b/xmtp_mls/src/groups/mod.rs @@ -208,6 +208,7 @@ pub struct MlsGroup { pub struct GroupMetadataOptions { pub name: Option, pub image_url_square: Option, + pub description: Option } impl Clone for MlsGroup { @@ -666,6 +667,41 @@ impl MlsGroup { } } + pub async fn update_group_description( + &self, + client: &Client, + group_description: String, + ) -> Result<(), GroupError> + where + ApiClient: XmtpApi, + { + let conn = self.context.store.conn()?; + let intent_data: Vec = + UpdateMetadataIntentData::new_update_group_description(group_description) + .into(); + let intent = conn.insert_group_intent(NewGroupIntent::new( + IntentKind::MetadataUpdate, + self.group_id.clone(), + intent_data, + ))?; + + self.sync_until_intent_resolved(conn, intent.id, client) + .await + } + + pub fn group_description(&self) -> Result { + let mutable_metadata = self.mutable_metadata()?; + match mutable_metadata + .attributes + .get(&MetadataField::Description.to_string()) + { + Some(group_description) => Ok(group_description.clone()), + None => Err(GroupError::GroupMutableMetadata( + GroupMutableMetadataError::MissingExtension, + )), + } + } + pub async fn update_group_image_url_square( &self, client: &Client, From 58b66c60c4d141436e8960fac5c04570644c3a46 Mon Sep 17 00:00:00 2001 From: Naomi Plasterer Date: Mon, 1 Jul 2024 11:41:32 -0700 Subject: [PATCH 2/4] add more bindings --- bindings_ffi/src/mls.rs | 31 ++++++++++++++++++- xmtp_mls/src/groups/group_mutable_metadata.rs | 3 +- xmtp_mls/src/groups/mod.rs | 5 ++- 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/bindings_ffi/src/mls.rs b/bindings_ffi/src/mls.rs index b1daefc5b..3140020ca 100644 --- a/bindings_ffi/src/mls.rs +++ b/bindings_ffi/src/mls.rs @@ -868,6 +868,35 @@ impl FfiGroup { Ok(group_image_url_square) } + pub async fn update_group_description( + &self, + group_description: String, + ) -> Result<(), GenericError> { + let group = MlsGroup::new( + self.inner_client.context().clone(), + self.group_id.clone(), + self.created_at_ns, + ); + + group + .update_group_description(&self.inner_client, group_description) + .await?; + + Ok(()) + } + + pub fn group_description(&self) -> Result { + let group = MlsGroup::new( + self.inner_client.context().clone(), + self.group_id.clone(), + self.created_at_ns, + ); + + let group_description = group.group_description()?; + + Ok(group_description) + } + pub fn admin_list(&self) -> Result, GenericError> { let group = MlsGroup::new( self.inner_client.context().clone(), @@ -1540,7 +1569,7 @@ mod tests { permissions: Some(FfiGroupPermissionsOptions::AdminOnly), group_name: Some("Group Name".to_string()), group_image_url_square: Some("url".to_string()), - group_description: Some("group description".to_string()) + group_description: Some("group description".to_string()), }, ) .await diff --git a/xmtp_mls/src/groups/group_mutable_metadata.rs b/xmtp_mls/src/groups/group_mutable_metadata.rs index 9ff1a925d..fa706cb1b 100644 --- a/xmtp_mls/src/groups/group_mutable_metadata.rs +++ b/xmtp_mls/src/groups/group_mutable_metadata.rs @@ -89,7 +89,8 @@ impl GroupMutableMetadata { ); attributes.insert( MetadataField::Description.to_string(), - opts.description.unwrap_or_else(|| DEFAULT_GROUP_DESCRIPTION.to_string()), + opts.description + .unwrap_or_else(|| DEFAULT_GROUP_DESCRIPTION.to_string()), ); attributes.insert( MetadataField::GroupImageUrlSquare.to_string(), diff --git a/xmtp_mls/src/groups/mod.rs b/xmtp_mls/src/groups/mod.rs index 14940c7cc..53022a9e8 100644 --- a/xmtp_mls/src/groups/mod.rs +++ b/xmtp_mls/src/groups/mod.rs @@ -208,7 +208,7 @@ pub struct MlsGroup { pub struct GroupMetadataOptions { pub name: Option, pub image_url_square: Option, - pub description: Option + pub description: Option, } impl Clone for MlsGroup { @@ -677,8 +677,7 @@ impl MlsGroup { { let conn = self.context.store.conn()?; let intent_data: Vec = - UpdateMetadataIntentData::new_update_group_description(group_description) - .into(); + UpdateMetadataIntentData::new_update_group_description(group_description).into(); let intent = conn.insert_group_intent(NewGroupIntent::new( IntentKind::MetadataUpdate, self.group_id.clone(), From 8a5a4b22c913ea4625140bcc5a9cf901c9edbac1 Mon Sep 17 00:00:00 2001 From: Naomi Plasterer Date: Mon, 1 Jul 2024 11:55:43 -0700 Subject: [PATCH 3/4] fix up some test --- bindings_ffi/src/mls.rs | 1 + xmtp_mls/src/groups/mod.rs | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/bindings_ffi/src/mls.rs b/bindings_ffi/src/mls.rs index 3140020ca..174614936 100644 --- a/bindings_ffi/src/mls.rs +++ b/bindings_ffi/src/mls.rs @@ -1579,6 +1579,7 @@ mod tests { assert_eq!(members.len(), 2); assert_eq!(group.group_name().unwrap(), "Group Name"); assert_eq!(group.group_image_url_square().unwrap(), "url"); + assert_eq!(group.group_description().unwrap(), "group description"); } #[tokio::test(flavor = "multi_thread", worker_threads = 1)] diff --git a/xmtp_mls/src/groups/mod.rs b/xmtp_mls/src/groups/mod.rs index 53022a9e8..b70aec2d2 100644 --- a/xmtp_mls/src/groups/mod.rs +++ b/xmtp_mls/src/groups/mod.rs @@ -1784,6 +1784,7 @@ mod tests { GroupMetadataOptions { name: Some("Group Name".to_string()), image_url_square: Some("url".to_string()), + description: Some("group description".to_string()), }, ) .unwrap(); @@ -1797,9 +1798,14 @@ mod tests { .attributes .get(&MetadataField::GroupImageUrlSquare.to_string()) .unwrap(); + let amal_group_description: &String = binding + .attributes + .get(&MetadataField::Description.to_string()) + .unwrap(); assert_eq!(amal_group_name, "Group Name"); assert_eq!(amal_group_image_url, "url"); + assert_eq!(amal_group_description, "group description"); } #[tokio::test(flavor = "multi_thread", worker_threads = 1)] From 7c8ca3009fc0614a3f7b13e4adda749b18f1af71 Mon Sep 17 00:00:00 2001 From: Naomi Plasterer Date: Mon, 1 Jul 2024 12:10:41 -0700 Subject: [PATCH 4/4] fix node lint --- bindings_node/src/conversations.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/bindings_node/src/conversations.rs b/bindings_node/src/conversations.rs index 54c4e3839..298a6e21e 100644 --- a/bindings_node/src/conversations.rs +++ b/bindings_node/src/conversations.rs @@ -63,6 +63,7 @@ impl NapiConversations { permissions: None, group_name: None, group_image_url_square: None, + group_description: None, }, };