Skip to main content

engram_core/
delete_handler.rs

1use 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}