Skip to main content

context69_contracts/
documents.rs

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, skip_serializing_if = "Option::is_none")]
119    pub locale: Option<String>,
120    #[serde(default)]
121    pub source_key: Option<String>,
122    #[serde(default)]
123    pub published_after: Option<DateTime<Utc>>,
124    #[serde(default)]
125    pub published_before: Option<DateTime<Utc>>,
126    #[serde(default)]
127    pub metadata_filters: Vec<MetadataFilter>,
128    #[serde(default)]
129    pub sort: Vec<DocumentSort>,
130    #[serde(default = "default_limit")]
131    pub limit: usize,
132    #[serde(default)]
133    pub cursor: Option<String>,
134}
135
136fn default_limit() -> usize {
137    50
138}
139
140#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
141pub struct DocumentQueryResponse {
142    pub documents: Vec<DocumentResponse>,
143    pub next_cursor: Option<String>,
144}
145
146#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
147pub struct DocumentKey {
148    pub source_key: String,
149    pub external_id: String,
150}
151
152#[derive(Debug, Clone, Serialize, Deserialize, IntoParams, ToSchema)]
153pub struct DocumentLookupQuery {
154    pub source_key: String,
155    pub external_id: String,
156    #[serde(default, skip_serializing_if = "Option::is_none")]
157    pub locale: Option<String>,
158}
159
160#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
161pub struct BatchGetDocumentsRequest {
162    pub keys: Vec<DocumentKey>,
163    #[serde(default, skip_serializing_if = "Option::is_none")]
164    pub locale: Option<String>,
165}
166
167#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
168pub struct BatchDocumentItem {
169    pub key: DocumentKey,
170    pub document: Option<DocumentResponse>,
171}
172
173#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
174pub struct BatchGetDocumentsResponse {
175    pub items: Vec<BatchDocumentItem>,
176}