Implement remove members from user route
This commit is contained in:
parent
69259667bd
commit
6395df6cec
@ -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(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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(())
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user