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/// ```
28pub struct Management {
29    pub config: ClientConfig,
30    pub client: ClientWithMiddleware,
31}
32
33impl Management {
34    /// Creates a new `Management` client.
35    ///
36    /// # Arguments
37    ///
38    /// * `api_key` - Your stack's API key
39    /// * `management_token` - Stack management token
40    /// * `opts` - Optional configuration overrides (region, timeout, max connections)
41    ///
42    /// # Example
43    ///
44    /// ```no_run
45    /// use contentstack_api_client_rs::Management;
46    ///
47    /// let client = Management::new("my_api_key", "my_management_token", None);
48    /// ```
49    pub fn new(api_key: &str, management_token: &str, opts: Option<ClientOptions>) -> Self {
50        let config = ClientConfig::management(api_key, management_token, opts);
51
52        let mut headers = HeaderMap::new();
53
54        headers.insert(
55            "api_key",
56            HeaderValue::from_str(&config.api_key)
57                .expect("api_key contains invalid header characters"),
58        );
59
60        headers.insert(
61            "authorization",
62            HeaderValue::from_str(&config.management_token)
63                .expect("management_token contains invalid header characters"),
64        );
65
66        let reqwest_client = Client::builder()
67            .default_headers(headers)
68            .timeout(config.timeout)
69            .pool_max_idle_per_host(config.max_connections)
70            .build()
71            .expect("Failed to build HTTP client");
72
73        let client = ClientBuilder::new(reqwest_client)
74            .with(RateLimiterMiddleware {
75                rate_limiter: ClientRateLimiter::new(RateLimitPreset::Management),
76            })
77            .build();
78
79        Self { config, client }
80    }
81
82    /// Returns an [`Entries`] sub-client for managing content entries.
83    pub fn entries(&self) -> Entries<'_> {
84        Entries {
85            client: &self.client,
86            base_url: &self.config.base_url,
87        }
88    }
89}