notion_client/endpoints/pages/
retrieve.rs1pub 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}