use docbox_database::models::{document_box::DocumentBoxScopeRaw, folder::FolderId, user::UserId};
use serde::{Deserialize, Serialize};
use serde_with::skip_serializing_none;
use uuid::Uuid;
use crate::models::SearchIndexType;
#[derive(Serialize, Deserialize)]
pub struct TypesenseEntry {
pub id: Uuid,
#[serde(flatten)]
pub entry: TypesenseDataEntry,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(tag = "version")]
pub enum TypesenseDataEntry {
V1(TypesenseDataEntryV1),
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(tag = "entry_type")]
pub enum TypesenseDataEntryV1 {
Root(TypesenseDataEntryRootV1),
Page(TypesenseDataEntryPageV1),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[skip_serializing_none]
pub struct TypesenseDataEntryRootV1 {
pub document_box: DocumentBoxScopeRaw,
pub folder_id: FolderId,
#[serde(rename = "item_type")]
pub ty: SearchIndexType,
pub item_id: Uuid,
pub name: String,
pub value: Option<String>,
pub mime: Option<String>,
pub created_at: i64,
pub created_by: Option<UserId>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct TypesenseDataEntryPageV1 {
#[serde(flatten)]
pub root: TypesenseDataEntryRootV1,
pub page: u64,
pub page_content: Option<String>,
}
#[derive(Deserialize)]
pub struct SearchResponse<T> {
pub results: Vec<T>,
}
#[derive(Deserialize)]
#[allow(unused)]
pub struct GenericSearchResponse {
pub found: u64,
pub hits: Vec<Hit>,
}
#[derive(Deserialize)]
pub struct GroupedSearchResponse {
pub found: u64,
pub grouped_hits: Vec<GroupedHits>,
}
#[derive(Deserialize)]
pub struct GroupedHits {
pub found: u64,
pub hits: Vec<Hit>,
}
#[derive(Deserialize)]
pub struct Hit {
pub document: TypesenseDataEntry,
pub highlights: Vec<Highlight>,
pub text_match: u64,
}
#[derive(Deserialize)]
pub struct Highlight {
pub field: String,
pub snippet: String,
}