fix: ensure server ID is fanned out with role ranks update

fix: ensure original order is correctly sorted on edit route
This commit is contained in:
izzy
2025-06-08 10:50:55 +01:00
parent 4e4e598daf
commit 73b576a75f
3 changed files with 21 additions and 6 deletions

View File

@@ -166,7 +166,7 @@ pub enum EventV1 {
ServerRoleDelete { id: String, role_id: String },
/// Server roles ranks updated
ServerRoleRanksUpdate { ranks: Vec<String> },
ServerRoleRanksUpdate { id: String, ranks: Vec<String> },
/// Update existing user
UserUpdate {

View File

@@ -228,6 +228,13 @@ impl Server {
}
}
/// Ordered roles list
pub fn ordered_roles(&self) -> Vec<(String, Role)> {
let mut ordered_roles = self.roles.clone().into_iter().collect::<Vec<_>>();
ordered_roles.sort_by(|(_, role_a), (_, role_b)| role_a.rank.cmp(&role_b.rank));
ordered_roles
}
/// Set role permission on a server
pub async fn set_role_permission(
&mut self,
@@ -275,9 +282,12 @@ impl Server {
.await?;
// Publish bulk update event
EventV1::ServerRoleRanksUpdate { ranks: new_order }
.p(self.id.clone())
.await;
EventV1::ServerRoleRanksUpdate {
id: self.id.clone(),
ranks: new_order,
}
.p(self.id.clone())
.await;
Ok(())
}

View File

@@ -26,7 +26,12 @@ pub async fn edit_role_ranks(
.await
.throw_if_lacking_channel_permission(ChannelPermission::ManageRole)?;
let existing_order = server.roles.keys().cloned().collect::<Vec<_>>();
let existing_order = server
.ordered_roles()
.into_iter()
.map(|(id, _)| id)
.collect::<Vec<_>>();
let new_order = data.ranks.clone().into_iter().collect::<Vec<_>>();
// Verify all roles are in the new ordering
@@ -36,7 +41,7 @@ pub async fn edit_role_ranks(
return Err(create_error!(InvalidOperation));
}
// Don't have to check what the user cant modify if they are the server owner
// Don't have to check what the user can't modify if they are the server owner
if server.owner != user.id {
let member_top_rank = query.get_member_rank();