1use chrono::{DateTime, Utc};
2use schemars::JsonSchema;
3use serde::{Deserialize, Serialize};
4use serde_json::Value;
5use utoipa::{IntoParams, ToSchema};
6use uuid::Uuid;
7
8use crate::DocumentResponse;
9
10#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, ToSchema, JsonSchema)]
11#[serde(rename_all = "snake_case")]
12pub enum MetadataDataType {
13 Keyword,
14 Integer,
15 Float,
16 Boolean,
17 Datetime,
18}
19
20#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, ToSchema, JsonSchema)]
21#[serde(rename_all = "snake_case")]
22pub enum MetadataValueKind {
23 Scalar,
24 Array,
25}
26
27#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, ToSchema, JsonSchema)]
28#[serde(rename_all = "snake_case")]
29pub enum MetadataIndexStatus {
30 Building,
31 Ready,
32 Failed,
33 Deleting,
34}
35
36#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
37pub struct CreateMetadataIndexRequest {
38 pub path: String,
39 pub data_type: MetadataDataType,
40 pub value_kind: MetadataValueKind,
41 #[serde(default)]
42 pub sortable: bool,
43}
44
45#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
46pub struct UpdateMetadataIndexRequest {
47 pub data_type: MetadataDataType,
48 pub value_kind: MetadataValueKind,
49 #[serde(default)]
50 pub sortable: bool,
51}
52
53#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
54pub struct MetadataIndexResponse {
55 pub index_id: Uuid,
56 pub group_path: String,
57 pub source_key: String,
58 pub path: String,
59 pub data_type: MetadataDataType,
60 pub value_kind: MetadataValueKind,
61 pub sortable: bool,
62 pub status: MetadataIndexStatus,
63 pub processed_documents: i64,
64 pub total_documents: i64,
65 pub error_message: Option<String>,
66 pub created_at: DateTime<Utc>,
67 pub updated_at: DateTime<Utc>,
68}
69
70#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, ToSchema, JsonSchema)]
71#[serde(rename_all = "snake_case")]
72pub enum MetadataFilterOperator {
73 Eq,
74 In,
75 Range,
76 Exists,
77 Contains,
78}
79
80#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
81pub struct MetadataFilter {
82 pub path: String,
83 pub operator: MetadataFilterOperator,
84 #[serde(default, skip_serializing_if = "Option::is_none")]
85 #[schema(value_type = Option<Object>)]
86 pub value: Option<Value>,
87 #[serde(default, skip_serializing_if = "Option::is_none")]
88 #[schema(value_type = Option<Object>)]
89 pub min: Option<Value>,
90 #[serde(default, skip_serializing_if = "Option::is_none")]
91 #[schema(value_type = Option<Object>)]
92 pub max: Option<Value>,
93}
94
95#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, ToSchema, JsonSchema)]
96#[serde(rename_all = "snake_case")]
97pub enum SortOrder {
98 Asc,
99 Desc,
100}
101
102#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema, JsonSchema)]
103#[serde(rename_all = "snake_case")]
104pub enum DocumentSortField {
105 PublishedAt,
106 UpdatedAt,
107 Metadata(String),
108}
109
110#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
111pub struct DocumentSort {
112 pub field: DocumentSortField,
113 pub order: SortOrder,
114}
115
116#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
117pub struct DocumentQueryRequest {
118 #[serde(default)]
119 pub source_key: Option<String>,
120 #[serde(default)]
121 pub published_after: Option<DateTime<Utc>>,
122 #[serde(default)]
123 pub published_before: Option<DateTime<Utc>>,
124 #[serde(default)]
125 pub metadata_filters: Vec<MetadataFilter>,
126 #[serde(default)]
127 pub sort: Vec<DocumentSort>,
128 #[serde(default = "default_limit")]
129 pub limit: usize,
130 #[serde(default)]
131 pub cursor: Option<String>,
132}
133
134fn default_limit() -> usize {
135 50
136}
137
138#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
139pub struct DocumentQueryResponse {
140 pub documents: Vec<DocumentResponse>,
141 pub next_cursor: Option<String>,
142}
143
144#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
145pub struct DocumentKey {
146 pub source_key: String,
147 pub external_id: String,
148}
149
150#[derive(Debug, Clone, Serialize, Deserialize, IntoParams, ToSchema)]
151pub struct DocumentLookupQuery {
152 pub source_key: String,
153 pub external_id: String,
154}
155
156#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
157pub struct BatchGetDocumentsRequest {
158 pub keys: Vec<DocumentKey>,
159}
160
161#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
162pub struct BatchDocumentItem {
163 pub key: DocumentKey,
164 pub document: Option<DocumentResponse>,
165}
166
167#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
168pub struct BatchGetDocumentsResponse {
169 pub items: Vec<BatchDocumentItem>,
170}