use revolt_quark::{ models::{ServerBan, User}, perms, Db, Error, Permission, Ref, Result, }; use rocket::serde::json::Json; use serde::{Deserialize, Serialize}; use validator::Validate; #[derive(Validate, Serialize, Deserialize)] pub struct Data { #[validate(length(min = 1, max = 1024))] reason: Option, } #[put("//bans/", data = "")] pub async fn req( db: &Db, user: User, server: Ref, target: Ref, data: Json, ) -> 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(db) .await .can_ban_members() { return Error::from_permission(Permission::BanMembers); } let member = target.as_member(db, &server.id).await?; // ! FIXME_PERMISSIONS let ban = ServerBan { id: member.id, reason: data.reason, }; db.insert_ban(&ban).await?; Ok(Json(ban)) }