From c9a453289e2fea97b5ac17e265f99332edcdcd4c Mon Sep 17 00:00:00 2001 From: Ellie Huxtable Date: Fri, 2 Feb 2024 15:05:07 +0000 Subject: feat: add `store push --force` This will 1. Wipe the remote store 2. Upload all of the local store to remote Imagine the scenario where you end up with some mixed keys locally :( You confirm this with ``` atuin store verify ``` You then fix it locally with ``` atuin store purge ``` Ensure that your local changes are reflected remotely with ``` atuin store push --force ``` and then (another PR, coming soon), update all other hosts with ``` atuin store pull --force ``` --- atuin-server/src/handlers/v0/mod.rs | 1 + atuin-server/src/handlers/v0/store.rs | 37 +++++++++++++++++++++++++++++++++++ atuin-server/src/router.rs | 3 ++- 3 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 atuin-server/src/handlers/v0/store.rs (limited to 'atuin-server/src') diff --git a/atuin-server/src/handlers/v0/mod.rs b/atuin-server/src/handlers/v0/mod.rs index 78fb47b8..2d6745cf 100644 --- a/atuin-server/src/handlers/v0/mod.rs +++ b/atuin-server/src/handlers/v0/mod.rs @@ -1 +1,2 @@ pub(crate) mod record; +pub(crate) mod store; diff --git a/atuin-server/src/handlers/v0/store.rs b/atuin-server/src/handlers/v0/store.rs new file mode 100644 index 00000000..941f2487 --- /dev/null +++ b/atuin-server/src/handlers/v0/store.rs @@ -0,0 +1,37 @@ +use axum::{extract::Query, extract::State, http::StatusCode}; +use metrics::counter; +use serde::Deserialize; +use tracing::{error, instrument}; + +use crate::{ + handlers::{ErrorResponse, ErrorResponseStatus, RespExt}, + router::{AppState, UserAuth}, +}; +use atuin_server_database::Database; + +#[derive(Deserialize)] +pub struct DeleteParams {} + +#[instrument(skip_all, fields(user.id = user.id))] +pub async fn delete( + _params: Query, + UserAuth(user): UserAuth, + state: State>, +) -> Result<(), ErrorResponseStatus<'static>> { + let State(AppState { + database, + settings: _, + }) = state; + + if let Err(e) = database.delete_store(&user).await { + counter!("atuin_store_delete_failed", 1); + error!("failed to delete store {e:?}"); + + return Err(ErrorResponse::reply("failed to delete store") + .with_status(StatusCode::INTERNAL_SERVER_ERROR)); + } + + counter!("atuin_store_deleted", 1); + + Ok(()) +} diff --git a/atuin-server/src/router.rs b/atuin-server/src/router.rs index 74df229a..52fc1484 100644 --- a/atuin-server/src/router.rs +++ b/atuin-server/src/router.rs @@ -127,7 +127,8 @@ pub fn router(database: DB, settings: Settings) -> R .route("/record/next", get(handlers::record::next)) .route("/api/v0/record", post(handlers::v0::record::post)) .route("/api/v0/record", get(handlers::v0::record::index)) - .route("/api/v0/record/next", get(handlers::v0::record::next)); + .route("/api/v0/record/next", get(handlers::v0::record::next)) + .route("/api/v0/store", delete(handlers::v0::store::delete)); let path = settings.path.as_str(); if path.is_empty() { -- cgit v1.3.1