From 4a6a7d2a48cc76ad3a6132345ac75c994d33205a Mon Sep 17 00:00:00 2001 From: Ahmet Reha SEKER Date: Tue, 1 Nov 2022 22:50:08 +0300 Subject: [PATCH 1/2] Change text to rich_text --- src/models/search.rs | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/models/search.rs b/src/models/search.rs index e7d8189..0d1442f 100644 --- a/src/models/search.rs +++ b/src/models/search.rs @@ -247,7 +247,7 @@ pub enum FormulaCondition { #[derive(Serialize, Debug, Eq, PartialEq, Clone)] #[serde(rename_all = "snake_case")] pub enum PropertyCondition { - Text(TextCondition), + RichText(TextCondition), Number(NumberCondition), Checkbox(CheckboxCondition), Select(SelectCondition), @@ -373,7 +373,7 @@ impl From for SearchRequest { #[cfg(test)] mod tests { mod text_filters { - use crate::models::search::PropertyCondition::Text; + use crate::models::search::PropertyCondition::RichText; use crate::models::search::{FilterCondition, TextCondition}; use serde_json::json; @@ -381,9 +381,9 @@ mod tests { fn text_property_equals() -> Result<(), Box> { let json = serde_json::to_value(&FilterCondition { property: "Name".to_string(), - condition: Text(TextCondition::Equals("Test".to_string())), + condition: RichText(TextCondition::Equals("Test".to_string())), })?; - assert_eq!(json, json!({"property":"Name","text":{"equals":"Test"}})); + assert_eq!(json, json!({"property":"Name","rich_text":{"equals":"Test"}})); Ok(()) } @@ -392,11 +392,11 @@ mod tests { fn text_property_contains() -> Result<(), Box> { let json = serde_json::to_value(&FilterCondition { property: "Name".to_string(), - condition: Text(TextCondition::Contains("Test".to_string())), + condition: RichText(TextCondition::Contains("Test".to_string())), })?; assert_eq!( dbg!(json), - json!({"property":"Name","text":{"contains":"Test"}}) + json!({"property":"Name","rich_text":{"contains":"Test"}}) ); Ok(()) @@ -406,11 +406,11 @@ mod tests { fn text_property_is_empty() -> Result<(), Box> { let json = serde_json::to_value(&FilterCondition { property: "Name".to_string(), - condition: Text(TextCondition::IsEmpty), + condition: RichText(TextCondition::IsEmpty), })?; assert_eq!( dbg!(json), - json!({"property":"Name","text":{"is_empty":true}}) + json!({"property":"Name","rich_text":{"is_empty":true}}) ); Ok(()) @@ -420,11 +420,11 @@ mod tests { fn text_property_is_not_empty() -> Result<(), Box> { let json = serde_json::to_value(&FilterCondition { property: "Name".to_string(), - condition: Text(TextCondition::IsNotEmpty), + condition: RichText(TextCondition::IsNotEmpty), })?; assert_eq!( dbg!(json), - json!({"property":"Name","text":{"is_not_empty":true}}) + json!({"property":"Name","rich_text":{"is_not_empty":true}}) ); Ok(()) From 71d57cba250688ff7417d6532041b4953595c245 Mon Sep 17 00:00:00 2001 From: ahmetrehaseker Date: Mon, 7 Nov 2022 23:57:16 +0300 Subject: [PATCH 2/2] Add craete page functionality --- src/lib.rs | 17 +++++++++++++++++ src/models/mod.rs | 6 ++++++ src/models/properties.rs | 6 ++++-- src/models/search.rs | 5 ++++- src/models/text.rs | 2 ++ 5 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index bc4b0e7..28c23d0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -3,6 +3,7 @@ use crate::models::error::ErrorResponse; use crate::models::search::{DatabaseQuery, SearchRequest}; use crate::models::{Block, Database, ListResponse, Object, Page}; use ids::{AsIdentifier, PageId}; +use models::PageCreateRequest; use reqwest::header::{HeaderMap, HeaderValue}; use reqwest::{header, Client, ClientBuilder, RequestBuilder}; use tracing::Instrument; @@ -172,6 +173,22 @@ impl NotionApi { } } + /// Creates a new page and return the created page + pub async fn create_page>(&self, page: T) -> Result { + let result = self + .make_json_request( + self.client + .post("https://api.notion.com/v1/pages") + .json(&page.into()), + ) + .await?; + + match result { + Object::Page { page } => Ok(page), + response => Err(Error::UnexpectedResponse { response }), + } + } + /// Query a database and return the matching pages. pub async fn query_database( &self, diff --git a/src/models/mod.rs b/src/models/mod.rs index aca6cfe..3f83a7d 100644 --- a/src/models/mod.rs +++ b/src/models/mod.rs @@ -180,6 +180,12 @@ impl Properties { } } +#[derive(Serialize, Debug, Eq, PartialEq)] +pub struct PageCreateRequest { + pub parent: Parent, + pub properties: Properties, +} + #[derive(Serialize, Deserialize, Debug, Eq, PartialEq, Clone)] pub struct Page { pub id: PageId, diff --git a/src/models/properties.rs b/src/models/properties.rs index 3fa5935..467f750 100644 --- a/src/models/properties.rs +++ b/src/models/properties.rs @@ -190,8 +190,10 @@ pub enum PropertyConfiguration { #[derive(Serialize, Deserialize, Debug, Eq, PartialEq, Clone)] pub struct SelectedValue { - pub id: SelectOptionId, - pub name: String, + #[serde(skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub name: Option, pub color: Color, } diff --git a/src/models/search.rs b/src/models/search.rs index 0d1442f..d645bf6 100644 --- a/src/models/search.rs +++ b/src/models/search.rs @@ -383,7 +383,10 @@ mod tests { property: "Name".to_string(), condition: RichText(TextCondition::Equals("Test".to_string())), })?; - assert_eq!(json, json!({"property":"Name","rich_text":{"equals":"Test"}})); + assert_eq!( + json, + json!({"property":"Name","rich_text":{"equals":"Test"}}) + ); Ok(()) } diff --git a/src/models/text.rs b/src/models/text.rs index 4188dbf..841e7d7 100644 --- a/src/models/text.rs +++ b/src/models/text.rs @@ -44,7 +44,9 @@ pub struct Annotations { #[derive(Serialize, Deserialize, Debug, Eq, PartialEq, Clone)] pub struct RichTextCommon { pub plain_text: String, + #[serde(skip_serializing_if = "Option::is_none")] pub href: Option, + #[serde(skip_serializing_if = "Option::is_none")] pub annotations: Option, }