aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Jake Swenson <jakeswenson@users.noreply.github.com> 2021-05-16 09:37:52 -0700
committerGravatar GitHub <noreply@github.com> 2021-05-16 09:37:52 -0700
commitfa85eb7182471a0fa15b7268e4c9adac326756f8 (patch)
treebcfec569e6a2015a4eb18dc8824ab20cf771947b
parentc0f5b2bb6c470dc3669c5cbec53a19133223dc42 (diff)
downloadnotion-fa85eb7182471a0fa15b7268e4c9adac326756f8.tar.gz
notion-fa85eb7182471a0fa15b7268e4c9adac326756f8.tar.zst
notion-fa85eb7182471a0fa15b7268e4c9adac326756f8.zip
fix: Fixes issue #3, search can return objects (#5)
-rw-r--r--src/lib.rs61
-rw-r--r--src/models.rs29
-rw-r--r--src/models/search.rs8
3 files changed, 77 insertions, 21 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 0dd8366..7345ef9 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -43,8 +43,11 @@ impl NotionApi {
T: DeserializeOwned,
{
let json = request.send().await?.text().await?;
- println!("JSON: {}", json);
- dbg!(serde_json::from_str::<serde_json::Value>(&json)?);
+ #[cfg(test)]
+ {
+ println!("JSON: {}", json);
+ dbg!(serde_json::from_str::<serde_json::Value>(&json)?);
+ }
let result = serde_json::from_str(&json)?;
Ok(result)
}
@@ -61,7 +64,7 @@ impl NotionApi {
pub async fn search<T: Into<SearchRequest>>(
&self,
query: T,
- ) -> Result<ListResponse<Database>, NotionApiClientError> {
+ ) -> Result<ListResponse<Object>, NotionApiClientError> {
Ok(NotionApi::make_json_request(
self.client
.post("https://api.notion.com/v1/search")
@@ -108,6 +111,7 @@ mod tests {
use crate::models::search::{
DatabaseQuery, FilterCondition, FilterProperty, FilterValue, NotionSearch, TextCondition,
};
+ use crate::models::Object;
use crate::{Identifiable, NotionApi};
fn test_token() -> String {
@@ -137,16 +141,33 @@ mod tests {
}
#[tokio::test]
- async fn search() -> Result<(), Box<dyn std::error::Error>> {
+ async fn search_databases() -> Result<(), Box<dyn std::error::Error>> {
let api = test_client();
- dbg!(
- api.search(NotionSearch::Filter {
+ let response = api
+ .search(NotionSearch::Filter {
+ property: FilterProperty::Object,
value: FilterValue::Database,
- property: FilterProperty::Object
})
- .await?
- );
+ .await?;
+
+ assert!(response.results.len() > 0);
+
+ Ok(())
+ }
+
+ #[tokio::test]
+ async fn search_pages() -> Result<(), Box<dyn std::error::Error>> {
+ let api = test_client();
+
+ let response = api
+ .search(NotionSearch::Filter {
+ property: FilterProperty::Object,
+ value: FilterValue::Page,
+ })
+ .await?;
+
+ assert!(response.results.len() > 0);
Ok(())
}
@@ -162,7 +183,16 @@ mod tests {
})
.await?;
- let db = response.results()[0].clone();
+ let db = response
+ .results()
+ .iter()
+ .filter_map(|o| match o {
+ Object::Database { database } => Some(database),
+ _ => None,
+ })
+ .next()
+ .expect("Test expected to find at least one database in notion")
+ .clone();
// todo: fix this clone issue
let db_result = api.get_database(db.clone()).await?;
@@ -183,7 +213,16 @@ mod tests {
})
.await?;
- let db = dbg!(response.results()[0].clone());
+ let db = response
+ .results()
+ .iter()
+ .filter_map(|o| match o {
+ Object::Database { database } => Some(database),
+ _ => None,
+ })
+ .next()
+ .expect("Test expected to find at least one database in notion")
+ .clone();
let pages = api
.query_database(
diff --git a/src/models.rs b/src/models.rs
index 2581e13..4051787 100644
--- a/src/models.rs
+++ b/src/models.rs
@@ -8,13 +8,14 @@ use crate::models::text::RichText;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
+use crate::models::paging::PagingCursor;
use crate::Identifiable;
pub use chrono::{DateTime, Utc};
pub use serde_json::value::Number;
use std::fmt::{Display, Formatter};
#[derive(Serialize, Deserialize, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Copy, Clone)]
-#[serde(rename_all = "lowercase")]
+#[serde(rename_all = "snake_case")]
enum ObjectType {
Database,
List,
@@ -77,9 +78,9 @@ impl Identifiable for Database {
#[derive(Serialize, Deserialize, Eq, PartialEq, Debug, Clone)]
pub struct ListResponse<T> {
- results: Vec<T>,
- next_cursor: Option<String>,
- has_more: bool,
+ pub results: Vec<T>,
+ pub next_cursor: Option<PagingCursor>,
+ pub has_more: bool,
}
impl<T> ListResponse<T> {
@@ -136,17 +137,33 @@ pub struct Page {
#[derive(Serialize, Deserialize, Debug, Eq, PartialEq, Clone)]
pub struct Block {}
-#[derive(Serialize, Deserialize, Clone)]
+#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq)]
#[serde(tag = "object")]
+#[serde(rename_all = "snake_case")]
pub enum Object {
Database {
#[serde(flatten)]
database: Database,
},
- Page {},
+ Page {
+ #[serde(flatten)]
+ page: Page,
+ },
List {
+ #[serde(flatten)]
list: ListResponse<Object>,
},
+ User {
+ #[serde(flatten)]
+ user: User,
+ },
+ Block {},
+}
+
+impl Object {
+ pub fn is_database(&self) -> bool {
+ matches!(self, Object::Database { .. })
+ }
}
/// A zero-cost wrapper type around a Page ID
diff --git a/src/models/search.rs b/src/models/search.rs
index 6bf8d8b..8cb4327 100644
--- a/src/models/search.rs
+++ b/src/models/search.rs
@@ -29,14 +29,14 @@ pub enum FilterProperty {
#[derive(Serialize, Deserialize, Debug, Eq, PartialEq, Clone)]
pub struct Sort {
- direction: SortDirection,
timestamp: SortTimestamp,
+ direction: SortDirection,
}
#[derive(Serialize, Deserialize, Debug, Eq, PartialEq, Clone)]
pub struct Filter {
- value: FilterValue,
property: FilterProperty,
+ value: FilterValue,
}
#[derive(Serialize, Debug, Eq, PartialEq, Default)]
@@ -100,12 +100,12 @@ pub struct DatabaseQuery {
pub enum NotionSearch {
Query(String),
Sort {
- direction: SortDirection,
timestamp: SortTimestamp,
+ direction: SortDirection,
},
Filter {
- value: FilterValue,
property: FilterProperty,
+ value: FilterValue,
},
}