nblm_core/models/requests/
source.rs

1use std::collections::HashMap;
2
3use serde::{Deserialize, Serialize};
4
5use crate::models::source::UserContent;
6
7#[derive(Debug, Clone, Serialize, Deserialize, Default)]
8#[serde(rename_all = "camelCase")]
9pub struct BatchCreateSourcesRequest {
10    #[serde(rename = "userContents")]
11    pub user_contents: Vec<UserContent>,
12}
13
14#[derive(Debug, Clone, Serialize, Deserialize, Default)]
15pub struct BatchDeleteSourcesRequest {
16    pub names: Vec<String>,
17}
18
19#[derive(Debug, Clone, Serialize, Deserialize, Default)]
20pub struct BatchDeleteSourcesResponse {
21    // API may return empty response or status information
22    #[serde(flatten)]
23    pub extra: HashMap<String, serde_json::Value>,
24}
25
26#[cfg(test)]
27mod tests {
28    use super::*;
29    use crate::models::source::{TextContent, WebContent};
30
31    #[test]
32    fn batch_create_sources_request_serializes_with_user_contents() {
33        let request = BatchCreateSourcesRequest {
34            user_contents: vec![
35                UserContent::Web {
36                    web_content: WebContent {
37                        url: "https://example.com".to_string(),
38                        source_name: None,
39                    },
40                },
41                UserContent::Text {
42                    text_content: TextContent {
43                        content: "Sample text".to_string(),
44                        source_name: Some("My text".to_string()),
45                    },
46                },
47            ],
48        };
49        let json = serde_json::to_string(&request).unwrap();
50        assert!(json.contains("userContents"));
51        assert!(json.contains("https://example.com"));
52        assert!(json.contains("Sample text"));
53    }
54
55    #[test]
56    fn batch_delete_sources_request_serializes_correctly() {
57        let request = BatchDeleteSourcesRequest {
58            names: vec!["sources/123".to_string()],
59        };
60        let json = serde_json::to_string(&request).unwrap();
61        assert!(json.contains(r#""names""#));
62        assert!(json.contains("sources/123"));
63    }
64
65    #[test]
66    fn batch_delete_sources_response_deserializes_empty() {
67        let json = r#"{}"#;
68        let response: BatchDeleteSourcesResponse = serde_json::from_str(json).unwrap();
69        assert!(response.extra.is_empty());
70    }
71}