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