gewe_core/contact/
wecom.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Serialize, Deserialize)]
4#[serde(rename_all = "camelCase")]
5pub struct SearchWecomRequest<'a> {
6    #[serde(rename = "appId")]
7    pub app_id: &'a str,
8    pub scene: i32,
9    pub content: &'a str,
10}
11
12#[derive(Debug, Clone, Serialize, Deserialize, Default)]
13#[serde(rename_all = "camelCase")]
14pub struct SearchWecomResponse {
15    #[serde(rename = "nickName")]
16    pub nick_name: String,
17    pub sex: i32,
18    pub signature: String,
19    #[serde(rename = "bigHeadImgUrl")]
20    pub big_head_img_url: String,
21    #[serde(rename = "smallHeadImgUrl")]
22    pub small_head_img_url: String,
23    pub v3: String,
24    pub v4: String,
25}
26
27#[derive(Debug, Clone, Serialize, Deserialize)]
28#[serde(rename_all = "camelCase")]
29pub struct SyncWecomContactsRequest<'a> {
30    #[serde(rename = "appId")]
31    pub app_id: &'a str,
32}
33
34#[derive(Debug, Clone, Serialize, Deserialize, Default)]
35#[serde(rename_all = "camelCase")]
36pub struct WecomContact {
37    #[serde(rename = "userName")]
38    pub user_name: String,
39    #[serde(rename = "nickName")]
40    pub nick_name: String,
41    pub remark: String,
42    #[serde(rename = "bigHeadImg")]
43    pub big_head_img: String,
44    #[serde(rename = "smallHeadImg")]
45    pub small_head_img: String,
46    #[serde(rename = "appId")]
47    pub app_id: String,
48    #[serde(rename = "descWordingId")]
49    pub desc_wording_id: String,
50}
51
52pub type SyncWecomContactsResponse = Vec<WecomContact>;
53
54#[derive(Debug, Clone, Serialize, Deserialize)]
55#[serde(rename_all = "camelCase")]
56pub struct AddWecomContactRequest<'a> {
57    #[serde(rename = "appId")]
58    pub app_id: &'a str,
59    pub v3: &'a str,
60    pub v4: &'a str,
61}
62
63pub type AddWecomContactResponse = ();
64
65#[derive(Debug, Clone, Serialize, Deserialize)]
66#[serde(rename_all = "camelCase")]
67pub struct GetWecomContactDetailRequest<'a> {
68    #[serde(rename = "appId")]
69    pub app_id: &'a str,
70    #[serde(rename = "toUserName")]
71    pub to_user_name: &'a str,
72}
73
74#[derive(Debug, Clone, Serialize, Deserialize, Default)]
75#[serde(rename_all = "camelCase")]
76pub struct WecomContactDetail {
77    #[serde(rename = "userName")]
78    pub user_name: String,
79    #[serde(rename = "nickName")]
80    pub nick_name: String,
81    pub remark: String,
82    #[serde(rename = "bigHeadImg")]
83    pub big_head_img: String,
84    #[serde(rename = "smallHeadImg")]
85    pub small_head_img: String,
86    #[serde(rename = "appId")]
87    pub app_id: String,
88    #[serde(rename = "descWordingId")]
89    pub desc_wording_id: String,
90    pub wording: String,
91    #[serde(rename = "wordingPinyin")]
92    pub wording_pinyin: String,
93    #[serde(rename = "wordingQuanpin")]
94    pub wording_quanpin: String,
95}
96
97pub type GetWecomContactDetailResponse = WecomContactDetail;
98
99#[cfg(test)]
100mod tests {
101    use super::*;
102
103    #[test]
104    fn test_search_wecom_response_default() {
105        let resp = SearchWecomResponse::default();
106        assert_eq!(resp.nick_name, "");
107        assert_eq!(resp.sex, 0);
108        assert_eq!(resp.signature, "");
109        assert_eq!(resp.v3, "");
110        assert_eq!(resp.v4, "");
111    }
112
113    #[test]
114    fn test_search_wecom_response_deserialization() {
115        let json = r#"{
116            "nickName": "WecomUser",
117            "sex": 1,
118            "signature": "Enterprise contact",
119            "bigHeadImgUrl": "http://example.com/big.jpg",
120            "smallHeadImgUrl": "http://example.com/small.jpg",
121            "v3": "test_v3",
122            "v4": "test_v4"
123        }"#;
124        let resp: SearchWecomResponse = serde_json::from_str(json).unwrap();
125        assert_eq!(resp.nick_name, "WecomUser");
126        assert_eq!(resp.sex, 1);
127        assert_eq!(resp.signature, "Enterprise contact");
128        assert_eq!(resp.v3, "test_v3");
129        assert_eq!(resp.v4, "test_v4");
130    }
131
132    #[test]
133    fn test_wecom_contact_default() {
134        let contact = WecomContact::default();
135        assert_eq!(contact.user_name, "");
136        assert_eq!(contact.nick_name, "");
137        assert_eq!(contact.remark, "");
138        assert_eq!(contact.app_id, "");
139    }
140
141    #[test]
142    fn test_wecom_contact_deserialization() {
143        let json = r#"{
144            "userName": "wecom_user",
145            "nickName": "WecomUser",
146            "remark": "Enterprise contact",
147            "bigHeadImg": "http://example.com/big.jpg",
148            "smallHeadImg": "http://example.com/small.jpg",
149            "appId": "test_app",
150            "descWordingId": "wording123"
151        }"#;
152        let contact: WecomContact = serde_json::from_str(json).unwrap();
153        assert_eq!(contact.user_name, "wecom_user");
154        assert_eq!(contact.nick_name, "WecomUser");
155        assert_eq!(contact.remark, "Enterprise contact");
156        assert_eq!(contact.app_id, "test_app");
157        assert_eq!(contact.desc_wording_id, "wording123");
158    }
159
160    #[test]
161    fn test_wecom_contact_detail_default() {
162        let detail = WecomContactDetail::default();
163        assert_eq!(detail.user_name, "");
164        assert_eq!(detail.nick_name, "");
165        assert_eq!(detail.wording, "");
166    }
167
168    #[test]
169    fn test_wecom_contact_detail_deserialization() {
170        let json = r#"{
171            "userName": "wecom_user",
172            "nickName": "WecomUser",
173            "remark": "Enterprise contact",
174            "bigHeadImg": "http://example.com/big.jpg",
175            "smallHeadImg": "http://example.com/small.jpg",
176            "appId": "test_app",
177            "descWordingId": "wording123",
178            "wording": "Department: Sales",
179            "wordingPinyin": "bmxs",
180            "wordingQuanpin": "bumenxiaoshou"
181        }"#;
182        let detail: WecomContactDetail = serde_json::from_str(json).unwrap();
183        assert_eq!(detail.user_name, "wecom_user");
184        assert_eq!(detail.nick_name, "WecomUser");
185        assert_eq!(detail.wording, "Department: Sales");
186        assert_eq!(detail.wording_pinyin, "bmxs");
187        assert_eq!(detail.wording_quanpin, "bumenxiaoshou");
188    }
189
190    #[test]
191    fn test_search_wecom_request_serialization() {
192        let req = SearchWecomRequest {
193            app_id: "test_app",
194            scene: 1,
195            content: "search_term",
196        };
197        let json = serde_json::to_string(&req).unwrap();
198        assert!(json.contains("test_app"));
199        assert!(json.contains("search_term"));
200    }
201
202    #[test]
203    fn test_sync_wecom_contacts_request_serialization() {
204        let req = SyncWecomContactsRequest { app_id: "test_app" };
205        let json = serde_json::to_string(&req).unwrap();
206        assert!(json.contains("test_app"));
207    }
208
209    #[test]
210    fn test_add_wecom_contact_request_serialization() {
211        let req = AddWecomContactRequest {
212            app_id: "test_app",
213            v3: "test_v3",
214            v4: "test_v4",
215        };
216        let json = serde_json::to_string(&req).unwrap();
217        assert!(json.contains("test_app"));
218        assert!(json.contains("test_v3"));
219        assert!(json.contains("test_v4"));
220    }
221
222    #[test]
223    fn test_get_wecom_contact_detail_request_serialization() {
224        let req = GetWecomContactDetailRequest {
225            app_id: "test_app",
226            to_user_name: "wecom_user",
227        };
228        let json = serde_json::to_string(&req).unwrap();
229        assert!(json.contains("test_app"));
230        assert!(json.contains("wecom_user"));
231    }
232}