engram_core/
delete_handler.rs1use std::sync::Arc;
2
3use serde::Deserialize;
4use serde_json::{Value, json};
5
6use crate::error::CoreError;
7use crate::lock_helpers;
8use crate::persistence::hash_string_to_u64;
9use crate::server::ServerState;
10
11#[derive(Deserialize)]
12struct DeleteParams {
13 id: String,
14}
15
16pub async fn handle(state: &Arc<ServerState>, params: Value) -> Result<Value, CoreError> {
17 let parsed: DeleteParams = serde_json::from_value(params)
18 .map_err(|error| CoreError::DispatchError(error.to_string()))?;
19 let id = parsed.id;
20 let state_clone = Arc::clone(state);
21 tokio::task::spawn_blocking(move || {
22 {
23 let database = lock_helpers::lock_db(&state_clone);
24 database.delete_memory(&id)?;
25 }
26 let hashed = hash_string_to_u64(&id);
27 let mut indexes = lock_helpers::write_indexes(&state_clone);
28 if indexes.contains(hashed) {
29 indexes.delete(hashed).map_err(CoreError::Hnsw)?;
30 }
31 Ok::<Value, CoreError>(json!({ "deleted": id }))
32 })
33 .await
34 .map_err(|error| CoreError::SocketError(error.to_string()))?
35}