diff options
author | 2021-05-14 07:18:20 -0700 | |
---|---|---|
committer | 2021-05-14 07:18:20 -0700 | |
commit | f7ef8d6d7f009990ba0c6be61cca507f097673b6 (patch) | |
tree | 1b58a5a8ca08f8fe8bb2a71ae832db21dd4953c0 /src/models | |
parent | 5b3816b043f3e97878b04b948241466a2527b94d (diff) | |
download | notion-f7ef8d6d7f009990ba0c6be61cca507f097673b6.tar.gz notion-f7ef8d6d7f009990ba0c6be61cca507f097673b6.tar.zst notion-f7ef8d6d7f009990ba0c6be61cca507f097673b6.zip |
First pass at a working Notion api client from the public beta
Diffstat (limited to 'src/models')
-rw-r--r-- | src/models/search.rs | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/src/models/search.rs b/src/models/search.rs new file mode 100644 index 0000000..cc0cdf4 --- /dev/null +++ b/src/models/search.rs @@ -0,0 +1,89 @@ +use serde::{Deserialize, Serialize}; +use chrono::{DateTime, Utc}; + +#[derive(Serialize, Deserialize, Debug, Eq, PartialEq, Hash, Copy, Clone)] +#[serde(rename_all = "snake_case")] +pub enum SortDirection { + Ascending, + Descending +} + +#[derive(Serialize, Deserialize, Debug, Eq, PartialEq, Hash, Copy, Clone)] +#[serde(rename_all = "snake_case")] +pub enum SortTimestamp { + LastEditedTime, +} + +#[derive(Serialize, Deserialize, Debug, Eq, PartialEq, Hash, Copy, Clone)] +#[serde(rename_all = "snake_case")] +pub enum FilterValue { + Page, + Database +} + + +#[derive(Serialize, Deserialize, Debug, Eq, PartialEq, Hash, Copy, Clone)] +#[serde(rename_all = "snake_case")] +pub enum FilterProperty { + Object +} + +#[derive(Serialize, Deserialize, Debug, Eq, PartialEq, Clone)] +pub struct Sort { + direction: SortDirection, + timestamp: SortTimestamp +} + +#[derive(Serialize, Deserialize, Debug, Eq, PartialEq, Clone)] +pub struct Filter { + value: FilterValue, + property: FilterProperty +} + +#[derive(Serialize, Deserialize, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone)] +#[serde(transparent)] +pub struct PagingCursor(String); + +#[derive(Serialize, Debug, Eq, PartialEq, Default)] +pub struct SearchRequest { + #[serde(skip_serializing_if = "Option::is_none")] + query: Option<String>, + #[serde(skip_serializing_if = "Option::is_none")] + sort: Option<Sort>, + #[serde(skip_serializing_if = "Option::is_none")] + filter: Option<Filter>, + #[serde(skip_serializing_if = "Option::is_none")] + start_cursor: Option<PagingCursor>, + #[serde(skip_serializing_if = "Option::is_none")] + page_size: Option<u8> +} + +#[derive(Debug, Eq, PartialEq)] +pub enum NotionSearch { + Query(String), + Sort{ + direction: SortDirection, + timestamp: SortTimestamp + }, + Filter { + value: FilterValue, + property: FilterProperty + } +} + +impl From<NotionSearch> for SearchRequest { + fn from(search: NotionSearch) -> Self { + match search { + NotionSearch::Query(query) => SearchRequest { query: Some(query), ..Default::default() }, + NotionSearch::Sort { direction, timestamp } => SearchRequest { sort: Some(Sort { + direction, timestamp + }), ..Default::default()}, + NotionSearch::Filter { value, property } => SearchRequest { + filter: Some(Filter { + value, property + }), + ..Default::default() + } + } + } +} |