slack_rust/conversations/
invite_shared.rs1use crate::error::Error;
2use crate::http_client::{get_slack_url, ResponseMetadata, SlackWebAPIClient};
3use serde::{Deserialize, Serialize};
4use serde_with::skip_serializing_none;
5
6#[skip_serializing_none]
7#[derive(Deserialize, Serialize, Debug, Default, PartialEq)]
8pub struct InviteSharedRequest {
9 pub channel: String,
10 pub emails: Option<Vec<String>>,
11 pub external_limited: Option<bool>,
12 pub user_ids: Option<Vec<String>>,
13}
14
15#[skip_serializing_none]
16#[derive(Deserialize, Serialize, Debug, Default, PartialEq)]
17pub struct InviteSharedResponse {
18 pub ok: bool,
19 pub error: Option<String>,
20 pub response_metadata: Option<ResponseMetadata>,
21 pub invite_id: Option<String>,
22 pub conf_code: Option<String>,
23 pub url: Option<String>,
24 pub is_legacy_shared_channel: Option<bool>,
25}
26
27pub async fn invite_shared<T>(
28 client: &T,
29 param: &InviteSharedRequest,
30 bot_token: &str,
31) -> Result<InviteSharedResponse, Error>
32where
33 T: SlackWebAPIClient,
34{
35 let url = get_slack_url("conversations.inviteShared");
36 let json = serde_json::to_string(¶m)?;
37
38 client
39 .post_json(&url, &json, bot_token)
40 .await
41 .and_then(|result| {
42 serde_json::from_str::<InviteSharedResponse>(&result).map_err(Error::SerdeJsonError)
43 })
44}
45
46#[cfg(test)]
47mod test {
48 use super::*;
49 use crate::http_client::MockSlackWebAPIClient;
50
51 #[test]
52 fn convert_request() {
53 let request = InviteSharedRequest {
54 channel: "C1234567890".to_string(),
55 emails: Some(vec!["xxxxxxxxxxx".to_string(), "xxxxxxxxxxx".to_string()]),
56 external_limited: Some(true),
57 user_ids: Some(vec!["xxxxxxxxxxx".to_string(), "xxxxxxxxxxx".to_string()]),
58 };
59 let json = r##"{
60 "channel": "C1234567890",
61 "emails": [
62 "xxxxxxxxxxx",
63 "xxxxxxxxxxx"
64 ],
65 "external_limited": true,
66 "user_ids": [
67 "xxxxxxxxxxx",
68 "xxxxxxxxxxx"
69 ]
70}"##;
71
72 let j = serde_json::to_string_pretty(&request).unwrap();
73 assert_eq!(json, j);
74
75 let s = serde_json::from_str::<InviteSharedRequest>(json).unwrap();
76 assert_eq!(request, s);
77 }
78
79 #[test]
80 fn convert_response() {
81 let response = InviteSharedResponse {
82 ok: true,
83 invite_id: Some("I011K7UESHG".to_string()),
84 conf_code: Some("dYhjpyzi8GHzRSol1RoLKurD".to_string()),
85 url: Some("https://join.slack.com/share/9hhxk2455rosq89X1ng".to_string()),
86 is_legacy_shared_channel: Some(false),
87 ..Default::default()
88 };
89 let json = r##"{
90 "ok": true,
91 "invite_id": "I011K7UESHG",
92 "conf_code": "dYhjpyzi8GHzRSol1RoLKurD",
93 "url": "https://join.slack.com/share/9hhxk2455rosq89X1ng",
94 "is_legacy_shared_channel": false
95}"##;
96
97 let j = serde_json::to_string_pretty(&response).unwrap();
98 assert_eq!(json, j);
99
100 let s = serde_json::from_str::<InviteSharedResponse>(json).unwrap();
101 assert_eq!(response, s);
102 }
103
104 #[async_std::test]
105 async fn test_invite_shared() {
106 let param = InviteSharedRequest {
107 channel: "C1234567890".to_string(),
108 emails: Some(vec!["xxxxxxxxxxx".to_string(), "xxxxxxxxxxx".to_string()]),
109 external_limited: Some(true),
110 user_ids: Some(vec!["xxxxxxxxxxx".to_string(), "xxxxxxxxxxx".to_string()]),
111 };
112
113 let mut mock = MockSlackWebAPIClient::new();
114 mock.expect_post_json().returning(|_, _, _| {
115 Ok(r##"{
116 "ok": true,
117 "invite_id": "I011K7UESHG",
118 "conf_code": "dYhjpyzi8GHzRSol1RoLKurD",
119 "url": "https://join.slack.com/share/9hhxk2455rosq89X1ng",
120 "is_legacy_shared_channel": false
121}"##
122 .to_string())
123 });
124
125 let response = invite_shared(&mock, ¶m, &"test_token".to_string())
126 .await
127 .unwrap();
128 let expect = InviteSharedResponse {
129 ok: true,
130 invite_id: Some("I011K7UESHG".to_string()),
131 conf_code: Some("dYhjpyzi8GHzRSol1RoLKurD".to_string()),
132 url: Some("https://join.slack.com/share/9hhxk2455rosq89X1ng".to_string()),
133 is_legacy_shared_channel: Some(false),
134 ..Default::default()
135 };
136
137 assert_eq!(expect, response);
138 }
139}