Skip to main content

agentmail/client/
api_keys.rs

1use crate::client::NoBody;
2use crate::client::scope::{ApiKeys, Scoped};
3use crate::{Error, Page, types::*, util::urlish};
4
5impl<S: ApiKeys> Scoped<'_, S> {
6    /// POST `{scope}/api-keys`, mint a new API key. The full secret is in
7    /// [`CreatedApiKey::api_key`] and is shown only here; store it now.
8    pub async fn create_api_key(&self, key: CreateApiKey) -> Result<CreatedApiKey, Error> {
9        self.client
10            .request(
11                reqwest::Method::POST,
12                &format!("{}/api-keys", self.base()),
13                &[],
14                Some(&key),
15            )
16            .await
17    }
18
19    /// GET `{scope}/api-keys`, one page.
20    pub async fn list_api_keys(&self, page: Page) -> Result<ApiKeyList, Error> {
21        self.client
22            .request(
23                reqwest::Method::GET,
24                &format!("{}/api-keys", self.base()),
25                &page.query(),
26                None::<&NoBody>,
27            )
28            .await
29    }
30
31    /// Every API key, draining pagination.
32    pub async fn list_all_api_keys(&self) -> Result<Vec<ApiKey>, Error> {
33        let mut out = Vec::new();
34        let mut token = None;
35        loop {
36            let resp = self
37                .list_api_keys(Page {
38                    limit: None,
39                    page_token: token,
40                })
41                .await?;
42            let next = resp.next_page_token;
43            out.extend(resp.api_keys);
44            match next {
45                Some(t) => token = Some(t),
46                None => return Ok(out),
47            }
48        }
49    }
50
51    /// DELETE `{scope}/api-keys/{api_key_id}`.
52    pub async fn delete_api_key(&self, api_key_id: &str) -> Result<(), Error> {
53        self.client
54            .request(
55                reqwest::Method::DELETE,
56                &format!("{}/api-keys/{}", self.base(), urlish(api_key_id)),
57                &[],
58                None::<&NoBody>,
59            )
60            .await
61    }
62}