Implement remove members from user route

This commit is contained in:
xeovalyte 2025-02-19 13:40:02 +01:00
parent 69259667bd
commit 6395df6cec
Signed by: xeovalyte
SSH Key Fingerprint: SHA256:GWI1hq+MNKR2UOcvk7n9tekASXT8vyazK7vDF9Xyciw
2 changed files with 49 additions and 1 deletions

View File

@ -157,4 +157,31 @@ impl UserMember {
Ok(members) Ok(members)
} }
pub async fn remove_many(
transaction: &mut sqlx::Transaction<'_, Postgres>,
user_ids: &[uuid::Uuid],
member_ids: &[String],
) -> Result<(), sqlx::Error> {
let deleted_count = sqlx::query_scalar!(
"
WITH deleted AS (
DELETE FROM users_members
WHERE user_id = ANY($1) AND member_id = ANY($2)
RETURNING 1
)
SELECT COUNT(*) FROM deleted
",
&user_ids[..],
&member_ids[..]
)
.fetch_one(&mut **transaction)
.await?;
if !deleted_count.is_some_and(|c| c >= 1) {
return Err(sqlx::Error::RowNotFound);
}
Ok(())
}
} }

View File

@ -1,7 +1,7 @@
use axum::{ use axum::{
extract::{Path, State}, extract::{Path, State},
http::HeaderMap, http::HeaderMap,
routing::{get, post}, routing::{delete, get, post},
Json, Router, Json, Router,
}; };
@ -17,6 +17,7 @@ pub fn routes() -> Router<AppState> {
Router::new() Router::new()
.route("/user", get(get_current_user)) .route("/user", get(get_current_user))
.route("/user/{user_id}/members", post(members_insert)) .route("/user/{user_id}/members", post(members_insert))
.route("/user/{user_id}/members", delete(members_remove))
} }
pub async fn get_current_user( pub async fn get_current_user(
@ -52,3 +53,23 @@ pub async fn members_insert(
Ok(Json(convert_vec(members))) Ok(Json(convert_vec(members)))
} }
pub async fn members_remove(
State(state): State<AppState>,
Path(user_id): Path<String>,
headers: HeaderMap,
Json(member_ids): Json<Vec<String>>,
) -> Result<(), crate::Error> {
let user = get_user_from_header(&state.pool, &headers).await?;
user.authorize(&state.pool, Some(Roles::ADMIN), Some(user_id))
.await?;
let mut transaction = state.pool.begin().await?;
// Link the user to the members
DbUserMember::remove_many(&mut transaction, &[user.id], &member_ids).await?;
transaction.commit().await?;
Ok(())
}