Compare commits

...

2 commits

Author SHA1 Message Date
0e0c590e4d feat: added unband endpoint
All checks were successful
ci/woodpecker/push/build-and-publish Pipeline was successful
ci/woodpecker/pr/build-and-publish Pipeline was successful
2025-07-24 02:14:29 +02:00
ba2442e786 style: updated to use the new ban object 2025-07-24 02:13:53 +02:00
3 changed files with 26 additions and 15 deletions

View file

@ -25,8 +25,8 @@ pub async fn get(
let mut conn = app_state.pool.get().await?; let mut conn = app_state.pool.get().await?;
let member = Member::check_membership(&mut conn, uuid, guild_uuid).await?; let caller = Member::check_membership(&mut conn, uuid, guild_uuid).await?;
member caller
.check_permission(&app_state, Permissions::BanMember) .check_permission(&app_state, Permissions::BanMember)
.await?; .await?;
@ -34,3 +34,22 @@ pub async fn get(
Ok((StatusCode::OK, Json(all_guild_bans))) Ok((StatusCode::OK, Json(all_guild_bans)))
} }
pub async fn unban(
State(app_state): State<Arc<AppState>>,
Path((guild_uuid, user_uuid)): Path<(Uuid, Uuid)>,
Extension(CurrentUser(uuid)): Extension<CurrentUser<Uuid>>,
) -> Result<impl IntoResponse, Error> {
global_checks(&app_state, uuid).await?;
let mut conn = app_state.pool.get().await?;
let caller = Member::check_membership(&mut conn, uuid, guild_uuid).await?;
caller.check_permission(&app_state, Permissions::BanMember).await?;
let ban = GuildBan::fetch_one(&mut conn, guild_uuid, user_uuid).await?;
ban.unban(&mut conn).await?;
Ok(StatusCode::OK)
}

View file

@ -7,7 +7,7 @@ use axum::{
extract::{Multipart, Path, State}, extract::{Multipart, Path, State},
http::StatusCode, http::StatusCode,
response::IntoResponse, response::IntoResponse,
routing::{get, patch, post}, routing::{get, patch, post, delete},
}; };
use bytes::Bytes; use bytes::Bytes;
use uuid::Uuid; use uuid::Uuid;
@ -45,6 +45,7 @@ pub fn router() -> Router<Arc<AppState>> {
.route("/members", get(members::get)) .route("/members", get(members::get))
// Bans // Bans
.route("/bans", get(bans::get)) .route("/bans", get(bans::get))
.route("/bans/{uuid}", delete(bans::unban))
} }
/// `GET /api/v1/guilds/{uuid}` DESCRIPTION /// `GET /api/v1/guilds/{uuid}` DESCRIPTION

View file

@ -6,11 +6,7 @@ use serde::{Deserialize, Serialize};
use uuid::Uuid; use uuid::Uuid;
use crate::{ use crate::{
AppState, Conn, error::Error, objects::{GuildBan, Me, Permissions, Role}, schema::{guild_bans, guild_members}, AppState, Conn
error::Error,
objects::{Me, Permissions, Role},
schema::guild_bans,
schema::guild_members,
}; };
use super::{User, load_or_empty}; use super::{User, load_or_empty};
@ -169,15 +165,10 @@ impl Member {
) -> Result<Self, Error> { ) -> Result<Self, Error> {
let mut conn = app_state.pool.get().await?; let mut conn = app_state.pool.get().await?;
use guild_bans::dsl; let banned = GuildBan::fetch_one(&mut conn, guild_uuid, user_uuid).await;
let banned = dsl::guild_bans
.filter(guild_bans::guild_uuid.eq(guild_uuid))
.filter(guild_bans::user_uuid.eq(user_uuid))
.execute(&mut conn)
.await;
match banned { match banned {
Ok(_) => Err(Error::Forbidden("User banned".to_string())), Ok(_) => Err(Error::Forbidden("User banned".to_string())),
Err(diesel::result::Error::NotFound) => Ok(()), Err(Error::SqlError(diesel::result::Error::NotFound)) => Ok(()),
Err(e) => Err(e.into()), Err(e) => Err(e.into()),
}?; }?;