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}