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