1use 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 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 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 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 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 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 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 #[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 #[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 #[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}