notion_client/endpoints/pages/
retrieve.rs

1pub mod response;
2
3use urlencoding::decode;
4
5use crate::{
6    endpoints::NOTION_URI,
7    objects::{page::Page, Response},
8    NotionClientError,
9};
10
11use self::response::RetrieveAPagePropertyItemResponse;
12
13use super::PagesEndpoint;
14
15impl PagesEndpoint {
16    pub async fn retrieve_a_page(
17        &self,
18        page_id: &str,
19        filter_properties: Option<Vec<&str>>,
20    ) -> Result<Page, NotionClientError> {
21        let filter_properties: Vec<_> = filter_properties
22            .iter()
23            .flatten()
24            .map(|p| ("filter_properties", decode(p).unwrap()))
25            .collect();
26
27        let result = self
28            .client
29            .get(format!(
30                "{notion_uri}/pages/{page_id}",
31                notion_uri = NOTION_URI,
32                page_id = page_id
33            ))
34            .query(&filter_properties)
35            .send()
36            .await
37            .map_err(|e| NotionClientError::FailedToRequest { source: e })?;
38
39        let body = result
40            .text()
41            .await
42            .map_err(|e| NotionClientError::FailedToText { source: e })?;
43
44        let response = serde_json::from_str(&body)
45            .map_err(|e| NotionClientError::FailedToDeserialize { source: e, body })?;
46
47        match response {
48            Response::Success(r) => Ok(r),
49            Response::Error(e) => Err(NotionClientError::InvalidStatusCode { error: e }),
50        }
51    }
52
53    pub async fn retrieve_a_page_property_item(
54        &self,
55        page_id: &str,
56        property_id: &str,
57        page_size: Option<u32>,
58        start_cursor: Option<&str>,
59    ) -> Result<RetrieveAPagePropertyItemResponse, NotionClientError> {
60        let mut query = vec![];
61        let page_size = page_size.map(|p| p.to_string());
62        if let Some(start_cursor) = start_cursor {
63            query.insert(0, ("start_cursor", start_cursor));
64        }
65        if let Some(page_size) = &page_size {
66            query.insert(0, ("page_size", page_size));
67        }
68
69        let result = self
70            .client
71            .get(format!(
72                "{notion_uri}/pages/{page_id}/properties/{property_id}",
73                notion_uri = NOTION_URI,
74                page_id = page_id,
75                property_id = property_id,
76            ))
77            .query(&query)
78            .send()
79            .await
80            .map_err(|e| NotionClientError::FailedToRequest { source: e })?;
81
82        let body = result
83            .text()
84            .await
85            .map_err(|e| NotionClientError::FailedToText { source: e })?;
86
87        let response = serde_json::from_str(&body)
88            .map_err(|e| NotionClientError::FailedToDeserialize { source: e, body })?;
89
90        match response {
91            Response::Success(r) => Ok(r),
92            Response::Error(e) => Err(NotionClientError::InvalidStatusCode { error: e }),
93        }
94    }
95}