slack_morphism/api/
apps.rs

1//!
2//! Support for Slack Apps API methods
3//!
4
5use rsb_derive::Builder;
6use serde::{Deserialize, Serialize};
7use serde_with::{serde_as, skip_serializing_none};
8use url::Url;
9
10use crate::*;
11
12use crate::ratectl::*;
13use crate::SlackClientSession;
14use crate::{ClientResult, SlackClientHttpConnector};
15
16impl<'a, SCHC> SlackClientSession<'a, SCHC>
17where
18    SCHC: SlackClientHttpConnector + Send,
19{
20    ///
21    /// https://api.slack.com/methods/apps.connections.open
22    ///
23    pub async fn apps_connections_open(
24        &self,
25        req: &SlackApiAppsConnectionOpenRequest,
26    ) -> ClientResult<SlackApiAppsConnectionOpenResponse> {
27        self.http_session_api
28            .http_post(
29                "apps.connections.open",
30                req,
31                Some(&SLACK_TIER1_METHOD_CONFIG),
32            )
33            .await
34    }
35
36    ///
37    /// https://api.slack.com/methods/apps.manifest.create
38    ///
39    pub async fn apps_manifest_create(
40        &self,
41        req: &SlackApiAppsManifestCreateRequest,
42    ) -> ClientResult<SlackApiAppsManifestCreateResponse> {
43        self.http_session_api
44            .http_post(
45                "apps.manifest.create",
46                req,
47                Some(&SLACK_TIER1_METHOD_CONFIG),
48            )
49            .await
50    }
51
52    ///
53    /// https://api.slack.com/methods/apps.manifest.delete
54    ///
55    pub async fn apps_manifest_delete(
56        &self,
57        req: &SlackApiAppsManifestDeleteRequest,
58    ) -> ClientResult<()> {
59        self.http_session_api
60            .http_post(
61                "apps.manifest.delete",
62                req,
63                Some(&SLACK_TIER1_METHOD_CONFIG),
64            )
65            .await
66    }
67
68    ///
69    /// https://api.slack.com/methods/apps.manifest.export
70    ///
71    pub async fn apps_manifest_export(
72        &self,
73        req: &SlackApiAppsManifestExportRequest,
74    ) -> ClientResult<SlackApiAppsManifestExportResponse> {
75        self.http_session_api
76            .http_post(
77                "apps.manifest.export",
78                req,
79                Some(&SLACK_TIER3_METHOD_CONFIG),
80            )
81            .await
82    }
83
84    ///
85    /// https://api.slack.com/methods/apps.manifest.update
86    ///
87    pub async fn apps_manifest_update(
88        &self,
89        req: &SlackApiAppsManifestUpdateRequest,
90    ) -> ClientResult<SlackApiAppsManifestUpdateResponse> {
91        self.http_session_api
92            .http_post(
93                "apps.manifest.update",
94                req,
95                Some(&SLACK_TIER1_METHOD_CONFIG),
96            )
97            .await
98    }
99
100    ///
101    /// https://api.slack.com/methods/apps.manifest.validate
102    ///
103    pub async fn apps_manifest_validate(
104        &self,
105        req: &SlackApiAppsManifestValidateRequest,
106    ) -> ClientResult<()> {
107        self.http_session_api
108            .http_post(
109                "apps.manifest.validate",
110                req,
111                Some(&SLACK_TIER3_METHOD_CONFIG),
112            )
113            .await
114    }
115}
116
117#[skip_serializing_none]
118#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
119pub struct SlackApiAppsConnectionOpenRequest {}
120
121#[skip_serializing_none]
122#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
123pub struct SlackApiAppsConnectionOpenResponse {
124    pub url: SlackWebSocketsUrl,
125}
126
127#[serde_as]
128#[skip_serializing_none]
129#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
130pub struct SlackApiAppsManifestCreateRequest {
131    pub app_id: SlackAppId,
132
133    // This API requires a "json-encoded" string in a JSON object.
134    #[serde_as(as = "serde_with::json::JsonString")]
135    pub manifest: SlackAppManifest,
136}
137
138#[skip_serializing_none]
139#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
140pub struct SlackApiAppsManifestCreateResponse {
141    pub app_id: SlackAppId,
142    pub credentials: SlackAppCredentials,
143    pub oauth_authorize_url: Url,
144}
145
146#[skip_serializing_none]
147#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
148pub struct SlackApiAppsManifestDeleteRequest {
149    pub app_id: SlackAppId,
150}
151
152#[skip_serializing_none]
153#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
154pub struct SlackApiAppsManifestExportRequest {
155    pub app_id: SlackAppId,
156}
157
158#[skip_serializing_none]
159#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
160pub struct SlackApiAppsManifestExportResponse {
161    pub manifest: SlackAppManifest,
162}
163
164#[serde_as]
165#[skip_serializing_none]
166#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
167pub struct SlackApiAppsManifestUpdateRequest {
168    pub app_id: SlackAppId,
169
170    // This API requires a "json-encoded" string in a JSON object.
171    #[serde_as(as = "serde_with::json::JsonString")]
172    pub manifest: SlackAppManifest,
173}
174
175#[skip_serializing_none]
176#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
177pub struct SlackApiAppsManifestUpdateResponse {
178    pub app_id: SlackAppId,
179    pub permissions_updated: bool,
180}
181
182#[serde_as]
183#[skip_serializing_none]
184#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
185pub struct SlackApiAppsManifestValidateRequest {
186    // This API requires a "json-encoded" string in a JSON object.
187    #[serde_as(as = "serde_with::json::JsonString")]
188    pub manifest: SlackAppManifest,
189
190    pub app_id: Option<SlackAppId>,
191}
192
193#[cfg(test)]
194mod test {
195    use super::*;
196
197    #[test]
198    fn test_slack_api_apps_manifest_create_request() {
199        let payload = include_str!("./fixtures/slack_api_apps_manifest_create_request.json");
200        let model: SlackApiAppsManifestCreateRequest = serde_json::from_str(payload).unwrap();
201        assert_eq!(model.app_id, SlackAppId::from("test-app-id"));
202        assert_eq!(model.manifest.display_information.name, "My App");
203    }
204}