This commit is contained in:
2026-07-28 02:11:10 +02:00
parent c29e38d2dc
commit 96ffe27040
3 changed files with 105 additions and 2 deletions
+56 -1
View File
@@ -1,9 +1,13 @@
use crate::models::{server, server_role_permission, server_user_permission};
use crate::models::{
category, channel, server, server_item_order, server_role_permission, server_user_permission,
};
use crate::repositories::types::{ServerExplorerItem, ServerTree};
use crate::routes::server::dto::{
CreateServerRequest, ServerResponse, ServerRolePermissionResponse,
ServerUserPermissionResponse, UpdateServerRequest,
};
use sea_orm::Set;
use std::collections::HashMap;
use uuid::Uuid;
pub fn server_model_to_server_response(model: server::Model) -> ServerResponse {
@@ -57,3 +61,54 @@ pub fn server_role_permission_to_response(
permissions: model.permissions as u64,
}
}
pub fn build_server_tree(
orders: Vec<server_item_order::Model>,
channels: Vec<channel::Model>,
categories: Vec<category::Model>,
) -> ServerTree {
// Map d'accès rapide : resource_id -> order_key
let order_map: HashMap<Uuid, i64> = orders
.into_iter()
.map(|o| (o.resource_id, o.order_key))
.collect();
// Regrouper les canaux par catégorie ou orphelins
let mut category_channels: HashMap<Uuid, Vec<channel::Model>> = HashMap::new();
let mut orphan_channels: Vec<channel::Model> = Vec::new();
for chan in channels {
if let Some(cat_id) = chan.category_id {
category_channels.entry(cat_id).or_default().push(chan);
} else {
orphan_channels.push(chan);
}
}
// Trier les canaux dans chaque catégorie par leur order_key
for chans in category_channels.values_mut() {
chans.sort_by_key(|c| order_map.get(&c.id).copied().unwrap_or(i64::MAX));
}
// Préparer les éléments racine (catégories & canaux orphelins) avec leur order_key
let mut root_items: Vec<(ServerExplorerItem, i64)> = Vec::new();
for cat in categories {
let cat_id = cat.id;
let order_key = order_map.get(&cat_id).copied().unwrap_or(i64::MAX);
let chans = category_channels.remove(&cat_id).unwrap_or_default();
root_items.push((ServerExplorerItem::Category(cat, chans), order_key));
}
for chan in orphan_channels {
let order_key = order_map.get(&chan.id).copied().unwrap_or(i64::MAX);
root_items.push((ServerExplorerItem::Channel(chan), order_key));
}
// Tri du niveau racine par order_key
root_items.sort_by_key(|(_, order_key)| *order_key);
let items = root_items.into_iter().map(|(item, _)| item).collect();
ServerTree { items }
}