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,