use serde_json::{Value, json};
use crate::validation;
use moltendb_core::engine;
pub fn process_delete(db: &engine::Db, payload: &Value, max_body_size: usize) -> (u16, Value) {
if let Err(e) = validation::validate_request(payload, max_body_size) {
return (400, json!({ "error": e.to_string(), "statusCode": 400 }));
}
const DELETE_ALLOWED: &[&str] = &["collection", "keys", "drop"];
if let Err(e) = validation::validate_allowed_properties(payload, DELETE_ALLOWED) {
return (400, json!({ "error": e.to_string(), "statusCode": 400 }));
}
let col = payload["collection"].as_str().unwrap_or("default");
if payload["drop"].as_bool().unwrap_or(false) {
return match db.delete_collection(col) {
Ok(_) => (200, json!({ "status": "ok", "dropped": true })),
Err(e) => (500, json!({ "error": "Failed to drop collection", "details": e.to_string(), "statusCode": 500 }))
};
}
match payload.get("keys") {
Some(Value::String(k)) => {
match db.delete(col, k) {
Ok(_) => (200, json!({ "status": "ok", "deleted": 1 })),
Err(e) => (500, json!({ "error": "Failed to delete key", "details": e.to_string(), "statusCode": 500 }))
}
},
Some(Value::Array(arr)) => {
let mut keys = Vec::new();
for k in arr {
if let Some(s) = k.as_str() { keys.push(s.to_string()); }
}
let count = keys.len();
match db.delete_batch(col, keys) {
Ok(_) => (200, json!({ "status": "ok", "deleted": count })),
Err(e) => (500, json!({ "error": "Failed to delete batch", "details": e.to_string(), "statusCode": 500 }))
}
},
_ => (400, json!({ "error": "Missing 'keys' (string or array) or 'drop': true", "statusCode": 400 }))
}
}