use reqwest::Method;
use serde::Serialize;
use crate::client::SearchcraftClient;
use crate::config::Operation;
use crate::error;
use crate::search::types::SearchHit;
use super::types::DocumentDeleteResponse;
impl SearchcraftClient {
pub async fn insert_document(
&self,
index_name: &str,
document: &serde_json::Value,
) -> error::Result<String> {
let path = format!("index/{index_name}/documents");
let body = vec![document];
self.transport
.request_data(Method::POST, &path, Operation::Write, Some(&body))
.await
}
pub async fn batch_insert_documents(
&self,
index_name: &str,
documents: &[serde_json::Value],
) -> error::Result<String> {
let path = format!("index/{index_name}/documents");
self.transport
.request_data(Method::POST, &path, Operation::Write, Some(&documents))
.await
}
pub async fn delete_document(
&self,
index_name: &str,
document_id: &str,
) -> error::Result<DocumentDeleteResponse> {
let path = format!("index/{index_name}/documents/query");
let body = serde_json::json!({
"query": {
"exact": {
"ctx": format!("id:{document_id}")
}
}
});
self.transport
.request_data(Method::DELETE, &path, Operation::Write, Some(&body))
.await
}
pub async fn batch_delete_documents(
&self,
index_name: &str,
document_ids: &[impl Serialize],
) -> error::Result<DocumentDeleteResponse> {
let path = format!("index/{index_name}/documents");
let body = serde_json::json!({ "id": document_ids });
self.transport
.request_data(Method::DELETE, &path, Operation::Write, Some(&body))
.await
}
pub async fn delete_document_by_internal_id(
&self,
index_name: &str,
internal_id: &str,
) -> error::Result<String> {
let path = format!("index/{index_name}/documents/{internal_id}");
self.transport
.request_data(Method::DELETE, &path, Operation::Write, None::<&()>)
.await
}
pub async fn delete_all_documents(&self, index_name: &str) -> error::Result<String> {
let path = format!("index/{index_name}/documents/all");
self.transport
.request_data(Method::DELETE, &path, Operation::Write, None::<&()>)
.await
}
pub async fn get_document<T: serde::de::DeserializeOwned>(
&self,
index_name: &str,
internal_id: &str,
) -> error::Result<SearchHit<T>> {
let path = format!("index/{index_name}/documents/{internal_id}");
self.transport
.request_data(Method::GET, &path, Operation::Read, None::<&()>)
.await
}
}