Skip to main content

context69_contracts/
sources.rs

1use chrono::{DateTime, Utc};
2use schemars::JsonSchema;
3use serde::{Deserialize, Serialize};
4use utoipa::ToSchema;
5use uuid::Uuid;
6
7use crate::Visibility;
8
9#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
10#[serde(rename_all = "snake_case")]
11pub enum SourceOriginStatusKind {
12    Unknown,
13    Connected,
14    Unreachable,
15    Misconfigured,
16}
17
18#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
19pub struct SourceStatus {
20    pub group_key: String,
21    pub group_path: String,
22    pub visibility: Visibility,
23    pub source_key: String,
24    pub display_name: String,
25    #[serde(default, skip_serializing_if = "Option::is_none")]
26    pub description: Option<String>,
27    #[serde(default)]
28    pub example_queries: Vec<String>,
29    pub connection: String,
30    pub has_database_url: bool,
31    pub origin_status: SourceOriginStatusKind,
32    #[serde(default, skip_serializing_if = "Option::is_none")]
33    pub origin_message: Option<String>,
34    pub sync_strategy: String,
35    pub connector_type: String,
36    pub base_query: String,
37    pub batch_size: i64,
38    pub last_cursor_updated_at: Option<DateTime<Utc>>,
39    pub last_cursor_external_id: Option<String>,
40    pub last_success_at: Option<DateTime<Utc>>,
41}
42
43#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
44pub struct ListSourcesResponse {
45    pub sources: Vec<SourceStatus>,
46}
47
48#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
49pub struct SyncOutcome {
50    pub records_seen: usize,
51    pub records_changed: usize,
52    pub chunks_upserted: usize,
53}
54
55#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
56pub struct SourceConfigInput {
57    pub source_key: String,
58    #[serde(default, skip_serializing_if = "Option::is_none")]
59    pub display_name: Option<String>,
60    #[serde(default, skip_serializing_if = "Option::is_none")]
61    pub description: Option<String>,
62    #[serde(default)]
63    pub example_queries: Vec<String>,
64    pub connection: String,
65    #[serde(default, skip_serializing_if = "Option::is_none")]
66    pub database_url: Option<String>,
67    pub sync_strategy: String,
68    pub connector_type: String,
69    pub base_query: String,
70    pub batch_size: i64,
71    #[serde(default, skip_serializing_if = "Option::is_none")]
72    pub visibility: Option<Visibility>,
73}
74
75#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
76pub struct SourceConnectionResponse {
77    pub name: String,
78    pub has_database_url: bool,
79    pub origin_status: SourceOriginStatusKind,
80    #[serde(default, skip_serializing_if = "Option::is_none")]
81    pub origin_message: Option<String>,
82}
83
84#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
85pub struct UpsertSourceConnectionRequest {
86    pub name: String,
87    #[serde(default, skip_serializing_if = "Option::is_none")]
88    pub database_url: Option<String>,
89}
90
91#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
92pub struct CreateSourceFolderRequest {
93    #[serde(default, skip_serializing_if = "Option::is_none")]
94    pub parent_folder_id: Option<Uuid>,
95    pub folder_name: String,
96    pub source_config: SourceConfigInput,
97}
98
99#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
100pub struct SourceFolderResponse {
101    pub folder_id: Uuid,
102    pub source_config_file_id: Uuid,
103    pub records_folder_id: Uuid,
104    pub path: String,
105}