From e22d9919952855670ab5323e3ca19bdfd6032485 Mon Sep 17 00:00:00 2001 From: Paul Makles Date: Thu, 10 Feb 2022 22:13:10 +0000 Subject: [PATCH] feat(servers): ban routes --- src/routes/servers/ban_create.rs | 41 +++++++++++++++++++++++++++----- src/routes/servers/ban_list.rs | 25 ++++++++++++------- src/routes/servers/ban_remove.rs | 24 ++++++++++++------- 3 files changed, 68 insertions(+), 22 deletions(-) diff --git a/src/routes/servers/ban_create.rs b/src/routes/servers/ban_create.rs index 5cc8e75e..1ce84650 100644 --- a/src/routes/servers/ban_create.rs +++ b/src/routes/servers/ban_create.rs @@ -1,6 +1,8 @@ -use revolt_quark::{EmptyResponse, Result}; +use revolt_quark::{ + models::{ServerBan, User}, + perms, Db, Error, Ref, Result, ServerPermission, +}; -use mongodb::bson::doc; use rocket::serde::json::Json; use serde::{Deserialize, Serialize}; use validator::Validate; @@ -13,9 +15,36 @@ pub struct Data { #[put("//bans/", data = "")] pub async fn req( - /*user: UserRef, server: Ref, target: Ref,*/ server: String, - target: String, + db: &Db, + user: User, + server: Ref, + target: Ref, data: Json, -) -> Result { - todo!() +) -> Result> { + let data = data.into_inner(); + data.validate() + .map_err(|error| Error::FailedValidation { error })?; + + let server = server.as_server(db).await?; + if !perms(&user) + .server(&server) + .calc_server(db) + .await + .get_ban_members() + { + return Err(Error::MissingPermission { + permission: ServerPermission::BanMembers as i32, + }); + } + + let member = target.as_member(db, &server.id).await?; + // ! FIXME: calculate permission against member + + let ban = ServerBan { + id: member.id, + reason: data.reason, + }; + + db.insert_ban(&ban).await?; + Ok(Json(ban)) } diff --git a/src/routes/servers/ban_list.rs b/src/routes/servers/ban_list.rs index 252b4536..89e4b494 100644 --- a/src/routes/servers/ban_list.rs +++ b/src/routes/servers/ban_list.rs @@ -1,10 +1,7 @@ -use revolt_quark::models::File; -use revolt_quark::{Error, Result}; +use revolt_quark::models::{File, User, ServerBan}; +use revolt_quark::{perms, Db, Error, Ref, Result, ServerPermission}; -use futures::StreamExt; -use mongodb::bson::{doc, from_document}; -use mongodb::options::FindOptions; -use rocket::serde::json::Value; +use rocket::serde::json::Json; use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize)] @@ -15,6 +12,18 @@ struct BannedUser { } #[get("//bans")] -pub async fn req(/*user: UserRef, target: Ref*/ target: String) -> Result { - todo!() +pub async fn req(db: &Db, user: User, target: Ref) -> Result>> { + let server = target.as_server(db).await?; + if !perms(&user) + .server(&server) + .calc_server(db) + .await + .get_ban_members() + { + return Err(Error::MissingPermission { + permission: ServerPermission::BanMembers as i32, + }); + } + + db.fetch_bans(&server.id).await.map(Json) } diff --git a/src/routes/servers/ban_remove.rs b/src/routes/servers/ban_remove.rs index 2ed8642c..0ea3addb 100644 --- a/src/routes/servers/ban_remove.rs +++ b/src/routes/servers/ban_remove.rs @@ -1,11 +1,19 @@ -use revolt_quark::{EmptyResponse, Result}; - -use mongodb::bson::doc; +use revolt_quark::{models::User, perms, Db, EmptyResponse, Error, Ref, Result, ServerPermission}; #[delete("//bans/")] -pub async fn req( - /*user: UserRef, server: Ref, target: Ref*/ server: String, - target: String, -) -> Result { - todo!() +pub async fn req(db: &Db, user: User, server: Ref, target: Ref) -> Result { + let server = server.as_server(db).await?; + if !perms(&user) + .server(&server) + .calc_server(db) + .await + .get_ban_members() + { + return Err(Error::MissingPermission { + permission: ServerPermission::BanMembers as i32, + }); + } + + let ban = target.as_ban(db, &server.id).await?; + db.delete_ban(&ban.id).await.map(|_| EmptyResponse) }