use crate::models::paging::Paging; use crate::models::{Number, PageId, UserId}; use chrono::{DateTime, Utc}; use serde::ser::SerializeMap; use serde::{Serialize, Serializer}; #[derive(Serialize, Debug, Eq, PartialEq, Hash, Copy, Clone)] #[serde(rename_all = "snake_case")] pub enum SortDirection { Ascending, Descending, } #[derive(Serialize, Debug, Eq, PartialEq, Hash, Copy, Clone)] #[serde(rename_all = "snake_case")] pub enum SortTimestamp { LastEditedTime, } #[derive(Serialize, Debug, Eq, PartialEq, Hash, Copy, Clone)] #[serde(rename_all = "snake_case")] pub enum DatabaseSortTimestamp { CreatedTime, LastEditedTime, } #[derive(Serialize, Debug, Eq, PartialEq, Hash, Copy, Clone)] #[serde(rename_all = "snake_case")] pub enum FilterValue { Page, Database, } #[derive(Serialize, Debug, Eq, PartialEq, Hash, Copy, Clone)] #[serde(rename_all = "snake_case")] pub enum FilterProperty { Object, } #[derive(Serialize, Debug, Eq, PartialEq, Clone)] pub struct Sort { /// The name of the timestamp to sort against. timestamp: SortTimestamp, direction: SortDirection, } #[derive(Serialize, Debug, Eq, PartialEq, Clone)] pub struct Filter { property: FilterProperty, value: FilterValue, } #[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(flatten)] paging: Option, } #[derive(Serialize, Debug, Eq, PartialEq, Clone)] #[serde(rename_all = "snake_case")] pub enum TextCondition { Equals(String), DoesNotEqual(String), Contains(String), DoesNotContain(String), StartsWith(String), EndsWith(String), #[serde(serialize_with = "serialize_to_true")] IsEmpty, #[serde(serialize_with = "serialize_to_true")] IsNotEmpty, } fn serialize_to_true(serializer: S) -> Result where S: Serializer, { serializer.serialize_bool(true) } fn serialize_to_empty_object(serializer: S) -> Result where S: Serializer, { // Todo: there has to be a better way? serializer.serialize_map(Some(0))?.end() } #[derive(Serialize, Debug, Eq, PartialEq, Clone)] #[serde(rename_all = "snake_case")] pub enum NumberCondition { Equals(Number), DoesNotEqual(Number), GreaterThan(Number), LessThan(Number), GreaterThanOrEqualTo(Number), LessThanOrEqualTo(Number), #[serde(serialize_with = "serialize_to_true")] IsEmpty, #[serde(serialize_with = "serialize_to_true")] IsNotEmpty, } #[derive(Serialize, Debug, Eq, PartialEq, Clone)] #[serde(rename_all = "snake_case")] pub enum CheckboxCondition { Equals(bool), DoesNotEqual(bool), } #[derive(Serialize, Debug, Eq, PartialEq, Clone)] #[serde(rename_all = "snake_case")] pub enum SelectCondition { /// Only return pages where the page property value matches the provided value exactly. Equals(String), /// Only return pages where the page property value does not match the provided value exactly. DoesNotEqual(String), /// Only return pages where the page property value is empty. #[serde(serialize_with = "serialize_to_true")] IsEmpty, /// Only return pages where the page property value is present. #[serde(serialize_with = "serialize_to_true")] IsNotEmpty, } #[derive(Serialize, Debug, Eq, PartialEq, Clone)] #[serde(rename_all = "snake_case")] pub enum MultiSelectCondition { /// Only return pages where the page property value contains the provided value. Contains(String), /// Only return pages where the page property value does not contain the provided value. DoesNotContain(String), /// Only return pages where the page property value is empty. #[serde(serialize_with = "serialize_to_true")] IsEmpty, /// Only return pages where the page property value is present. #[serde(serialize_with = "serialize_to_true")] IsNotEmpty, } #[derive(Serialize, Debug, Eq, PartialEq, Clone)] #[serde(rename_all = "snake_case")] pub enum DateCondition { /// Only return pages where the page property value matches the provided date exactly. /// Note that the comparison is done against the date. /// Any time information sent will be ignored. Equals(DateTime), /// Only return pages where the page property value is before the provided date. /// Note that the comparison is done against the date. /// Any time information sent will be ignored. Before(DateTime), /// Only return pages where the page property value is after the provided date. /// Note that the comparison is done against the date. /// Any time information sent will be ignored. After(DateTime), /// Only return pages where the page property value is on or before the provided date. /// Note that the comparison is done against the date. /// Any time information sent will be ignored. OnOrBefore(DateTime), /// Only return pages where the page property value is on or after the provided date. /// Note that the comparison is done against the date. /// Any time information sent will be ignored. OnOrAfter(DateTime), /// Only return pages where the page property value is empty. #[serde(serialize_with = "serialize_to_true")] IsEmpty, /// Only return pages where the page property value is present. #[serde(serialize_with = "serialize_to_true")] IsNotEmpty, /// Only return pages where the page property value is within the past week. #[serde(serialize_with = "serialize_to_empty_object")] PastWeek, /// Only return pages where the page property value is within the past month. #[serde(serialize_with = "serialize_to_empty_object")] PastMonth, /// Only return pages where the page property value is within the past year. #[serde(serialize_with = "serialize_to_empty_object")] PastYear, /// Only return pages where the page property value is within the next week. #[serde(serialize_with = "serialize_to_empty_object")] NextWeek, /// Only return pages where the page property value is within the next month. #[serde(serialize_with = "serialize_to_empty_object")] NextMonth, /// Only return pages where the page property value is within the next year. #[serde(serialize_with = "serialize_to_empty_object")] NextYear, } #[derive(Serialize, Debug, Eq, PartialEq, Clone)] #[serde(rename_all = "snake_case")] pub enum PeopleCondition { Contains(UserId), /// Only return pages where the page property value does not contain the provided value. DoesNotContain(UserId), /// Only return pages where the page property value is empty. #[serde(serialize_with = "serialize_to_true")] IsEmpty, /// Only return pages where the page property value is present. #[serde(serialize_with = "serialize_to_true")] IsNotEmpty, } #[derive(Serialize, Debug, Eq, PartialEq, Clone)] #[serde(rename_all = "snake_case")] pub enum FilesCondition { /// Only return pages where the page property value is empty. #[serde(serialize_with = "serialize_to_true")] IsEmpty, /// Only return pages where the page property value is present. #[serde(serialize_with = "serialize_to_true")] IsNotEmpty, } #[derive(Serialize, Debug, Eq, PartialEq, Clone)] #[serde(rename_all = "snake_case")] pub enum RelationCondition { /// Only return pages where the page property value contains the provided value. Contains(PageId), /// Only return pages where the page property value does not contain the provided value. DoesNotContain(PageId), /// Only return pages where the page property value is empty. #[serde(serialize_with = "serialize_to_true")] IsEmpty, /// Only return pages where the page property value is present. #[serde(serialize_with = "serialize_to_true")] IsNotEmpty, } #[derive(Serialize, Debug, Eq, PartialEq, Clone)] #[serde(rename_all = "snake_case")] pub enum FormulaCondition { /// Only return pages where the result type of the page property formula is "text" /// and the provided text filter condition matches the formula's value. Text(TextCondition), /// Only return pages where the result type of the page property formula is "number" /// and the provided number filter condition matches the formula's value. Number(NumberCondition), /// Only return pages where the result type of the page property formula is "checkbox" /// and the provided checkbox filter condition matches the formula's value. Checkbox(CheckboxCondition), /// Only return pages where the result type of the page property formula is "date" /// and the provided date filter condition matches the formula's value. Date(DateCondition), } #[derive(Serialize, Debug, Eq, PartialEq, Clone)] #[serde(rename_all = "snake_case")] pub enum PropertyCondition { Text(TextCondition), Number(NumberCondition), Checkbox(CheckboxCondition), Select(SelectCondition), MultiSelect(MultiSelectCondition), Date(DateCondition), People(PeopleCondition), Files(FilesCondition), Relation(RelationCondition), Formula(FormulaCondition), /// Returns pages when **any** of the filters inside the provided vector match. Or(Vec), /// Returns pages when **all** of the filters inside the provided vector match. And(Vec), } #[derive(Serialize, Debug, Eq, PartialEq, Clone)] pub struct FilterCondition { pub property: String, #[serde(flatten)] pub condition: PropertyCondition, } #[derive(Serialize, Debug, Eq, PartialEq, Clone)] pub struct DatabaseSort { // Todo: Should property and timestamp be mutually exclusive? (i.e a flattened enum?) // the documentation is not clear: // https://developers.notion.com/reference/post-database-query#post-database-query-sort property: Option, /// The name of the timestamp to sort against. timestamp: Option, direction: SortDirection, } #[derive(Serialize, Debug, Eq, PartialEq, Default)] pub struct DatabaseQuery { #[serde(skip_serializing_if = "Option::is_none")] pub sorts: Option>, #[serde(skip_serializing_if = "Option::is_none")] pub filter: Option, #[serde(flatten)] pub paging: Option, } #[derive(Debug, Eq, PartialEq)] pub enum NotionSearch { Query(String), Sort { timestamp: SortTimestamp, direction: SortDirection, }, Filter { property: FilterProperty, value: FilterValue, }, } 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() }, } } } #[cfg(test)] mod tests { mod text_filters { use crate::models::search::PropertyCondition::Text; use crate::models::search::{FilterCondition, TextCondition}; use serde_json::json; #[test] fn text_property_equals() -> Result<(), Box> { let json = serde_json::to_value(&FilterCondition { property: "Name".to_string(), condition: Text(TextCondition::Equals("Test".to_string())), })?; assert_eq!(json, json!({"property":"Name","text":{"equals":"Test"}})); Ok(()) } #[test] fn text_property_contains() -> Result<(), Box> { let json = serde_json::to_value(&FilterCondition { property: "Name".to_string(), condition: Text(TextCondition::Contains("Test".to_string())), })?; assert_eq!( dbg!(json), json!({"property":"Name","text":{"contains":"Test"}}) ); Ok(()) } #[test] fn text_property_is_empty() -> Result<(), Box> { let json = serde_json::to_value(&FilterCondition { property: "Name".to_string(), condition: Text(TextCondition::IsEmpty), })?; assert_eq!( dbg!(json), json!({"property":"Name","text":{"is_empty":true}}) ); Ok(()) } #[test] fn text_property_is_not_empty() -> Result<(), Box> { let json = serde_json::to_value(&FilterCondition { property: "Name".to_string(), condition: Text(TextCondition::IsNotEmpty), })?; assert_eq!( dbg!(json), json!({"property":"Name","text":{"is_not_empty":true}}) ); Ok(()) } } } hod='get' action='/ansg191/bun/log/src/api/schema.js'>
AgeCommit message (Collapse)AuthorFilesLines
2023-10-17Remove ancient changelogGravatar Ashcon Partovi 1-11/+0
2023-10-17docs: fix ws.publish (#6558)Gravatar Aral Roca Gomez 1-1/+1
In this example there is no server variable in the context, and here it makes more sense to use ws.publish. It is explained below that once the serve is done, the server.publish can be used.
2023-10-17perf(bun-types): remove needless some call (#6550)Gravatar Mikhail 1-1/+1
2023-10-16fix(runtime): make some things more stable (partial jsc debug build) (#5881)Gravatar dave caruso 116-1446/+1830
* make our debug assertions work * install bun-webkit-debug * more progress * ok * progress... * more debug build stuff * ok * a * asdfghjkl * fix(runtime): fix bad assertion failure in JSBufferList * ok * stuff * upgrade webkit * Update src/bun.js/bindings/JSDOMWrapperCache.h Co-authored-by: Jarred Sumner <jarred@jarredsumner.com> * fix message for colin's changes * okay * fix cjs prototype * implement mainModule * i think this fixes it all --------- Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
2023-10-16fix(runtime): improve IPC reliability + organization pass on that code (#6475)Gravatar dave caruso 15-98/+266
* dfghj * Handle messages that did not finish * tidy * ok * a * Merge remote-tracking branch 'origin/main' into dave/ipc-fixes * test failures --------- Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
2023-10-16Simplify getting Set of extentions (#4975)Gravatar Mikhail 1-3/+3
2023-10-16Fix formattingGravatar Ashcon Partovi 1-3/+1
2023-10-16fix(test): when tests run with --only the nested describe blocks `.on… (#5616)Gravatar Igor Shapiro 2-13/+45
2023-10-16perf(node:events): optimize `emit(...)` function (#5485)Gravatar Yannik Schröder 3-11/+132
2023-10-16fix: don't remove content-encoding header from header table (#5743)Gravatar Liz 2-2/+25
Closes #5668
2023-10-16fix(sqlite) Insert .all() does not return an array #5872 (#5946)Gravatar Hugo Galan 2-7/+11
* fixing #5872 * removing useless comment
2023-10-16Fix formattingGravatar Ashcon Partovi 2-5/+4
2023-10-16Fix `Response.statusText` (#6151)Gravatar Chris Toshok 10-238/+269
2023-10-16fix-subprocess-argument-missing (#6407)Gravatar Nicolae-Rares Ailincai 4-2/+40
* fix-subprocess-argument-missing * fix-tests * nitpick, these should === not just be undefined --------- Co-authored-by: dave caruso <me@paperdave.net>
2023-10-16Add type parameter to `expect` (#6128)Gravatar Voldemat 1-3/+3
2023-10-16fix(node:worker_threads): ensure threadId property is exposed on ↵Gravatar Jérôme Benoit 6-15/+75
worker_threads instance (#6521) * fix: ensure threadId property is exposed on worker_threads instance Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com> * fix: rename lazy worker_threads module properties Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com> * fix: add getter for threadId Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com> * test: improve worker_threads UTs Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com> * test: fix lazy loading Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com> * test: fix worker_threads test Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org> * fix: return the worker threadId Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com> * test: refine worker_threads expectation on threadId Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org> --------- Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com> Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
2023-10-16Fix use before define bug in sqliteGravatar Ashcon Partovi 2-5/+5
Fixes #6481
2023-10-16fix(jest): fix toStrictEqual on same URLs (#6528)Gravatar João Alisson 2-13/+16
Fixes #6492
2023-10-16Fix `toHaveBeenCalled` having wrong error signatureGravatar Ashcon Partovi 1-2/+2
Fixes #6527
2023-10-16Fix formattingGravatar Ashcon Partovi 1-2/+1
2023-10-16Add `reusePort` to `Bun.serve` typesGravatar Ashcon Partovi 1-0/+9
2023-10-16Fix `request.url` having incorrect portGravatar Ashcon Partovi 4-1/+92
Fixes #6443
2023-10-16Remove uWebSockets header from Bun.serve responsesGravatar Ashcon Partovi 1-6/+6
2023-10-16Rename some testsGravatar Ashcon Partovi 3-0/+0
2023-10-16Fix #6467Gravatar Ashcon Partovi 2-3/+10
2023-10-16Update InternalModuleRegistryConstants.hGravatar Dylan Conway 1-3/+3
2023-10-16Development -> Contributing (#6538)Gravatar Colin McDonnell 2-1/+1
Co-authored-by: Colin McDonnell <colin@KennyM1.local>
2023-10-14fix(net/tls) fix pg hang on end + hanging on query (#6487)Gravatar Ciro Spaciari 3-8/+36
* fix pg hang on end + hanging on query * remove dummy function * fix node-stream * add test * fix test * return error in test * fix test use once instead of on * fix OOM * generated * 💅 * 💅
2023-10-13fix installing dependencies that match workspace versions (#6494)Gravatar Dylan Conway 4-2/+64
* check if dependency matches workspace version * test * Update lockfile.zig * set resolution to workspace package id
2023-10-13fix lockfile struct padding (#6495)Gravatar Dylan Conway 3-3/+18
* integrity padding * error message for bytes at end of struct