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 pagination: crate::Pagination,
147}
148
149#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
150pub struct TaskItemsResponse {
151 pub items: Vec<TaskItemResponse>,
152 pub next_cursor: Option<String>,
153}
154
155#[derive(Debug, Clone, Serialize, Deserialize, IntoParams, ToSchema)]
156#[into_params(parameter_in = Query)]
157pub struct TaskItemsQuery {
158 #[serde(default = "default_item_limit")]
159 pub limit: u32,
160 #[serde(default)]
161 pub cursor: Option<String>,
162}
163
164#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
165pub struct ScopeSpec {
166 pub group_path: String,
167 pub name: String,
168 pub visibility: crate::Visibility,
169 #[serde(default)]
170 pub kind: Option<crate::GroupKind>,
171 #[serde(default)]
172 pub metadata_indexes: Vec<ScopeMetadataIndex>,
173}
174
175#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
176pub struct ScopeMetadataIndex {
177 pub source_key: String,
178 #[serde(flatten)]
179 pub definition: crate::CreateMetadataIndexRequest,
180}
181
182#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
183pub struct EnsureScopeResponse {
184 pub group: GroupResponse,
185 pub metadata_indexes: Vec<crate::MetadataIndexResponse>,
186}
187
188#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
189pub struct TextBatchRequest {
190 pub items: Vec<UpsertLibraryTextRequest>,
191}
192
193#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
194pub struct UrlBatchRequest {
195 pub items: Vec<ImportLibraryFileFromUrlRequest>,
196}
197
198#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
199pub struct DeleteBatchRequest {
200 pub items: Vec<crate::DocumentKey>,
201}
202
203#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
204pub struct FileBatchItem {
205 pub filename: String,
206 pub media_type: String,
207 pub content_base64: String,
208 #[serde(default)]
209 pub folder_id: Option<Uuid>,
210 #[serde(default)]
211 pub metadata: Option<LibraryFileUploadMetadata>,
212 #[serde(default)]
213 pub translation: Option<crate::TranslationDirective>,
214}
215
216#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
217pub struct FileBatchRequest {
218 pub items: Vec<FileBatchItem>,
219}
220
221#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
222pub struct GenericTaskRequest {
223 pub kind: TaskKind,
224 #[serde(default)]
225 pub group_path: Option<String>,
226 #[serde(default)]
227 pub source_key: Option<String>,
228 #[serde(default)]
229 pub items: Vec<Value>,
230}
231
232#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
233pub struct TaskRetryResponse {
234 pub task: TaskRef,
235 pub retried_items: i64,
236}
237
238fn default_page() -> u32 {
239 1
240}
241
242fn default_page_size() -> u32 {
243 50
244}
245
246fn default_item_limit() -> u32 {
247 100
248}