aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar ahmetrehaseker <ahmetrehaseker@gmail.com> 2023-01-02 19:19:41 +0300
committerGravatar GitHub <noreply@github.com> 2023-01-02 08:19:41 -0800
commit43fd57ab2f7fd0e478001d97be5e66156feaa4cc (patch)
tree0632240109ec51b32e9480aceb0efb8aac504647
parent1e4f1d49919bf4dd0cfe1af1fcd95d1d90e4b7ff (diff)
downloadnotion-43fd57ab2f7fd0e478001d97be5e66156feaa4cc.tar.gz
notion-43fd57ab2f7fd0e478001d97be5e66156feaa4cc.tar.zst
notion-43fd57ab2f7fd0e478001d97be5e66156feaa4cc.zip
Add create page functionality (#44)
* Change text to rich_text * Add craete page functionality Co-authored-by: Jake Swenson <jakeswenson@users.noreply.github.com>
Diffstat (limited to '')
-rw-r--r--src/lib.rs17
-rw-r--r--src/models/mod.rs6
-rw-r--r--src/models/properties.rs6
-rw-r--r--src/models/search.rs23
-rw-r--r--src/models/text.rs2
5 files changed, 42 insertions, 12 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 2b9711b..46c3358 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;
@@ -178,6 +179,22 @@ impl NotionApi {
}
}
+ /// Creates a new page and return the created page
+ pub async fn create_page<T: Into<PageCreateRequest>>(&self, page: T) -> Result<Page, Error> {
+ 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<D, T>(
&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<SelectOptionId>,
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub name: Option<String>,
pub color: Color,
}
diff --git a/src/models/search.rs b/src/models/search.rs
index ab7567f..5b2b928 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),
@@ -376,7 +376,7 @@ impl From<NotionSearch> 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;
@@ -384,9 +384,12 @@ mod tests {
fn text_property_equals() -> Result<(), Box<dyn std::error::Error>> {
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(())
}
@@ -395,11 +398,11 @@ mod tests {
fn text_property_contains() -> Result<(), Box<dyn std::error::Error>> {
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(())
@@ -409,11 +412,11 @@ mod tests {
fn text_property_is_empty() -> Result<(), Box<dyn std::error::Error>> {
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(())
@@ -423,11 +426,11 @@ mod tests {
fn text_property_is_not_empty() -> Result<(), Box<dyn std::error::Error>> {
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(())
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<String>,
+ #[serde(skip_serializing_if = "Option::is_none")]
pub annotations: Option<Annotations>,
}