Files
diplom/src/web/route/server/delete.rs
2025-05-17 23:52:20 +03:00

61 lines
1.6 KiB
Rust

use axum::Json;
use axum::extract::{Path, State};
use axum::response::IntoResponse;
use crate::state::AppState;
use crate::web::context::UserContext;
use crate::web::ws;
use crate::webrtc::WebRtcSignal;
use crate::{entity, web};
use crate::web::entity::server::Server;
pub async fn delete(
State(state): State<AppState>,
context: UserContext,
Path(server_id): Path<entity::server::Id>,
) -> web::Result<impl IntoResponse> {
let server = state.database.select_server_by_id(server_id).await?;
if server.owner_id != context.user_id {
return Err(web::error::ClientError::NotAllowed.into());
}
let members = state
.database
.select_server_members(server_id)
.await?
.iter()
.map(|u| u.id)
.collect::<Vec<_>>();
let channels = state
.database
.select_server_channels(server_id)
.await?
.iter()
.map(|c| c.id)
.collect::<Vec<_>>();
let state_clone = state.clone();
tokio::spawn(async move {
let voice_rooms = state_clone.voice_rooms.read().await;
for channel_id in channels {
if let Some(voice_room) = voice_rooms.get(&channel_id) {
let _ = voice_room.send(WebRtcSignal::Close);
}
}
});
let server = state.database.delete_server_by_id(server_id).await?;
ws::gateway::util::send_message_many(
state.clone(),
&members,
ws::gateway::event::Event::RemoveServer {
server_id: server.id,
},
);
Ok(Json(Server::from(server)))
}