Skip to main content

contentstack_api_client_rs/client/
management.rs

1use http::{HeaderMap, HeaderValue};
2use reqwest::Client;
3use reqwest_middleware::{ClientBuilder, ClientWithMiddleware};
4
5use crate::{
6    ClientOptions,
7    client::config::ClientConfig,
8    middleware::rate_limiter::RateLimiterMiddleware,
9    rate_limiter::{ClientRateLimiter, RateLimitPreset},
10};
11
12pub mod entries;
13
14use entries::Entries;
15
16/// Async HTTP client for the Contentstack Content Management API.
17///
18/// Holds a connection pool and injects the required authentication headers
19/// on every request automatically.
20///
21/// # Example
22///
23/// ```no_run
24/// use contentstack_api_client_rs::Management;
25///
26/// let client = Management::new("my_api_key", "my_management_token", None);
27/// ```
28#[derive(Clone, Debug)]
29pub struct Management {
30    pub config: ClientConfig,
31    pub client: ClientWithMiddleware,
32}
33
34impl Management {
35    /// Creates a new `Management` client.
36    ///
37    /// # Arguments
38    ///
39    /// * `api_key` - Your stack's API key
40    /// * `management_token` - Stack management token
41    /// * `opts` - Optional configuration overrides (region, timeout, max connections)
42    ///
43    /// # Example
44    ///
45    /// ```no_run
46    /// use contentstack_api_client_rs::Management;
47    ///
48    /// let client = Management::new("my_api_key", "my_management_token", None);
49    /// ```
50    pub fn new(api_key: &str, management_token: &str, opts: Option<ClientOptions>) -> Self {
51        let config = ClientConfig::management(api_key, management_token, opts);
52
53        let mut headers = HeaderMap::new();
54
55        headers.insert(
56            "api_key",
57            HeaderValue::from_str(&config.api_key)
58                .expect("api_key contains invalid header characters"),
59        );
60
61        headers.insert(
62            "authorization",
63            HeaderValue::from_str(&config.management_token)
64                .expect("management_token contains invalid header characters"),
65        );
66
67        let reqwest_client = Client::builder()
68            .default_headers(headers)
69            .timeout(config.timeout)
70            .pool_max_idle_per_host(config.max_connections)
71            .build()
72            .expect("Failed to build HTTP client");
73
74        let client = ClientBuilder::new(reqwest_client)
75            .with(RateLimiterMiddleware {
76                rate_limiter: ClientRateLimiter::new(RateLimitPreset::Management),
77            })
78            .build();
79
80        Self { config, client }
81    }
82
83    /// Returns an [`Entries`] sub-client for managing content entries.
84    pub fn entries(&self) -> Entries<'_> {
85        Entries {
86            client: &self.client,
87            base_url: &self.config.base_url,
88        }
89    }
90}