feat(otter): add working user removal route
parent
b946e1ce98
commit
5017bd1c5f
|
@ -14,4 +14,8 @@ impl<'a> AdminRepository<'a> {
|
|||
) -> Result<Vec<models::User>, AuthErr> {
|
||||
self.store.paginated_users(page, filter)
|
||||
}
|
||||
|
||||
pub fn remove_user(&self, id: i64) -> Result<bool, AuthErr> {
|
||||
self.store.remove_user(id)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -54,6 +54,9 @@ pub trait GpodderAuthStore {
|
|||
/// Update the user with the included ID with the new values
|
||||
fn update_user(&self, user: User) -> Result<User, AuthErr>;
|
||||
|
||||
/// Remove the user with the given ID
|
||||
fn remove_user(&self, id: i64) -> Result<bool, AuthErr>;
|
||||
|
||||
/// Create a new session for a user with the given session ID
|
||||
///
|
||||
/// The `last_seen` timestamp's precision should be at least accurate to the second
|
||||
|
|
|
@ -81,6 +81,16 @@ impl gpodder::GpodderAuthStore for SqliteRepository {
|
|||
.map_err(DbError::from)?)
|
||||
}
|
||||
|
||||
fn remove_user(&self, id: i64) -> Result<bool, AuthErr> {
|
||||
let conn = &mut self.pool.get().map_err(DbError::from)?;
|
||||
|
||||
match diesel::delete(users::table.filter(users::id.eq(id))).execute(conn) {
|
||||
Ok(0) => Ok(false),
|
||||
Ok(_) => Ok(true),
|
||||
Err(err) => Err(DbError::from(err).into()),
|
||||
}
|
||||
}
|
||||
|
||||
fn get_session(&self, session_id: i64) -> Result<Option<gpodder::models::Session>, AuthErr> {
|
||||
match sessions::table
|
||||
.inner_join(users::table)
|
||||
|
|
|
@ -17,6 +17,7 @@ use crate::{
|
|||
pub fn router(ctx: Context) -> Router<Context> {
|
||||
Router::new()
|
||||
.route("/users", get(get_users))
|
||||
.route("/users/{id}", delete(delete_user))
|
||||
.route_layer(axum::middleware::from_fn_with_state(
|
||||
ctx.clone(),
|
||||
super::auth::auth_web_middleware,
|
||||
|
@ -70,3 +71,20 @@ async fn get_users(
|
|||
.authenticated(true)
|
||||
.response(&ctx.tera))
|
||||
}
|
||||
|
||||
async fn delete_user(
|
||||
State(ctx): State<Context>,
|
||||
Extension(session): Extension<gpodder::Session>,
|
||||
Path(id): Path<i64>,
|
||||
) -> AppResult<()> {
|
||||
let deleted =
|
||||
tokio::task::spawn_blocking(move || ctx.store.admin(&session.user)?.remove_user(id))
|
||||
.await
|
||||
.unwrap()?;
|
||||
|
||||
if deleted {
|
||||
Ok(())
|
||||
} else {
|
||||
Err(AppError::NotFound)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue