From f7ef8d6d7f009990ba0c6be61cca507f097673b6 Mon Sep 17 00:00:00 2001 From: Jake Swenson Date: Fri, 14 May 2021 07:18:20 -0700 Subject: First pass at a working Notion api client from the public beta --- src/models/search.rs | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 src/models/search.rs (limited to 'src/models/search.rs') 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, + #[serde(skip_serializing_if = "Option::is_none")] + sort: Option, + #[serde(skip_serializing_if = "Option::is_none")] + filter: Option, + #[serde(skip_serializing_if = "Option::is_none")] + start_cursor: Option, + #[serde(skip_serializing_if = "Option::is_none")] + page_size: Option +} + +#[derive(Debug, Eq, PartialEq)] +pub enum NotionSearch { + Query(String), + Sort{ + direction: SortDirection, + timestamp: SortTimestamp + }, + Filter { + value: FilterValue, + property: FilterProperty + } +} + +impl From 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() + } + } + } +} -- cgit v1.2.3