use openlark_core::{
SDKResult,
api::{ApiRequest, ApiResponseTrait, ResponseFormat},
config::Config,
http::Transport,
req_option::RequestOption,
};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone)]
pub struct CollaborationRuleCreateRequestBuilder {
config: Config,
name: String,
search_visible_scope_type: String,
search_visible_scope_user_ids: Vec<String>,
search_visible_scope_department_ids: Vec<String>,
}
impl CollaborationRuleCreateRequestBuilder {
pub fn new(config: Config, name: impl Into<String>) -> Self {
Self {
config,
name: name.into(),
search_visible_scope_type: String::new(),
search_visible_scope_user_ids: Vec::new(),
search_visible_scope_department_ids: Vec::new(),
}
}
pub fn search_visible_scope_type(mut self, scope_type: impl Into<String>) -> Self {
self.search_visible_scope_type = scope_type.into();
self
}
pub fn search_visible_scope_user_id(mut self, user_id: impl Into<String>) -> Self {
self.search_visible_scope_user_ids.push(user_id.into());
self
}
pub fn search_visible_scope_department_id(mut self, department_id: impl Into<String>) -> Self {
self.search_visible_scope_department_ids
.push(department_id.into());
self
}
pub async fn execute(self) -> SDKResult<CollaborationRuleCreateResponse> {
self.execute_with_options(RequestOption::default()).await
}
pub async fn execute_with_options(
self,
option: RequestOption,
) -> SDKResult<CollaborationRuleCreateResponse> {
let url = "/open-apis/directory/v1/collaboration_rules".to_string();
let request = CollaborationRuleCreateRequest {
name: self.name,
search_visible_scope_type: self.search_visible_scope_type,
search_visible_scope_user_ids: self.search_visible_scope_user_ids,
search_visible_scope_department_ids: self.search_visible_scope_department_ids,
};
let req: ApiRequest<CollaborationRuleCreateResponse> =
ApiRequest::post(&url).body(serde_json::to_value(&request)?);
let resp = Transport::request(req, &self.config, Some(option)).await?;
resp.data
.ok_or_else(|| openlark_core::error::validation_error("Operation", "响应数据为空"))
}
}
#[derive(Debug, Clone, Deserialize, Serialize)]
struct CollaborationRuleCreateRequest {
#[serde(rename = "name")]
name: String,
#[serde(rename = "search_visible_scope_type")]
search_visible_scope_type: String,
#[serde(rename = "search_visible_scope_user_ids")]
search_visible_scope_user_ids: Vec<String>,
#[serde(rename = "search_visible_scope_department_ids")]
search_visible_scope_department_ids: Vec<String>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct CollaborationRuleCreateResponse {
#[serde(rename = "collaboration_rule_id")]
pub collaboration_rule_id: String,
#[serde(rename = "name")]
pub name: String,
#[serde(rename = "created_at")]
pub created_at: i64,
}
impl ApiResponseTrait for CollaborationRuleCreateResponse {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
#[deprecated(
note = "renamed to CollaborationRuleCreateRequestBuilder, will be removed in v1.0 (#271)"
)]
pub type CollaborationRuleCreateBuilder = CollaborationRuleCreateRequestBuilder;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_builder_basic() {
let config = openlark_core::config::Config::builder()
.app_id("test_app")
.app_secret("test_secret")
.build();
let request =
CollaborationRuleCreateRequestBuilder::new(config.clone(), "test".to_string())
.search_visible_scope_type("test".to_string())
.search_visible_scope_user_id("test".to_string());
let _ = request;
}
}