slack_rust/conversations/
invite.rs1use crate::channels::channel::Channel;
2use crate::error::Error;
3use crate::http_client::{get_slack_url, ResponseMetadata, SlackWebAPIClient};
4use serde::{Deserialize, Serialize};
5use serde_with::skip_serializing_none;
6
7#[skip_serializing_none]
8#[derive(Deserialize, Serialize, Debug, Default, PartialEq)]
9pub struct InviteRequest {
10 pub channel: String,
11 pub users: String,
12}
13
14#[skip_serializing_none]
15#[derive(Deserialize, Serialize, Debug, Default, PartialEq)]
16pub struct InviteResponse {
17 pub ok: bool,
18 pub error: Option<String>,
19 pub response_metadata: Option<ResponseMetadata>,
20 pub channel: Option<Channel>,
21}
22
23pub async fn invite<T>(
24 client: &T,
25 param: &InviteRequest,
26 bot_token: &str,
27) -> Result<InviteResponse, Error>
28where
29 T: SlackWebAPIClient,
30{
31 let url = get_slack_url("conversations.invite");
32 let json = serde_json::to_string(¶m)?;
33
34 client
35 .post_json(&url, &json, bot_token)
36 .await
37 .and_then(|result| {
38 serde_json::from_str::<InviteResponse>(&result).map_err(Error::SerdeJsonError)
39 })
40}
41
42#[cfg(test)]
43mod test {
44 use super::*;
45 use crate::channels::channel::{Purpose, Topic};
46 use crate::http_client::MockSlackWebAPIClient;
47
48 #[test]
49 fn convert_request() {
50 let request = InviteRequest {
51 channel: "C1234567890".to_string(),
52 users: "W1234567890,U2345678901,U3456789012".to_string(),
53 };
54 let json = r##"{
55 "channel": "C1234567890",
56 "users": "W1234567890,U2345678901,U3456789012"
57}"##;
58
59 let j = serde_json::to_string_pretty(&request).unwrap();
60 assert_eq!(json, j);
61
62 let s = serde_json::from_str::<InviteRequest>(json).unwrap();
63 assert_eq!(request, s);
64 }
65
66 #[test]
67 fn convert_response() {
68 let response = InviteResponse {
69 ok: true,
70 channel: Some(Channel {
71 id: Some("C0EAQDV4Z".to_string()),
72 name: Some("endeavor".to_string()),
73 is_channel: Some(true),
74 created: Some(1504554479),
75 creator: Some("U0123456".to_string()),
76 is_archived: Some(false),
77 is_general: Some(false),
78 name_normalized: Some("endeavor".to_string()),
79 is_shared: Some(false),
80 is_org_shared: Some(false),
81 is_member: Some(false),
82 is_private: Some(false),
83 is_mpim: Some(false),
84 last_read: Some("0000000000.000000".to_string()),
85 unread_count: Some(0),
86 unread_count_display: Some(0),
87 topic: Some(Topic {
88 value: Some("".to_string()),
89 creator: Some("".to_string()),
90 last_set: Some(0),
91 }),
92 purpose: Some(Purpose {
93 value: Some("".to_string()),
94 creator: Some("".to_string()),
95 last_set: Some(0),
96 }),
97 previous_names: Some(vec![]),
98 priority: Some(0),
99 ..Default::default()
100 }),
101 ..Default::default()
102 };
103 let json = r##"{
104 "ok": true,
105 "channel": {
106 "id": "C0EAQDV4Z",
107 "name": "endeavor",
108 "is_channel": true,
109 "created": 1504554479,
110 "creator": "U0123456",
111 "is_archived": false,
112 "is_general": false,
113 "name_normalized": "endeavor",
114 "is_shared": false,
115 "is_org_shared": false,
116 "is_member": false,
117 "is_private": false,
118 "is_mpim": false,
119 "last_read": "0000000000.000000",
120 "unread_count": 0,
121 "unread_count_display": 0,
122 "topic": {
123 "value": "",
124 "creator": "",
125 "last_set": 0
126 },
127 "purpose": {
128 "value": "",
129 "creator": "",
130 "last_set": 0
131 },
132 "previous_names": [],
133 "priority": 0
134 }
135}"##;
136
137 let j = serde_json::to_string_pretty(&response).unwrap();
138 assert_eq!(json, j);
139
140 let s = serde_json::from_str::<InviteResponse>(json).unwrap();
141 assert_eq!(response, s);
142 }
143
144 #[async_std::test]
145 async fn test_invite() {
146 let param = InviteRequest {
147 channel: "C1234567890".to_string(),
148 users: "W1234567890,U2345678901,U3456789012".to_string(),
149 };
150
151 let mut mock = MockSlackWebAPIClient::new();
152 mock.expect_post_json().returning(|_, _, _| {
153 Ok(r##"{
154 "ok": true,
155 "channel": {
156 "id": "C1234567890",
157 "name": "mychannel",
158 "is_channel": true,
159 "created": 1504554479,
160 "creator": "U0123456",
161 "is_archived": false,
162 "is_general": false,
163 "name_normalized": "endeavor",
164 "is_shared": false,
165 "is_org_shared": false,
166 "is_member": false,
167 "is_private": true,
168 "is_mpim": false,
169 "last_read": "0000000000.000000",
170 "unread_count": 0,
171 "unread_count_display": 0,
172 "topic": {
173 "value": "",
174 "creator": "",
175 "last_set": 0
176 },
177 "purpose": {
178 "value": "",
179 "creator": "",
180 "last_set": 0
181 },
182 "previous_names": [],
183 "priority": 0
184 }
185}"##
186 .to_string())
187 });
188
189 let response = invite(&mock, ¶m, &"test_token".to_string())
190 .await
191 .unwrap();
192 let expect = InviteResponse {
193 ok: true,
194 channel: Some(Channel {
195 id: Some("C1234567890".to_string()),
196 name: Some("mychannel".to_string()),
197 is_channel: Some(true),
198 created: Some(1504554479),
199 creator: Some("U0123456".to_string()),
200 is_archived: Some(false),
201 is_general: Some(false),
202 name_normalized: Some("endeavor".to_string()),
203 is_shared: Some(false),
204 is_org_shared: Some(false),
205 is_member: Some(false),
206 is_private: Some(true),
207 is_mpim: Some(false),
208 last_read: Some("0000000000.000000".to_string()),
209 unread_count: Some(0),
210 unread_count_display: Some(0),
211 topic: Some(Topic {
212 value: Some("".to_string()),
213 creator: Some("".to_string()),
214 last_set: Some(0),
215 }),
216 purpose: Some(Purpose {
217 value: Some("".to_string()),
218 creator: Some("".to_string()),
219 last_set: Some(0),
220 }),
221 previous_names: Some(vec![]),
222 priority: Some(0),
223 ..Default::default()
224 }),
225 ..Default::default()
226 };
227
228 assert_eq!(expect, response);
229 }
230}