pubnub/dx/access/builders/
revoke.rs

1//! PAM revoke token module.
2//!
3//! This module contains `Revoke Token` request builder.
4
5use crate::{
6    core::{
7        error::PubNubError,
8        utils::{
9            encoding::url_encode,
10            headers::{APPLICATION_JSON, CONTENT_TYPE},
11        },
12        Deserializer, Transport, TransportMethod, TransportRequest,
13    },
14    dx::{access::*, pubnub_client::PubNubClientInstance},
15    lib::alloc::{format, string::ToString},
16};
17use derive_builder::Builder;
18
19#[derive(Builder)]
20#[builder(
21    pattern = "owned",
22    build_fn(vis = "pub(in crate::dx::access)", validate = "Self::validate"),
23    no_std
24)]
25/// The [`RevokeTokenRequestBuilder`] is used to build revoke access token
26/// permissions to access specific resource endpoints request that is sent to
27/// the [`PubNub`] network.
28///
29/// This struct used by the [`revoke_token`] method of the [`PubNubClient`].
30/// The [`revoke_token`] method is used to revoke access token permissions.
31///
32/// [`PubNub`]:https://www.pubnub.com/
33/// [`revoke_token`]: crate::dx::PubNubClient::revoke_token
34/// [`PubNubClient`]: crate::PubNubClient
35pub struct RevokeTokenRequest<T, D> {
36    /// Current client which can provide transportation to perform the request.
37    ///
38    /// This field is used to get [`Transport`] to perform the request.
39    #[builder(field(vis = "pub(in crate::dx::access)"), setter(custom))]
40    pub(in crate::dx::access) pubnub_client: PubNubClientInstance<T, D>,
41
42    /// Access token for which permissions should be revoked.
43    #[builder(field(vis = "pub(in crate::dx::access)"), setter(custom))]
44    pub(super) token: String,
45}
46
47impl<T, D> RevokeTokenRequest<T, D> {
48    /// Create transport request from the request builder.
49    pub(in crate::dx::access) fn transport_request(&self) -> TransportRequest {
50        let config = &self.pubnub_client.config;
51
52        TransportRequest {
53            path: format!(
54                "/v3/pam/{}/grant/{}",
55                &config.subscribe_key,
56                url_encode(self.token.as_bytes())
57            ),
58            method: TransportMethod::Delete,
59            headers: [(CONTENT_TYPE.to_string(), APPLICATION_JSON.to_string())].into(),
60            #[cfg(feature = "std")]
61            timeout: config.transport.request_timeout,
62            ..Default::default()
63        }
64    }
65}
66
67impl<T, D> RevokeTokenRequestBuilder<T, D> {
68    /// Validate user-provided data for request builder.
69    ///
70    /// Validator ensure that list of provided data is enough to build valid
71    /// request instance.
72    fn validate(&self) -> Result<(), String> {
73        builders::validate_configuration(&self.pubnub_client)
74    }
75}
76
77impl<T, D> RevokeTokenRequestBuilder<T, D>
78where
79    T: Transport + 'static,
80    D: Deserializer + 'static,
81{
82    /// Build and call asynchronous request.
83    pub async fn execute(self) -> Result<RevokeTokenResult, PubNubError> {
84        // Build request instance and report errors if any.
85        let request = self
86            .build()
87            .map_err(|err| PubNubError::general_api_error(err.to_string(), None, None))?;
88
89        let transport_request = request.transport_request();
90        let client = request.pubnub_client.clone();
91        let deserializer = client.deserializer.clone();
92
93        transport_request
94            .send::<RevokeTokenResponseBody, _, _, _>(
95                &client.transport,
96                deserializer,
97                #[cfg(feature = "std")]
98                &client.config.transport.retry_configuration,
99                #[cfg(feature = "std")]
100                &client.runtime,
101            )
102            .await
103    }
104}
105
106#[cfg(feature = "blocking")]
107impl<T, D> RevokeTokenRequestBuilder<T, D>
108where
109    T: crate::core::blocking::Transport,
110    D: Deserializer + 'static,
111{
112    /// Execute synchronous request and return the result.
113    ///
114    /// This method is synchronous and will return result which will resolve to
115    /// a [`RevokeTokenResult`] or [`PubNubError`].
116    ///
117    /// # Example
118    /// ```no_run
119    /// # use pubnub::{PubNubClientBuilder, Keyset};
120    ///
121    /// # #[tokio::main]
122    /// # async fn main() -> Result<(), Box<dyn std::error::Error>> {
123    /// let mut pubnub = // PubNubClient
124    /// #     PubNubClientBuilder::with_reqwest_blocking_transport()
125    /// #         .with_keyset(Keyset {
126    /// #              subscribe_key: "demo",
127    /// #              publish_key: Some("demo"),
128    /// #              secret_key: Some("demo")
129    /// #          })
130    /// #         .with_user_id("uuid")
131    /// #         .build()?;
132    /// pubnub
133    ///     .revoke_token("p0F2AkF0Gl043r....Dc3BjoERtZXRhoENzaWdYIGOAeTyWGJI")
134    ///     .execute_blocking()?;
135    /// #     Ok(())
136    /// # }
137    /// ```
138    pub fn execute_blocking(self) -> Result<RevokeTokenResult, PubNubError> {
139        // Build request instance and report errors if any.
140        let request = self
141            .build()
142            .map_err(|err| PubNubError::general_api_error(err.to_string(), None, None))?;
143
144        let transport_request = request.transport_request();
145        let client = request.pubnub_client.clone();
146        let deserializer = client.deserializer.clone();
147        transport_request
148            .send_blocking::<RevokeTokenResponseBody, _, _, _>(&client.transport, deserializer)
149    }
150}