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