use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ReviewReason {
AmbiguousSort,
LowConfidence,
MultipleCandidates,
UnknownSort,
ConflictingFeatures,
MissingRequiredFeatures,
ManualRequest,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ConflictResolution {
KeepExisting,
UseNew,
Merge,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReviewCandidateMatchDto {
pub display_name: String,
#[serde(default)]
pub features: BTreeMap<String, serde_json::Value>,
pub similarity: f64,
pub sort: String,
pub term_id: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SortSuggestionDto {
pub confidence: f64,
#[serde(default)]
pub features: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub observation_count: Option<u64>,
pub origin: String,
#[serde(default)]
pub parent_sorts: Vec<String>,
pub suggested_name: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PendingReviewDto {
#[serde(default)]
pub candidates: Vec<ReviewCandidateMatchDto>,
pub entity_id: String,
pub reason: String,
pub sort: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AddPendingReviewRequest {
#[serde(default)]
pub candidates: Vec<ReviewCandidateMatchDto>,
pub confidence: f64,
pub entity_id: String,
#[serde(default)]
pub features: BTreeMap<String, serde_json::Value>,
pub owner_id: String,
pub reason: ReviewReason,
pub sort: String,
#[serde(default)]
pub sort_suggestions: Vec<SortSuggestionDto>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub source_document: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub source_text: Option<String>,
pub tenant_id: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ApproveEntityRequest {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub notes: Option<String>,
pub review_id: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BulkApproveRequest {
pub review_ids: Vec<String>,
pub reviewed_by: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BulkMergeRequest {
pub review_ids: Vec<String>,
pub reviewed_by: String,
pub target_term_id: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BulkRejectRequest {
pub reason: String,
pub review_ids: Vec<String>,
pub reviewed_by: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CorrectEntityRequest {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub features: Option<BTreeMap<String, serde_json::Value>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub notes: Option<String>,
pub review_id: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub sort: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MergeEntityRequest {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub conflict_resolution: Option<ConflictResolution>,
pub review_id: String,
pub target_term_id: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReExtractRequest {
pub document_id: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub extraction_strategy: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub focus_sorts: Option<Vec<String>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub instructions: Option<String>,
pub tenant_id: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RejectEntityRequest {
pub reason: String,
pub review_id: String,
}