context69-contracts 0.5.0

Shared request and response types for the Context69 API.
Documentation
use chrono::{DateTime, Utc};
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use utoipa::ToSchema;
use uuid::Uuid;

use crate::Visibility;

#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum SourceOriginStatusKind {
    Unknown,
    Connected,
    Unreachable,
    Misconfigured,
}

#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
pub struct SourceStatus {
    pub group_key: String,
    pub group_path: String,
    pub visibility: Visibility,
    pub source_key: String,
    pub display_name: String,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub description: Option<String>,
    #[serde(default)]
    pub example_queries: Vec<String>,
    pub connection: String,
    pub has_database_url: bool,
    pub origin_status: SourceOriginStatusKind,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub origin_message: Option<String>,
    pub sync_strategy: String,
    pub connector_type: String,
    pub base_query: String,
    pub batch_size: i64,
    pub last_cursor_updated_at: Option<DateTime<Utc>>,
    pub last_cursor_external_id: Option<String>,
    pub last_success_at: Option<DateTime<Utc>>,
}

#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct ListSourcesResponse {
    pub sources: Vec<SourceStatus>,
}

#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
pub struct SyncOutcome {
    pub records_seen: usize,
    pub records_changed: usize,
    pub chunks_upserted: usize,
}

#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct SourceConfigInput {
    pub source_key: String,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub display_name: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub description: Option<String>,
    #[serde(default)]
    pub example_queries: Vec<String>,
    pub connection: String,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub database_url: Option<String>,
    pub sync_strategy: String,
    pub connector_type: String,
    pub base_query: String,
    pub batch_size: i64,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub visibility: Option<Visibility>,
}

#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct SourceConnectionResponse {
    pub name: String,
    pub has_database_url: bool,
    pub origin_status: SourceOriginStatusKind,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub origin_message: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct UpsertSourceConnectionRequest {
    pub name: String,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub database_url: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct CreateSourceFolderRequest {
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub parent_folder_id: Option<Uuid>,
    pub folder_name: String,
    pub source_config: SourceConfigInput,
}

#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct SourceFolderResponse {
    pub folder_id: Uuid,
    pub source_config_file_id: Uuid,
    pub records_folder_id: Uuid,
    pub path: String,
}