use openlark_core::{
SDKResult,
api::{ApiRequest, ApiResponseTrait, ResponseFormat},
config::Config,
http::Transport,
validate_required,
};
use serde::{Deserialize, Serialize};
use super::super::models::WikiSpace;
use crate::common::{api_endpoints::WikiApiV2, api_utils::*};
pub struct CreateWikiSpaceRequest {
config: Config,
name: String,
description: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
struct CreateWikiSpaceRequestBody {
name: String,
#[serde(skip_serializing_if = "Option::is_none")]
description: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateWikiSpaceResponse {
pub space: Option<WikiSpace>,
}
impl ApiResponseTrait for CreateWikiSpaceResponse {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
impl CreateWikiSpaceRequest {
pub fn new(config: Config) -> Self {
Self {
config,
name: String::new(),
description: None,
}
}
pub fn name(mut self, name: impl Into<String>) -> Self {
self.name = name.into();
self
}
pub fn description(mut self, description: impl Into<String>) -> Self {
self.description = Some(description.into());
self
}
pub async fn execute(self) -> SDKResult<CreateWikiSpaceResponse> {
self.execute_with_options(openlark_core::req_option::RequestOption::default())
.await
}
pub async fn execute_with_options(
self,
option: openlark_core::req_option::RequestOption,
) -> SDKResult<CreateWikiSpaceResponse> {
validate_required!(self.name, "知识空间名称不能为空");
let api_endpoint = WikiApiV2::SpaceCreate;
let request_body = CreateWikiSpaceRequestBody {
name: self.name,
description: self.description,
};
let api_request: ApiRequest<CreateWikiSpaceResponse> =
ApiRequest::post(&api_endpoint.to_url())
.body(serialize_params(&request_body, "创建知识空间")?);
let response = Transport::request(api_request, &self.config, Some(option)).await?;
extract_response_data(response, "创建知识空间")
}
}
#[deprecated(
since = "0.16.0",
note = "请使用 CreateWikiSpaceRequest 的流式 Builder 模式"
)]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateWikiSpaceParams {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_create_wiki_space_builder() {
let config = Config::default();
let request = CreateWikiSpaceRequest::new(config)
.name("测试知识库")
.description("这是一个测试知识库");
assert_eq!(request.name, "测试知识库");
assert_eq!(request.description, Some("这是一个测试知识库".to_string()));
}
#[test]
fn test_create_wiki_space_name_only() {
let config = Config::default();
let request = CreateWikiSpaceRequest::new(config).name("简单知识库");
assert_eq!(request.name, "简单知识库");
assert!(request.description.is_none());
}
#[test]
fn test_create_wiki_space_response() {
let response = CreateWikiSpaceResponse { space: None };
assert!(response.space.is_none());
}
#[test]
fn test_response_trait() {
assert_eq!(CreateWikiSpaceResponse::data_format(), ResponseFormat::Data);
}
#[test]
fn test_empty_description() {
let config = Config::default();
let request = CreateWikiSpaceRequest::new(config)
.name("知识库")
.description("");
assert_eq!(request.description, Some("".to_string()));
}
#[test]
fn test_long_description() {
let config = Config::default();
let long_desc = "这是一个很长的描述,".repeat(10);
let request = CreateWikiSpaceRequest::new(config)
.name("知识库")
.description(&long_desc);
assert_eq!(request.description.unwrap().len(), long_desc.len());
}
#[test]
#[allow(deprecated)]
fn test_deprecated_params() {
let params = CreateWikiSpaceParams {
name: "旧API知识库".to_string(),
description: Some("使用旧API创建".to_string()),
};
assert_eq!(params.name, "旧API知识库");
assert_eq!(params.description, Some("使用旧API创建".to_string()));
}
}