wecom_rs/client/contact/async_export/
mod.rs

1use crate::Result;
2use async_trait::async_trait;
3use serde::{Deserialize, Serialize};
4
5#[async_trait]
6pub trait AsyncExporter {
7    /// 导出成员
8    /// https://developer.work.weixin.qq.com/document/path/94849
9    /// @return string 任务ID,可通过获取导出结果接口查询任务结果
10    async fn export_user_simple(&self, params: ParamsExport) -> Result<String>;
11    /// 导出成员详情
12    /// https://developer.work.weixin.qq.com/document/path/94851
13    /// @return string 任务ID,可通过获取导出结果接口查询任务结果
14    async fn export_user(&self, params: ParamsExport) -> Result<String>;
15    /// 导出部门
16    /// https://developer.work.weixin.qq.com/document/path/94852
17    /// @return string 任务ID,可通过获取导出结果接口查询任务结果
18    async fn export_department(&self, params: ParamsExport) -> Result<String>;
19    /// 导出标签成员
20    /// https://developer.work.weixin.qq.com/document/path/94853
21    /// @return string 任务ID,可通过获取导出结果接口查询任务结果
22    async fn export_tag_user(&self, params: ParamsExport) -> Result<String>;
23    /// 获取导出结果
24    /// https://developer.work.weixin.qq.com/document/path/94854
25    /// @return string 任务ID,可通过获取导出结果接口查询任务结果
26    async fn export_result_get(&self, job_id: &str) -> Result<ResponseExportResultGet>;
27}
28
29/// 导出任务完成通知
30#[derive(Debug, Deserialize, Serialize, Default)]
31#[serde(rename_all = "PascalCase")]
32pub struct ExportCompleteNotify {
33    /// 企业微信CorpID
34    pub to_user_name: String,
35    /// 此时固定为sys
36    pub from_user_name: String,
37    /// 消息创建时间(整型)
38    pub create_time: i64,
39    /// 消息类型,此时固定为:event
40    pub msg_type: String,
41    /// 事件类型:batch_job_result
42    pub event: String,
43    pub batch_job: Option<BatchJob>,
44}
45
46#[derive(Debug, Deserialize, Serialize, Default)]
47#[serde(rename_all = "PascalCase", rename = "xml")]
48pub struct BatchJob {
49    /// 异步任务id,最大长度为64字符
50    pub job_id: String,
51    /// 操作类型,字符串,在异步导出的场景下分别有:
52    /// export_user(导出成员详情)、
53    /// export_simple_user(导出成员)、
54    /// export_department(导出部门)、
55    /// export_tag(导出标签成员)
56    pub job_type: String,
57    /// 返回码
58    pub err_code: i32,
59    /// 对返回码的文本描述内容
60    pub err_msg: String,
61}
62
63mod dto;
64pub use dto::*;
65
66mod model;
67pub use model::*;
68
69#[cfg(test)]
70mod tests {
71    use super::*;
72    use anyhow::Result;
73    use quick_xml::de::from_str;
74
75    #[test]
76    fn test_parse_xml_evnet_export_complete_notify() -> Result<()> {
77        let xml_str = r#"<xml>
78<ToUserName><![CDATA[wx28dbb14e3720FAKE]]></ToUserName>
79<FromUserName><![CDATA[FromUser]]></FromUserName>
80<CreateTime>1425284517</CreateTime>
81<MsgType><![CDATA[event]]></MsgType>
82<Event><![CDATA[batch_job_result]]></Event>
83<BatchJob>
84    <JobId><![CDATA[jobid_S0MrnndvRG5fadSlLwiBqiDDbM143UqTmKP3152FZk4]]></JobId>
85    <JobType><![CDATA[export_user]]></JobType>
86    <ErrCode>0</ErrCode>
87    <ErrMsg><![CDATA[ok]]></ErrMsg>
88</BatchJob>
89</xml>"#;
90
91        let xml: ExportCompleteNotify = from_str(xml_str)?;
92        assert_eq!("ok", xml.batch_job.unwrap().err_msg);
93        Ok(())
94    }
95}