diff options
author | 2021-05-16 09:37:52 -0700 | |
---|---|---|
committer | 2021-05-16 09:37:52 -0700 | |
commit | fa85eb7182471a0fa15b7268e4c9adac326756f8 (patch) | |
tree | bcfec569e6a2015a4eb18dc8824ab20cf771947b | |
parent | c0f5b2bb6c470dc3669c5cbec53a19133223dc42 (diff) | |
download | notion-fa85eb7182471a0fa15b7268e4c9adac326756f8.tar.gz notion-fa85eb7182471a0fa15b7268e4c9adac326756f8.tar.zst notion-fa85eb7182471a0fa15b7268e4c9adac326756f8.zip |
fix: Fixes issue #3, search can return objects (#5)
-rw-r--r-- | src/lib.rs | 61 | ||||
-rw-r--r-- | src/models.rs | 29 | ||||
-rw-r--r-- | src/models/search.rs | 8 |
3 files changed, 77 insertions, 21 deletions
@@ -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, }, } |