From 73b576a75f66717a31c4f2506460db6611318614 Mon Sep 17 00:00:00 2001 From: izzy Date: Sun, 8 Jun 2025 10:50:55 +0100 Subject: [PATCH] fix: ensure server ID is fanned out with role ranks update fix: ensure original order is correctly sorted on edit route --- crates/core/database/src/events/client.rs | 2 +- crates/core/database/src/models/servers/model.rs | 16 +++++++++++++--- .../src/routes/servers/roles_edit_positions.rs | 9 +++++++-- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/crates/core/database/src/events/client.rs b/crates/core/database/src/events/client.rs index 2d0829a4..a887e9f1 100644 --- a/crates/core/database/src/events/client.rs +++ b/crates/core/database/src/events/client.rs @@ -166,7 +166,7 @@ pub enum EventV1 { ServerRoleDelete { id: String, role_id: String }, /// Server roles ranks updated - ServerRoleRanksUpdate { ranks: Vec }, + ServerRoleRanksUpdate { id: String, ranks: Vec }, /// Update existing user UserUpdate { diff --git a/crates/core/database/src/models/servers/model.rs b/crates/core/database/src/models/servers/model.rs index 150f4f53..eea8f392 100644 --- a/crates/core/database/src/models/servers/model.rs +++ b/crates/core/database/src/models/servers/model.rs @@ -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::>(); + 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(()) } diff --git a/crates/delta/src/routes/servers/roles_edit_positions.rs b/crates/delta/src/routes/servers/roles_edit_positions.rs index 492f2511..16fae2b5 100644 --- a/crates/delta/src/routes/servers/roles_edit_positions.rs +++ b/crates/delta/src/routes/servers/roles_edit_positions.rs @@ -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::>(); + let existing_order = server + .ordered_roles() + .into_iter() + .map(|(id, _)| id) + .collect::>(); + let new_order = data.ranks.clone().into_iter().collect::>(); // 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();