From b4f471d6e6408cfa85d09a8973f2815252dc4d24 Mon Sep 17 00:00:00 2001 From: Paul Makles <paulmakles@gmail.com> Date: Sat, 11 Apr 2020 22:43:39 +0100 Subject: [PATCH] Add guild remove / delete. --- src/routes/guild.rs | 92 +++++++++++++++++++++++++++++++++++++++++++++ src/routes/mod.rs | 1 + 2 files changed, 93 insertions(+) diff --git a/src/routes/guild.rs b/src/routes/guild.rs index ee79711..e44b3da 100644 --- a/src/routes/guild.rs +++ b/src/routes/guild.rs @@ -129,6 +129,98 @@ pub fn guild(user: UserRef, target: GuildRef) -> Option<Response> { } } +/// delete or leave a guild +#[delete("/<target>")] +pub fn remove_guild(user: UserRef, target: GuildRef) -> Option<Response> { + with_permissions!(user, target); + + if user.id == target.owner { + let channels = database::get_collection("channels"); + if let Ok(result) = channels.find( + doc! { + "type": 2, + "guild": &target.id + }, + FindOptions::builder().projection(doc! { "_id": 1 }).build(), + ) { + let mut values = vec![]; + for item in result { + if let Ok(doc) = item { + values.push(Bson::String(doc.get_str("_id").unwrap().to_string())); + } + } + + if database::get_collection("messages") + .delete_many( + doc! { + "channel": { + "$in": values + } + }, + None, + ) + .is_ok() + { + if channels + .delete_many( + doc! { + "type": 2, + "guild": &target.id, + }, + None, + ) + .is_ok() + { + if database::get_collection("guilds") + .delete_one( + doc! { + "_id": &target.id + }, + None, + ) + .is_ok() + { + Some(Response::Result(super::Status::Ok)) + } else { + Some(Response::InternalServerError( + json!({ "error": "Failed to delete guild." }), + )) + } + } else { + Some(Response::InternalServerError( + json!({ "error": "Failed to delete guild channels." }), + )) + } + } else { + Some(Response::InternalServerError( + json!({ "error": "Failed to delete guild messages." }), + )) + } + } else { + Some(Response::InternalServerError( + json!({ "error": "Could not fetch channels." }), + )) + } + } else { + if database::get_collection("members") + .delete_one( + doc! { + "_id.guild": &target.id, + "_id.user": &user.id, + }, + None, + ) + .is_ok() + { + Some(Response::Result(super::Status::Ok)) + } else { + Some(Response::InternalServerError( + json!({ "error": "Failed to remove you from the guild." }), + )) + } + } +} + #[derive(Serialize, Deserialize)] pub struct CreateChannel { nonce: String, diff --git a/src/routes/mod.rs b/src/routes/mod.rs index c847d79..2493df4 100644 --- a/src/routes/mod.rs +++ b/src/routes/mod.rs @@ -106,6 +106,7 @@ pub fn mount(rocket: Rocket) -> Rocket { routes![ guild::my_guilds, guild::guild, + guild::remove_guild, guild::create_channel, guild::create_invite, guild::remove_invite, -- GitLab