open_lark/service/cloud_docs/bitable/v1/app_role/
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        constants::AccessTokenType,
9        endpoints::cloud_docs::*,
10        http::Transport,
11        req_option::RequestOption,
12        SDKResult,
13    },
14    impl_executable_builder_owned,
15};
16
17use super::AppRoleService;
18
19impl AppRoleService {
20    /// 新增自定义角色
21    pub async fn create(
22        &self,
23        request: CreateAppRoleRequest,
24        option: Option<RequestOption>,
25    ) -> SDKResult<BaseResponse<CreateAppRoleResponse>> {
26        let mut api_req = request.api_request;
27        api_req.http_method = Method::POST;
28        api_req.api_path = BITABLE_V1_ROLES.replace("{app_token}", &request.app_token);
29        api_req.supported_access_token_types = vec![AccessTokenType::Tenant, AccessTokenType::User];
30
31        let api_resp = Transport::request(api_req, &self.config, option).await?;
32        Ok(api_resp)
33    }
34}
35
36/// 新增自定义角色请求
37#[derive(Debug, Serialize, Default)]
38pub struct CreateAppRoleRequest {
39    #[serde(skip)]
40    api_request: ApiRequest,
41    /// 多维表格的唯一标识符
42    #[serde(skip)]
43    app_token: String,
44    /// 角色名称
45    role_name: String,
46    /// 数据表权限
47    #[serde(skip_serializing_if = "Option::is_none")]
48    table_roles: Option<Vec<TableRole>>,
49    /// 数据表默认权限
50    #[serde(skip_serializing_if = "Option::is_none")]
51    block_roles: Option<Vec<BlockRole>>,
52}
53
54/// 数据表权限
55#[derive(Debug, Serialize, Deserialize, PartialEq, Clone)]
56pub struct TableRole {
57    /// 数据表 id
58    pub table_id: String,
59    /// 权限
60    pub role: String,
61    /// 记录权限
62    #[serde(skip_serializing_if = "Option::is_none")]
63    rec_rule: Option<String>,
64}
65
66/// 数据表默认权限
67#[derive(Debug, Serialize, Deserialize, PartialEq, Clone)]
68pub struct BlockRole {
69    /// 多维表格数据表的唯一标识符
70    pub block_id: String,
71    /// 权限
72    pub role: String,
73}
74
75impl CreateAppRoleRequest {
76    pub fn builder() -> CreateAppRoleRequestBuilder {
77        CreateAppRoleRequestBuilder::default()
78    }
79
80    pub fn new(app_token: impl ToString, role_name: impl ToString) -> Self {
81        Self {
82            app_token: app_token.to_string(),
83            role_name: role_name.to_string(),
84            ..Default::default()
85        }
86    }
87}
88
89#[derive(Default)]
90pub struct CreateAppRoleRequestBuilder {
91    request: CreateAppRoleRequest,
92}
93
94impl CreateAppRoleRequestBuilder {
95    /// 多维表格的唯一标识符
96    pub fn app_token(mut self, app_token: impl ToString) -> Self {
97        self.request.app_token = app_token.to_string();
98        self
99    }
100
101    /// 角色名称
102    pub fn role_name(mut self, role_name: impl ToString) -> Self {
103        self.request.role_name = role_name.to_string();
104        self
105    }
106
107    /// 数据表权限
108    pub fn table_roles(mut self, table_roles: Vec<TableRole>) -> Self {
109        self.request.table_roles = Some(table_roles);
110        self
111    }
112
113    /// 数据表默认权限
114    pub fn block_roles(mut self, block_roles: Vec<BlockRole>) -> Self {
115        self.request.block_roles = Some(block_roles);
116        self
117    }
118
119    pub fn build(mut self) -> CreateAppRoleRequest {
120        self.request.api_request.body = serde_json::to_vec(&self.request).unwrap();
121        self.request
122    }
123}
124
125impl_executable_builder_owned!(
126    CreateAppRoleRequestBuilder,
127    AppRoleService,
128    CreateAppRoleRequest,
129    BaseResponse<CreateAppRoleResponse>,
130    create
131);
132
133/// 自定义角色信息
134#[derive(Debug, Deserialize)]
135pub struct AppRole {
136    /// 自定义角色的id
137    pub role_id: String,
138    /// 角色名称
139    pub role_name: String,
140    /// 数据表权限
141    pub table_roles: Option<Vec<TableRole>>,
142    /// 数据表默认权限
143    pub block_roles: Option<Vec<BlockRole>>,
144}
145
146/// 新增自定义角色响应
147#[derive(Debug, Deserialize)]
148pub struct CreateAppRoleResponse {
149    /// 新增的自定义角色信息
150    pub role: AppRole,
151}
152
153impl ApiResponseTrait for CreateAppRoleResponse {
154    fn data_format() -> ResponseFormat {
155        ResponseFormat::Data
156    }
157}
158
159#[cfg(test)]
160#[allow(unused_variables, unused_unsafe)]
161mod tests {
162    use super::*;
163
164    #[test]
165    fn test_create_app_role_request_builder() {
166        let table_roles = vec![TableRole {
167            table_id: "tblxxxxxx".to_string(),
168            role: "editor".to_string(),
169            rec_rule: Some("all".to_string()),
170        }];
171
172        let request = CreateAppRoleRequest::builder()
173            .app_token("bascnmBA*****yGehy8")
174            .role_name("测试自定义角色")
175            .table_roles(table_roles)
176            .build();
177
178        assert_eq!(request.app_token, "bascnmBA*****yGehy8");
179        assert_eq!(request.role_name, "测试自定义角色");
180        assert!(request.table_roles.is_some());
181    }
182}