open_lark/service/cloud_docs/wiki/v2/space/
create.rs

1use reqwest::Method;
2use serde::{Deserialize, Serialize};
3
4use crate::{
5    core::{
6        api_req::ApiRequest,
7        api_resp::{ApiResponseTrait, BaseResponse, ResponseFormat},
8        config::Config,
9        constants::AccessTokenType,
10        endpoints::cloud_docs::*,
11        http::Transport,
12        req_option::RequestOption,
13        SDKResult,
14    },
15    impl_executable_builder_owned,
16};
17
18/// 创建知识空间请求
19#[derive(Debug, Serialize, Default)]
20pub struct CreateSpaceRequest {
21    #[serde(skip)]
22    api_request: ApiRequest,
23    /// 知识空间名称
24    name: String,
25    /// 知识空间描述
26    #[serde(skip_serializing_if = "Option::is_none")]
27    description: Option<String>,
28}
29
30impl CreateSpaceRequest {
31    pub fn builder() -> CreateSpaceRequestBuilder {
32        CreateSpaceRequestBuilder::default()
33    }
34
35    pub fn new(name: impl ToString) -> Self {
36        Self {
37            name: name.to_string(),
38            ..Default::default()
39        }
40    }
41}
42
43#[derive(Default)]
44pub struct CreateSpaceRequestBuilder {
45    request: CreateSpaceRequest,
46}
47
48impl CreateSpaceRequestBuilder {
49    /// 知识空间名称
50    pub fn name(mut self, name: impl ToString) -> Self {
51        self.request.name = name.to_string();
52        self
53    }
54
55    /// 知识空间描述
56    pub fn description(mut self, description: impl ToString) -> Self {
57        self.request.description = Some(description.to_string());
58        self
59    }
60
61    pub fn build(mut self) -> CreateSpaceRequest {
62        self.request.api_request.body = serde_json::to_vec(&self.request).unwrap();
63        self.request
64    }
65}
66
67impl_executable_builder_owned!(
68    CreateSpaceRequestBuilder,
69    crate::service::cloud_docs::wiki::v2::space::SpaceService,
70    CreateSpaceRequest,
71    BaseResponse<CreateSpaceResponse>,
72    create
73);
74
75/// 创建的知识空间信息
76#[derive(Debug, Deserialize)]
77pub struct CreatedSpace {
78    /// 知识空间id
79    pub space_id: String,
80    /// 知识空间名称
81    pub name: String,
82    /// 知识空间描述
83    #[serde(default)]
84    pub description: Option<String>,
85    /// 知识空间类型
86    pub space_type: Option<String>,
87    /// 知识空间可见性
88    pub visibility: Option<String>,
89}
90
91/// 创建知识空间响应
92#[derive(Debug, Deserialize)]
93pub struct CreateSpaceResponse {
94    /// 创建的知识空间信息
95    pub space: CreatedSpace,
96}
97
98impl ApiResponseTrait for CreateSpaceResponse {
99    fn data_format() -> ResponseFormat {
100        ResponseFormat::Data
101    }
102}
103
104/// 创建知识空间
105pub async fn create_space(
106    request: CreateSpaceRequest,
107    config: &Config,
108    option: Option<RequestOption>,
109) -> SDKResult<BaseResponse<CreateSpaceResponse>> {
110    let mut api_req = request.api_request;
111    api_req.http_method = Method::POST;
112    api_req.api_path = WIKI_V2_SPACES.to_string();
113    api_req.supported_access_token_types = vec![AccessTokenType::Tenant, AccessTokenType::User];
114
115    let api_resp = Transport::request(api_req, config, option).await?;
116    Ok(api_resp)
117}
118
119#[cfg(test)]
120#[allow(unused_variables, unused_unsafe)]
121mod tests {
122    use super::*;
123
124    #[test]
125    fn test_create_space_request_builder() {
126        let request = CreateSpaceRequest::builder()
127            .name("我的知识空间")
128            .description("这是一个测试知识空间")
129            .build();
130
131        assert_eq!(request.name, "我的知识空间");
132        assert_eq!(
133            request.description,
134            Some("这是一个测试知识空间".to_string())
135        );
136    }
137}