use openlark_core::{
SDKResult,
api::{ApiRequest, ApiResponseTrait, ResponseFormat},
config::Config,
http::Transport,
validate_required,
};
use serde::{Deserialize, Serialize};
use crate::common::{api_endpoints::DriveApi, api_utils::*};
#[derive(Debug, Clone)]
pub struct DeletePermissionMemberRequest {
config: Config,
pub token: String,
pub member_id: String,
pub file_type: String,
pub member_type: String,
pub perm_type: Option<String>,
pub member_kind: Option<String>,
}
impl DeletePermissionMemberRequest {
pub fn new(
config: Config,
token: impl Into<String>,
member_id: impl Into<String>,
file_type: impl Into<String>,
member_type: impl Into<String>,
) -> Self {
Self {
config,
token: token.into(),
member_id: member_id.into(),
file_type: file_type.into(),
member_type: member_type.into(),
perm_type: None,
member_kind: None,
}
}
pub fn perm_type(mut self, perm_type: impl Into<String>) -> Self {
self.perm_type = Some(perm_type.into());
self
}
pub fn member_kind(mut self, member_kind: impl Into<String>) -> Self {
self.member_kind = Some(member_kind.into());
self
}
pub async fn execute(self) -> SDKResult<DeletePermissionMemberResponse> {
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<DeletePermissionMemberResponse> {
validate_required!(self.token, "token 不能为空");
validate_required!(self.member_id, "member_id 不能为空");
validate_required!(self.file_type, "file_type 不能为空");
validate_required!(self.member_type, "member_type 不能为空");
match self.file_type.as_str() {
"doc" | "sheet" | "file" | "wiki" | "bitable" | "docx" | "folder" | "mindnote"
| "minutes" | "slides" => {}
_ => {
return Err(openlark_core::error::validation_error(
"file_type",
"file_type 必须为 doc/sheet/file/wiki/bitable/docx/folder/mindnote/minutes/slides",
));
}
}
match self.member_type.as_str() {
"email" | "openid" | "unionid" | "openchat" | "opendepartmentid" | "userid"
| "groupid" | "wikispaceid" => {}
_ => {
return Err(openlark_core::error::validation_error(
"member_type",
"member_type 必须为 email/openid/unionid/openchat/opendepartmentid/userid/groupid/wikispaceid",
));
}
}
if let Some(perm_type) = &self.perm_type {
match perm_type.as_str() {
"container" | "single_page" => {}
_ => {
return Err(openlark_core::error::validation_error(
"perm_type",
"perm_type 必须为 container/single_page",
));
}
}
}
if let Some(member_kind) = &self.member_kind {
match member_kind.as_str() {
"user" | "chat" | "department" | "group" | "wiki_space_member"
| "wiki_space_viewer" | "wiki_space_editor" => {}
_ => {
return Err(openlark_core::error::validation_error(
"type",
"type 必须为 user/chat/department/group/wiki_space_member/wiki_space_viewer/wiki_space_editor",
));
}
}
}
if self.member_type == "wikispaceid" {
match self.member_kind.as_deref() {
Some("wiki_space_member" | "wiki_space_viewer" | "wiki_space_editor") => {}
_ => {
return Err(openlark_core::error::validation_error(
"type",
"当 member_type=wikispaceid 时,type 必须为 wiki_space_member/wiki_space_viewer/wiki_space_editor",
));
}
}
}
let api_endpoint =
DriveApi::DeletePermissionMember(self.token.clone(), self.member_id.clone());
#[derive(Serialize)]
struct DeletePermissionMemberRequestBody {
#[serde(rename = "type", skip_serializing_if = "Option::is_none")]
r#type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
perm_type: Option<String>,
}
let body = DeletePermissionMemberRequestBody {
r#type: self.member_kind,
perm_type: self.perm_type,
};
let api_request =
ApiRequest::<DeletePermissionMemberResponse>::delete(&api_endpoint.to_url())
.query("type", &self.file_type)
.query("member_type", &self.member_type)
.body(serialize_params(&body, "移除云文档协作者权限")?);
let response = Transport::request(api_request, &self.config, Some(option)).await?;
extract_response_data(response, "删除")
}
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct DeletePermissionMemberResponse {}
impl ApiResponseTrait for DeletePermissionMemberResponse {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_delete_permission_member_request_builder() {
let config = Config::default();
let request =
DeletePermissionMemberRequest::new(config, "file_token", "member_id", "docx", "openid")
.perm_type("container");
assert_eq!(request.token, "file_token");
assert_eq!(request.member_id, "member_id");
assert_eq!(request.file_type, "docx");
assert_eq!(request.member_type, "openid");
assert_eq!(request.perm_type, Some("container".to_string()));
}
#[test]
fn test_response_trait() {
assert_eq!(
DeletePermissionMemberResponse::data_format(),
ResponseFormat::Data
);
}
#[test]
fn test_empty_token_validation() {
let config = Config::default();
let request = DeletePermissionMemberRequest::new(config, "", "member_id", "docx", "openid");
assert_eq!(request.token, "");
}
#[test]
fn test_empty_member_id_validation() {
let config = Config::default();
let request =
DeletePermissionMemberRequest::new(config, "file_token", "", "docx", "openid");
assert_eq!(request.member_id, "");
}
#[test]
fn test_empty_file_type_validation() {
let config = Config::default();
let request =
DeletePermissionMemberRequest::new(config, "file_token", "member_id", "", "openid");
assert_eq!(request.file_type, "");
}
#[test]
fn test_invalid_file_type_validation() {
let config = Config::default();
let request = DeletePermissionMemberRequest::new(
config,
"file_token",
"member_id",
"invalid_type",
"openid",
);
assert_eq!(request.file_type, "invalid_type");
}
#[test]
fn test_empty_member_type_validation() {
let config = Config::default();
let request =
DeletePermissionMemberRequest::new(config, "file_token", "member_id", "docx", "");
assert_eq!(request.member_type, "");
}
#[test]
fn test_invalid_member_type_validation() {
let config = Config::default();
let request = DeletePermissionMemberRequest::new(
config,
"file_token",
"member_id",
"docx",
"invalid_type",
);
assert_eq!(request.member_type, "invalid_type");
}
#[test]
fn test_invalid_perm_type_validation() {
let config = Config::default();
let request =
DeletePermissionMemberRequest::new(config, "file_token", "member_id", "docx", "openid")
.perm_type("invalid_perm_type");
assert_eq!(request.perm_type, Some("invalid_perm_type".to_string()));
}
#[test]
fn test_invalid_member_kind_validation() {
let config = Config::default();
let request =
DeletePermissionMemberRequest::new(config, "file_token", "member_id", "docx", "openid")
.member_kind("invalid_kind");
assert_eq!(request.member_kind, Some("invalid_kind".to_string()));
}
#[test]
fn test_wikispaceid_without_member_kind_validation() {
let config = Config::default();
let request = DeletePermissionMemberRequest::new(
config,
"file_token",
"member_id",
"docx",
"wikispaceid",
);
assert_eq!(request.member_type, "wikispaceid");
assert_eq!(request.member_kind, None);
}
}