slack_morphism/api/
oauth.rs1use 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 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}