Skip to main content

context69_contracts/
tasks.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::{
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}