nblm_core/models/enterprise/
source.rs

1use std::collections::HashMap;
2
3use serde::{Deserialize, Serialize};
4use serde_json::Value;
5
6#[derive(Debug, Clone, Serialize, Deserialize, Default)]
7#[serde(rename_all = "camelCase")]
8pub struct NotebookSource {
9    #[serde(skip_serializing_if = "Option::is_none")]
10    pub metadata: Option<NotebookSourceMetadata>,
11    pub name: String,
12    #[serde(skip_serializing_if = "Option::is_none")]
13    pub settings: Option<NotebookSourceSettings>,
14    #[serde(skip_serializing_if = "Option::is_none")]
15    pub source_id: Option<NotebookSourceId>,
16    #[serde(skip_serializing_if = "Option::is_none")]
17    pub title: Option<String>,
18    #[serde(flatten)]
19    pub extra: HashMap<String, Value>,
20}
21
22#[derive(Debug, Clone, Serialize, Deserialize, Default)]
23#[serde(rename_all = "camelCase")]
24pub struct NotebookSourceMetadata {
25    #[serde(skip_serializing_if = "Option::is_none")]
26    pub source_added_timestamp: Option<String>,
27    #[serde(skip_serializing_if = "Option::is_none")]
28    pub word_count: Option<u64>,
29    #[serde(skip_serializing_if = "Option::is_none")]
30    pub youtube_metadata: Option<NotebookSourceYoutubeMetadata>,
31    #[serde(flatten)]
32    pub extra: HashMap<String, Value>,
33}
34
35#[derive(Debug, Clone, Serialize, Deserialize, Default)]
36#[serde(rename_all = "camelCase")]
37pub struct NotebookSourceYoutubeMetadata {
38    #[serde(skip_serializing_if = "Option::is_none")]
39    pub channel_name: Option<String>,
40    #[serde(skip_serializing_if = "Option::is_none")]
41    pub video_id: Option<String>,
42    #[serde(flatten)]
43    pub extra: HashMap<String, Value>,
44}
45
46#[derive(Debug, Clone, Serialize, Deserialize, Default)]
47#[serde(rename_all = "camelCase")]
48pub struct NotebookSourceSettings {
49    #[serde(skip_serializing_if = "Option::is_none")]
50    pub status: Option<String>,
51    #[serde(flatten)]
52    pub extra: HashMap<String, Value>,
53}
54
55#[derive(Debug, Clone, Serialize, Deserialize, Default)]
56#[serde(rename_all = "camelCase")]
57pub struct NotebookSourceId {
58    #[serde(skip_serializing_if = "Option::is_none")]
59    pub id: Option<String>,
60    #[serde(flatten)]
61    pub extra: HashMap<String, Value>,
62}
63
64#[derive(Debug, Clone, Serialize, Deserialize)]
65#[serde(untagged)]
66pub enum UserContent {
67    Web {
68        #[serde(rename = "webContent")]
69        web_content: WebContent,
70    },
71    Text {
72        #[serde(rename = "textContent")]
73        text_content: TextContent,
74    },
75    GoogleDrive {
76        #[serde(rename = "googleDriveContent")]
77        google_drive_content: GoogleDriveContent,
78    },
79    Video {
80        #[serde(rename = "videoContent")]
81        video_content: VideoContent,
82    },
83}
84
85impl UserContent {
86    pub fn web(url: String, source_name: Option<String>) -> Self {
87        Self::Web {
88            web_content: WebContent { url, source_name },
89        }
90    }
91
92    pub fn text(content: String, source_name: Option<String>) -> Self {
93        Self::Text {
94            text_content: TextContent {
95                content,
96                source_name,
97            },
98        }
99    }
100
101    pub fn google_drive(
102        document_id: String,
103        mime_type: String,
104        source_name: Option<String>,
105    ) -> Self {
106        Self::GoogleDrive {
107            google_drive_content: GoogleDriveContent {
108                document_id,
109                mime_type,
110                source_name,
111            },
112        }
113    }
114
115    pub fn video(url: String) -> Self {
116        Self::Video {
117            video_content: VideoContent { url },
118        }
119    }
120}
121
122#[derive(Debug, Clone, Serialize, Deserialize, Default)]
123#[serde(rename_all = "camelCase")]
124pub struct WebContent {
125    pub url: String,
126    #[serde(skip_serializing_if = "Option::is_none")]
127    pub source_name: Option<String>,
128}
129
130#[derive(Debug, Clone, Serialize, Deserialize, Default)]
131#[serde(rename_all = "camelCase")]
132pub struct TextContent {
133    pub content: String,
134    #[serde(skip_serializing_if = "Option::is_none")]
135    pub source_name: Option<String>,
136}
137
138#[derive(Debug, Clone, Serialize, Deserialize, Default)]
139#[serde(rename_all = "camelCase")]
140pub struct GoogleDriveContent {
141    pub document_id: String,
142    pub mime_type: String,
143    #[serde(skip_serializing_if = "Option::is_none")]
144    pub source_name: Option<String>,
145}
146
147#[derive(Debug, Clone, Serialize, Deserialize, Default)]
148pub struct VideoContent {
149    #[serde(rename = "youtubeUrl")]
150    pub url: String,
151}
152
153#[derive(Debug, Clone, Serialize, Deserialize, Default)]
154#[serde(rename_all = "camelCase")]
155pub struct BatchCreateSourcesRequest {
156    #[serde(rename = "userContents")]
157    pub user_contents: Vec<UserContent>,
158}
159
160#[derive(Debug, Clone, Serialize, Deserialize, Default)]
161#[serde(rename_all = "camelCase")]
162pub struct BatchCreateSourcesResponse {
163    #[serde(default)]
164    pub sources: Vec<NotebookSource>,
165    #[serde(skip_serializing_if = "Option::is_none")]
166    pub error_count: Option<i32>,
167}
168
169#[derive(Debug, Clone, Serialize, Deserialize, Default)]
170#[serde(rename_all = "camelCase")]
171pub struct BatchDeleteSourcesRequest {
172    pub names: Vec<String>,
173}
174
175#[derive(Debug, Clone, Serialize, Deserialize, Default)]
176#[serde(rename_all = "camelCase")]
177pub struct BatchDeleteSourcesResponse {
178    #[serde(flatten)]
179    pub extra: HashMap<String, Value>,
180}
181
182#[derive(Debug, Clone, Serialize, Deserialize, Default)]
183#[serde(rename_all = "camelCase")]
184pub struct UploadSourceFileResponse {
185    #[serde(skip_serializing_if = "Option::is_none")]
186    pub source_id: Option<NotebookSourceId>,
187    #[serde(flatten)]
188    pub extra: HashMap<String, Value>,
189}