nblm_core/models/requests/
notebook.rs

1use std::collections::HashMap;
2
3use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Serialize)]
6#[serde(rename_all = "camelCase")]
7pub struct CreateNotebookRequest {
8    pub title: String,
9}
10
11/// Batch delete notebooks request.
12///
13/// # Known Issues (as of 2025-10-19)
14///
15/// Despite the API being named "batchDelete" and accepting an array of names,
16/// the API returns HTTP 400 error when multiple notebook names are provided.
17/// Only single notebook deletion works (array with 1 element).
18///
19/// To delete multiple notebooks, call this API multiple times with one notebook at a time.
20#[derive(Debug, Clone, Serialize, Deserialize, Default)]
21pub struct BatchDeleteNotebooksRequest {
22    pub names: Vec<String>,
23}
24
25#[derive(Debug, Clone, Serialize, Deserialize, Default)]
26pub struct BatchDeleteNotebooksResponse {
27    // API returns empty response or status information
28    #[serde(flatten)]
29    pub extra: HashMap<String, serde_json::Value>,
30}
31
32#[cfg(test)]
33mod tests {
34    use super::*;
35
36    #[test]
37    fn create_notebook_request_serializes_correctly() {
38        let request = CreateNotebookRequest {
39            title: "Test Notebook".to_string(),
40        };
41        let json = serde_json::to_string(&request).unwrap();
42        assert!(json.contains(r#""title":"Test Notebook""#));
43    }
44
45    #[test]
46    fn batch_delete_notebooks_request_serializes_correctly() {
47        let request = BatchDeleteNotebooksRequest {
48            names: vec!["notebooks/123".to_string(), "notebooks/456".to_string()],
49        };
50        let json = serde_json::to_string(&request).unwrap();
51        assert!(json.contains(r#""names""#));
52        assert!(json.contains("notebooks/123"));
53        assert!(json.contains("notebooks/456"));
54    }
55
56    #[test]
57    fn batch_delete_notebooks_response_deserializes_empty() {
58        let json = r#"{}"#;
59        let response: BatchDeleteNotebooksResponse = serde_json::from_str(json).unwrap();
60        assert!(response.extra.is_empty());
61    }
62
63    #[test]
64    fn batch_delete_notebooks_response_deserializes_with_extra() {
65        let json = r#"{"customField":"value"}"#;
66        let response: BatchDeleteNotebooksResponse = serde_json::from_str(json).unwrap();
67        assert_eq!(response.extra.len(), 1);
68        assert_eq!(
69            response.extra.get("customField").unwrap().as_str().unwrap(),
70            "value"
71        );
72    }
73}