open_lark/service/cloud_docs/bitable/v1/app_role/
create.rs1use 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 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#[derive(Debug, Serialize, Default)]
40pub struct CreateAppRoleRequest {
41 #[serde(skip)]
42 api_request: ApiRequest,
43 #[serde(skip)]
45 app_token: String,
46 role_name: String,
48 #[serde(skip_serializing_if = "Option::is_none")]
50 table_roles: Option<Vec<TableRole>>,
51 #[serde(skip_serializing_if = "Option::is_none")]
53 block_roles: Option<Vec<BlockRole>>,
54}
55
56#[derive(Debug, Serialize, Deserialize)]
58pub struct TableRole {
59 pub table_id: String,
61 pub role: String,
63 #[serde(skip_serializing_if = "Option::is_none")]
65 rec_rule: Option<String>,
66}
67
68#[derive(Debug, Serialize, Deserialize)]
70pub struct BlockRole {
71 pub block_id: String,
73 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 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 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 pub fn table_roles(mut self, table_roles: Vec<TableRole>) -> Self {
111 self.request.table_roles = Some(table_roles);
112 self
113 }
114
115 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#[derive(Debug, Deserialize)]
137pub struct AppRole {
138 pub role_id: String,
140 pub role_name: String,
142 pub table_roles: Option<Vec<TableRole>>,
144 pub block_roles: Option<Vec<BlockRole>>,
146}
147
148#[derive(Debug, Deserialize)]
150pub struct CreateAppRoleResponse {
151 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}