slack_morphism/api/
oauth.rs

1//!
2//! Support for Slack OAuth v2 API methods
3//!
4
5use rsb_derive::Builder;
6use rvstruct::*;
7use serde::{Deserialize, Serialize};
8use serde_with::skip_serializing_none;
9use std::fmt;
10
11use crate::client::*;
12use crate::models::*;
13use crate::token::*;
14use url::Url;
15
16impl<SCHC> SlackClient<SCHC>
17where
18    SCHC: SlackClientHttpConnector + Send,
19{
20    ///
21    /// https://api.slack.com/methods/oauth.v2.access
22    ///
23    pub async fn oauth2_access(
24        &self,
25        req: &SlackOAuthV2AccessTokenRequest,
26    ) -> ClientResult<SlackOAuthV2AccessTokenResponse> {
27        let full_uri: Url = SlackClientHttpApiUri::create_url_with_params(
28            self.http_api
29                .connector
30                .create_method_uri_path("oauth.v2.access")?,
31            &vec![
32                ("code", Some(req.code.value())),
33                (
34                    "redirect_uri",
35                    req.redirect_uri
36                        .as_ref()
37                        .map(|url| url.as_str().to_string())
38                        .as_ref(),
39                ),
40            ],
41        )?;
42
43        self.http_api
44            .connector
45            .http_get_with_client_secret(full_uri, &req.client_id, &req.client_secret)
46            .await
47    }
48}
49
50#[skip_serializing_none]
51#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
52pub struct SlackOAuthV2AccessTokenRequest {
53    pub client_id: SlackClientId,
54    pub client_secret: SlackClientSecret,
55    pub code: SlackOAuthCode,
56    pub redirect_uri: Option<Url>,
57}
58
59#[skip_serializing_none]
60#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
61pub struct SlackOAuthV2AccessTokenResponse {
62    pub access_token: SlackApiTokenValue,
63    pub token_type: SlackApiTokenType,
64    pub scope: SlackApiTokenScope,
65    pub bot_user_id: Option<SlackUserId>,
66    pub app_id: SlackAppId,
67    pub team: SlackTeamInfo,
68    pub authed_user: SlackOAuthV2AuthedUser,
69    pub incoming_webhook: Option<SlackOAuthIncomingWebHook>,
70}
71
72#[skip_serializing_none]
73#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
74pub struct SlackOAuthV2AuthedUser {
75    pub id: SlackUserId,
76    pub scope: Option<SlackApiTokenScope>,
77    pub access_token: Option<SlackApiTokenValue>,
78    pub token_type: Option<SlackApiTokenType>,
79}
80
81#[skip_serializing_none]
82#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
83pub struct SlackOAuthIncomingWebHook {
84    pub channel: String,
85    pub channel_id: SlackChannelId,
86    pub configuration_url: Url,
87    pub url: Url,
88}
89
90#[derive(Eq, PartialEq, Hash, Clone, Serialize, Deserialize, ValueStruct)]
91pub struct SlackOAuthCode(pub String);
92
93impl fmt::Debug for SlackOAuthCode {
94    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
95        write!(f, "SlackOAuthCode(len:{})", self.value().len())
96    }
97}