61 lines
1.6 KiB
Rust
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)))
|
|
}
|