This commit is contained in:
2026-07-31 11:04:34 +02:00
parent 086e5ab0ea
commit 621f8cefa0
9 changed files with 165 additions and 46 deletions
+27 -16
View File
@@ -1,11 +1,11 @@
use crate::core::state::AppState;
use crate::http::context::Superuser;
use crate::http::error::HTTPError;
use crate::repositories::types::{ChannelFilter, ServerTree};
use crate::domain::dto::server::{
CreateServerRequest, ServerResponse, ServerRolePermissionResponse,
CreateServerRequest, ServerResponse, ServerRolePermissionResponse, ServerTreeResponse,
ServerUserPermissionResponse, SetServerPermissionRequest, UpdateServerRequest,
};
use crate::http::context::Superuser;
use crate::http::error::HTTPError;
use crate::repositories::types::ChannelFilter;
use crate::routes::server::mapper;
use axum::{
Json,
@@ -83,7 +83,11 @@ pub async fn create(
State(state): State<AppState>,
Json(payload): Json<CreateServerRequest>,
) -> Result<(StatusCode, Json<ServerResponse>), HTTPError> {
let server = state.services.server.create_server(payload.name, payload.is_default).await?;
let server = state
.services
.server
.create_server(payload.name, payload.is_default)
.await?;
Ok((
StatusCode::CREATED,
Json(mapper::server_model_to_server_response(server)),
@@ -122,7 +126,11 @@ pub async fn update(
.await?
.ok_or(HTTPError::NotFound)?;
let server = state.services.server.update_server(id, payload.name, payload.is_default).await?;
let server = state
.services
.server
.update_server(id, payload.name, payload.is_default)
.await?;
Ok(Json(mapper::server_model_to_server_response(server)))
}
@@ -364,39 +372,42 @@ pub async fn remove_role_permission(
#[utoipa::path(
get,
path = "/servers/{id}/tree",
path = "/servers/{server_id}/tree",
responses(
(status = 200, description = "Arborescence du serveur récupérée avec succès"),
(status = 404, description = "Serveur introuvable"),
(status = 500, description = "Erreur interne du serveur")
),
params(
("id" = Uuid, Path, description = "ID du serveur")
("server_id" = Uuid, Path, description = "ID du serveur")
),
tag = "Servers"
)]
pub async fn get_server_tree(
pub async fn get_tree(
State(state): State<AppState>,
Path(id): Path<Uuid>,
) -> Result<Json<ServerTree>, HTTPError> {
Path(server_id): Path<Uuid>,
) -> Result<Json<ServerTreeResponse>, HTTPError> {
// Vérifier l'existence du serveur
state
.repositories
.server
.get_by_id(id)
.get_by_id(server_id)
.await?
.ok_or(HTTPError::NotFound)?;
// Exécution parallèle des 3 requêtes via leurs repositories respectifs
let (orders, channels, categories) = tokio::try_join!(
state.repositories.server_item_order.get_by_server(id),
state
.repositories
.server_item_order
.get_by_server(server_id),
state.repositories.channel.filter(ChannelFilter {
server_id: Some(id)
server_id: Some(server_id)
}),
state.repositories.category.get_by_server(id),
state.repositories.category.get_by_server(server_id),
)?;
// Assemblage du ServerTree via le mapper
// Assemblage du ServerTreeResponse via le mapper
let tree = mapper::build_server_tree(orders, channels, categories);
Ok(Json(tree))