open_lark/service/contact/v3/
scope.rs

1use crate::core::{
2    api_req::ApiRequest, api_resp::ApiResponseTrait, config::Config, constants::AccessTokenType,
3    http::Transport, trait_system::Service,
4};
5use serde::{Deserialize, Serialize};
6
7/// 权限范围服务
8///
9/// 用于管理通讯录的访问权限范围,包括:
10/// - 获取通讯录授权范围
11/// - 权限范围变更事件处理
12pub struct ScopeService {
13    config: Config,
14}
15
16impl ScopeService {
17    pub fn new(config: Config) -> Self {
18        Self { config }
19    }
20
21    /// 获取通讯录授权范围
22    pub async fn list(&self, _req: &GetScopeRequest) -> crate::core::SDKResult<GetScopeResponse> {
23        let api_req = ApiRequest {
24            http_method: reqwest::Method::GET,
25            api_path: crate::core::endpoints::contact::CONTACT_V3_SCOPES.to_string(),
26            supported_access_token_types: vec![AccessTokenType::Tenant],
27            body: Vec::new(),
28            query_params: std::collections::HashMap::new(),
29            ..Default::default()
30        };
31
32        let resp = Transport::<GetScopeResponse>::request(api_req, &self.config, None).await?;
33        Ok(resp.data.unwrap_or_default())
34    }
35}
36
37impl Service for ScopeService {
38    fn config(&self) -> &Config {
39        &self.config
40    }
41
42    fn service_name() -> &'static str {
43        "scope"
44    }
45
46    fn service_version() -> &'static str {
47        "v3"
48    }
49}
50
51/// 获取权限范围请求
52#[derive(Debug, Clone, Default, Serialize, Deserialize)]
53pub struct GetScopeRequest {
54    /// 用户 ID 类型
55    #[serde(skip_serializing_if = "Option::is_none")]
56    pub user_id_type: Option<String>,
57    /// 部门 ID 类型  
58    #[serde(skip_serializing_if = "Option::is_none")]
59    pub department_id_type: Option<String>,
60    /// 分页大小
61    #[serde(skip_serializing_if = "Option::is_none")]
62    pub page_size: Option<i32>,
63    /// 分页标记
64    #[serde(skip_serializing_if = "Option::is_none")]
65    pub page_token: Option<String>,
66}
67
68/// 获取权限范围响应
69#[derive(Debug, Clone, Serialize, Deserialize, Default)]
70pub struct GetScopeResponse {
71    /// 权限范围列表
72    pub scopes: Vec<Scope>,
73    /// 是否还有更多项目
74    #[serde(skip_serializing_if = "Option::is_none")]
75    pub has_more: Option<bool>,
76    /// 分页标记
77    #[serde(skip_serializing_if = "Option::is_none")]
78    pub page_token: Option<String>,
79}
80
81impl ApiResponseTrait for GetScopeResponse {
82    fn data_format() -> crate::core::api_resp::ResponseFormat {
83        crate::core::api_resp::ResponseFormat::Data
84    }
85}
86
87/// 权限范围
88#[derive(Debug, Clone, Serialize, Deserialize)]
89pub struct Scope {
90    /// 部门列表
91    #[serde(skip_serializing_if = "Option::is_none")]
92    pub departments: Option<Vec<ScopeDepartment>>,
93    /// 用户列表
94    #[serde(skip_serializing_if = "Option::is_none")]
95    pub users: Option<Vec<ScopeUser>>,
96    /// 用户组列表
97    #[serde(skip_serializing_if = "Option::is_none")]
98    pub groups: Option<Vec<ScopeGroup>>,
99}
100
101/// 权限范围内的部门
102#[derive(Debug, Clone, Serialize, Deserialize)]
103pub struct ScopeDepartment {
104    /// 部门ID
105    #[serde(skip_serializing_if = "Option::is_none")]
106    pub department_id: Option<String>,
107    /// 部门名称
108    #[serde(skip_serializing_if = "Option::is_none")]
109    pub name: Option<String>,
110}
111
112/// 权限范围内的用户
113#[derive(Debug, Clone, Serialize, Deserialize)]
114pub struct ScopeUser {
115    /// 用户ID
116    #[serde(skip_serializing_if = "Option::is_none")]
117    pub user_id: Option<String>,
118    /// 用户名称
119    #[serde(skip_serializing_if = "Option::is_none")]
120    pub name: Option<String>,
121}
122
123/// 权限范围内的用户组
124#[derive(Debug, Clone, Serialize, Deserialize)]
125pub struct ScopeGroup {
126    /// 用户组ID
127    #[serde(skip_serializing_if = "Option::is_none")]
128    pub group_id: Option<String>,
129    /// 用户组名称
130    #[serde(skip_serializing_if = "Option::is_none")]
131    pub name: Option<String>,
132}