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)]
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}