aboutsummaryrefslogtreecommitdiff
path: root/src/models
diff options
context:
space:
mode:
authorGravatar Jake Swenson <jake@jakeswenson.com> 2021-05-14 07:18:20 -0700
committerGravatar Jake Swenson <jake@jakeswenson.com> 2021-05-14 07:18:20 -0700
commitf7ef8d6d7f009990ba0c6be61cca507f097673b6 (patch)
tree1b58a5a8ca08f8fe8bb2a71ae832db21dd4953c0 /src/models
parent5b3816b043f3e97878b04b948241466a2527b94d (diff)
downloadnotion-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.rs89
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()
+ }
+ }
+ }
+}