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::{
9 GroupResponse, ImportLibraryFileFromUrlRequest, LibraryFileUploadMetadata,
10 UpsertLibraryTextRequest,
11};
12
13#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, ToSchema, JsonSchema)]
14#[serde(rename_all = "snake_case")]
15pub enum TaskKind {
16 SourceSync,
17 TextBatch,
18 FileBatch,
19 UrlBatch,
20 DeleteBatch,
21 Translation,
22 VectorRebuild,
23}
24
25impl TaskKind {
26 pub fn as_str(self) -> &'static str {
27 match self {
28 Self::SourceSync => "source_sync",
29 Self::TextBatch => "text_batch",
30 Self::FileBatch => "file_batch",
31 Self::UrlBatch => "url_batch",
32 Self::DeleteBatch => "delete_batch",
33 Self::Translation => "translation",
34 Self::VectorRebuild => "vector_rebuild",
35 }
36 }
37}
38
39#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, ToSchema, JsonSchema)]
40#[serde(rename_all = "snake_case")]
41pub enum TaskStatus {
42 Queued,
43 Running,
44 Succeeded,
45 Failed,
46 Cancelled,
47}
48
49impl TaskStatus {
50 pub fn as_str(self) -> &'static str {
51 match self {
52 Self::Queued => "queued",
53 Self::Running => "running",
54 Self::Succeeded => "succeeded",
55 Self::Failed => "failed",
56 Self::Cancelled => "cancelled",
57 }
58 }
59}
60
61#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, ToSchema, JsonSchema)]
62#[serde(rename_all = "snake_case")]
63pub enum TaskItemStatus {
64 Queued,
65 Running,
66 Succeeded,
67 Failed,
68 Cancelled,
69}
70
71impl TaskItemStatus {
72 pub fn as_str(self) -> &'static str {
73 match self {
74 Self::Queued => "queued",
75 Self::Running => "running",
76 Self::Succeeded => "succeeded",
77 Self::Failed => "failed",
78 Self::Cancelled => "cancelled",
79 }
80 }
81}
82
83#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
84pub struct TaskRef {
85 pub task_id: Uuid,
86}
87
88#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
89pub struct TaskProgress {
90 pub total: i64,
91 pub queued: i64,
92 pub running: i64,
93 pub succeeded: i64,
94 pub failed: i64,
95 pub cancelled: i64,
96}
97
98#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
99pub struct TaskResponse {
100 pub task_id: Uuid,
101 pub kind: TaskKind,
102 pub status: TaskStatus,
103 pub group_path: Option<String>,
104 pub source_key: Option<String>,
105 pub progress: TaskProgress,
106 pub failure_stage: Option<String>,
107 pub error_summary: Option<String>,
108 pub eta_seconds: Option<i64>,
109 pub created_at: DateTime<Utc>,
110 pub started_at: Option<DateTime<Utc>>,
111 pub finished_at: Option<DateTime<Utc>>,
112 pub updated_at: DateTime<Utc>,
113}
114
115#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
116pub struct TaskItemResponse {
117 pub item_id: Uuid,
118 pub ordinal: i32,
119 pub status: TaskItemStatus,
120 pub resource_id: Option<String>,
121 pub failure_stage: Option<String>,
122 pub error_message: Option<String>,
123 pub attempt_count: i32,
124 pub retryable: bool,
125 pub created_at: DateTime<Utc>,
126 pub started_at: Option<DateTime<Utc>>,
127 pub finished_at: Option<DateTime<Utc>>,
128}
129
130#[derive(Debug, Clone, Serialize, Deserialize, IntoParams, ToSchema)]
131#[into_params(parameter_in = Query)]
132pub struct TaskListQuery {
133 #[serde(default = "default_page")]
134 pub page: u32,
135 #[serde(default = "default_page_size")]
136 pub page_size: u32,
137 #[serde(default)]
138 pub kind: Option<TaskKind>,
139 #[serde(default)]
140 pub status: Option<TaskStatus>,
141}
142
143#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
144pub struct TaskPageResponse {
145 pub items: Vec<TaskResponse>,
146 pub page: u32,
147 pub page_size: u32,
148 pub total: u64,
149 pub total_pages: u32,
150}
151
152#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
153pub struct TaskItemsResponse {
154 pub items: Vec<TaskItemResponse>,
155 pub next_cursor: Option<String>,
156}
157
158#[derive(Debug, Clone, Serialize, Deserialize, IntoParams, ToSchema)]
159#[into_params(parameter_in = Query)]
160pub struct TaskItemsQuery {
161 #[serde(default = "default_item_limit")]
162 pub limit: u32,
163 #[serde(default)]
164 pub cursor: Option<String>,
165}
166
167#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
168pub struct ScopeSpec {
169 pub group_path: String,
170 pub name: String,
171 pub visibility: crate::Visibility,
172 #[serde(default)]
173 pub kind: Option<crate::GroupKind>,
174 #[serde(default)]
175 pub metadata_indexes: Vec<ScopeMetadataIndex>,
176}
177
178#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
179pub struct ScopeMetadataIndex {
180 pub source_key: String,
181 #[serde(flatten)]
182 pub definition: crate::CreateMetadataIndexRequest,
183}
184
185#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
186pub struct EnsureScopeResponse {
187 pub group: GroupResponse,
188 pub metadata_indexes: Vec<crate::MetadataIndexResponse>,
189}
190
191#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
192pub struct TextBatchRequest {
193 pub items: Vec<UpsertLibraryTextRequest>,
194}
195
196#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
197pub struct UrlBatchRequest {
198 pub items: Vec<ImportLibraryFileFromUrlRequest>,
199}
200
201#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
202pub struct DeleteBatchRequest {
203 pub items: Vec<crate::DocumentKey>,
204}
205
206#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
207pub struct FileBatchItem {
208 pub filename: String,
209 pub media_type: String,
210 pub content_base64: String,
211 #[serde(default)]
212 pub folder_id: Option<Uuid>,
213 #[serde(default)]
214 pub metadata: Option<LibraryFileUploadMetadata>,
215 #[serde(default)]
216 pub translation: Option<crate::TranslationDirective>,
217}
218
219#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
220pub struct FileBatchRequest {
221 pub items: Vec<FileBatchItem>,
222}
223
224#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
225pub struct GenericTaskRequest {
226 pub kind: TaskKind,
227 #[serde(default)]
228 pub group_path: Option<String>,
229 #[serde(default)]
230 pub source_key: Option<String>,
231 #[serde(default)]
232 pub items: Vec<Value>,
233}
234
235#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
236pub struct TaskRetryResponse {
237 pub task: TaskRef,
238 pub retried_items: i64,
239}
240
241fn default_page() -> u32 {
242 1
243}
244
245fn default_page_size() -> u32 {
246 50
247}
248
249fn default_item_limit() -> u32 {
250 100
251}