wecom_rs/client/external_contact/enterprise_service/
enterprise_service.rs

1use super::{
2    ContactWay, EnterpriseServiceManager, ParamsContactWayCreate, ParamsContactWayList,
3    ParamsContactWayUpdate, RespContactWayCreate,
4};
5use crate::{client::BASE_URL, common::model::Response, Client, Result};
6use async_trait::async_trait;
7use reqwest::Method;
8use serde::{Deserialize, Serialize};
9
10#[async_trait]
11impl EnterpriseServiceManager for Client {
12    async fn get_follow_user_list(&self) -> Result<Vec<String>> {
13        let token = self.custom_contact_access_token().await?;
14        let resp = self
15            .request::<Response<FollowUserList>>(
16                Method::GET,
17                &format!("{BASE_URL}/externalcontact/get_follow_user_list?access_token={token}"),
18                None,
19            )
20            .await?;
21
22        Ok(resp.data.unwrap().follow_user)
23    }
24
25    async fn contact_way_create(
26        &self,
27        params: ParamsContactWayCreate,
28    ) -> Result<RespContactWayCreate> {
29        let token = self.custom_contact_access_token().await?;
30        let resp = self
31            .request::<Response<RespContactWayCreate>>(
32                Method::POST,
33                &format!("{BASE_URL}/externalcontact/add_contact_way?access_token={token}"),
34                Some(serde_json::to_value(&params)?),
35            )
36            .await?;
37
38        Ok(resp.data.unwrap())
39    }
40
41    async fn contact_way_get(&self, config_id: &str) -> Result<ContactWay> {
42        let token = self.custom_contact_access_token().await?;
43        let resp = self
44            .request::<Response<ContactWay>>(
45                Method::POST,
46                &format!("{BASE_URL}/externalcontact/get_contact_way?access_token={token}"),
47                Some(serde_json::json!({ "config_id": config_id })),
48            )
49            .await?;
50
51        Ok(resp.data.unwrap())
52    }
53
54    async fn contact_way_list(
55        &self,
56        params: Option<ParamsContactWayList>,
57    ) -> Result<Vec<ContactWay>> {
58        let token = self.custom_contact_access_token().await?;
59
60        let params = if let Some(params) = params {
61            Some(serde_json::to_value(&params)?)
62        } else {
63            None
64        };
65        let resp = self
66            .request::<Response<Vec<ContactWay>>>(
67                Method::POST,
68                &format!("{BASE_URL}/externalcontact/list_contact_way?access_token={token}"),
69                params,
70            )
71            .await?;
72
73        Ok(resp.data.unwrap_or(vec![]))
74    }
75
76    async fn contact_way_update(&self, params: ParamsContactWayUpdate) -> Result<()> {
77        let token = self.custom_contact_access_token().await?;
78        self.request::<Response<()>>(
79            Method::POST,
80            &format!("{BASE_URL}/externalcontact/update_contact_way?access_token={token}"),
81            Some(serde_json::to_value(&params)?),
82        )
83        .await?;
84
85        Ok(())
86    }
87
88    async fn contact_way_delete(&self, config_id: &str) -> Result<()> {
89        let token = self.custom_contact_access_token().await?;
90        self.request::<Response<()>>(
91            Method::POST,
92            &format!("{BASE_URL}//externalcontact/del_contact_way?access_token={token}"),
93            Some(serde_json::json!({ "config_id": config_id })),
94        )
95        .await?;
96
97        Ok(())
98    }
99
100    async fn temp_chat_close(&self, userid: &str, external_userid: &str) -> Result<()> {
101        let token = self.custom_contact_access_token().await?;
102        self.request::<Response<()>>(
103            Method::POST,
104            &format!("{BASE_URL}/externalcontact/close_temp_chat?access_token={token}"),
105            Some(serde_json::json!({"userid": userid, "external_userid": external_userid})),
106        )
107        .await?;
108
109        Ok(())
110    }
111}
112
113#[derive(Debug, Deserialize, Serialize, Default)]
114struct FollowUserList {
115    /// 配置了客户联系功能的成员userid列表
116    follow_user: Vec<String>,
117}