Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: Fixes issue #3, search can return objects #5

Merged
merged 2 commits into from
May 16, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 50 additions & 11 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
Expand All @@ -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")
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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(())
}
Expand All @@ -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?;
Expand All @@ -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(
Expand Down
29 changes: 23 additions & 6 deletions src/models.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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> {
Expand Down Expand Up @@ -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
Expand Down
8 changes: 4 additions & 4 deletions src/models/search.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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)]
Expand Down Expand Up @@ -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,
},
}

Expand Down