From dcd77749dd1fdf6b0c8183bfbdf4f97bf238ebe4 Mon Sep 17 00:00:00 2001 From: Ellie Huxtable Date: Mon, 20 Mar 2023 09:26:54 +0000 Subject: Add history deletion (#791) * Drop events. I'd still like to do them, but differently * Start adding delete api stuff * Set mailmap * Delete delete delete * Fix tests * Make clippy happy --- atuin-server/src/handlers/history.rs | 22 ++++++++++++++++++++++ atuin-server/src/handlers/mod.rs | 1 + atuin-server/src/handlers/status.rs | 29 +++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+) create mode 100644 atuin-server/src/handlers/status.rs (limited to 'atuin-server/src/handlers') diff --git a/atuin-server/src/handlers/history.rs b/atuin-server/src/handlers/history.rs index 7cf18323..9a7cb245 100644 --- a/atuin-server/src/handlers/history.rs +++ b/atuin-server/src/handlers/history.rs @@ -74,6 +74,28 @@ pub async fn list( Ok(Json(SyncHistoryResponse { history })) } +#[instrument(skip_all, fields(user.id = user.id))] +pub async fn delete( + user: User, + state: State>, + Json(req): Json, +) -> Result, ErrorResponseStatus<'static>> { + let db = &state.0.database; + + // user_id is the ID of the history, as set by the user (the server has its own ID) + let deleted = db.delete_history(&user, req.client_id).await; + + if let Err(e) = deleted { + error!("failed to delete history: {}", e); + return Err(ErrorResponse::reply("failed to delete history") + .with_status(StatusCode::INTERNAL_SERVER_ERROR)); + } + + Ok(Json(MessageResponse { + message: String::from("deleted OK"), + })) +} + #[instrument(skip_all, fields(user.id = user.id))] pub async fn add( user: User, diff --git a/atuin-server/src/handlers/mod.rs b/atuin-server/src/handlers/mod.rs index 082ae471..35d32f6f 100644 --- a/atuin-server/src/handlers/mod.rs +++ b/atuin-server/src/handlers/mod.rs @@ -2,6 +2,7 @@ use atuin_common::api::{ErrorResponse, IndexResponse}; use axum::{response::IntoResponse, Json}; pub mod history; +pub mod status; pub mod user; const VERSION: &str = env!("CARGO_PKG_VERSION"); diff --git a/atuin-server/src/handlers/status.rs b/atuin-server/src/handlers/status.rs new file mode 100644 index 00000000..9c7ef779 --- /dev/null +++ b/atuin-server/src/handlers/status.rs @@ -0,0 +1,29 @@ +use axum::{extract::State, Json}; +use http::StatusCode; +use tracing::instrument; + +use super::{ErrorResponse, ErrorResponseStatus, RespExt}; +use crate::{database::Database, models::User, router::AppState}; + +use atuin_common::api::*; + +#[instrument(skip_all, fields(user.id = user.id))] +pub async fn status( + user: User, + state: State>, +) -> Result, ErrorResponseStatus<'static>> { + let db = &state.0.database; + + let history_count = db.count_history_cached(&user).await; + let deleted = db.deleted_history(&user).await; + + if history_count.is_err() || deleted.is_err() { + return Err(ErrorResponse::reply("failed to query history count") + .with_status(StatusCode::INTERNAL_SERVER_ERROR)); + } + + Ok(Json(StatusResponse { + count: history_count.unwrap(), + deleted: deleted.unwrap(), + })) +} -- cgit v1.3.1