From e5130d1fde8fdcfeb09fdfbff0a9d93a313a17bf Mon Sep 17 00:00:00 2001 From: David Stotijn Date: Mon, 24 May 2021 16:33:03 +0200 Subject: [PATCH] Fix incorrect types for `Formula`, `Relation` and `Rollup` page props Fixes #11 --- client_test.go | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++ database.go | 64 +++++++++++++++++++++++++++++++++++++++++++++ page.go | 18 ++++++------- util.go | 5 ++++ 4 files changed, 148 insertions(+), 9 deletions(-) diff --git a/client_test.go b/client_test.go index cccc2b8..32f7d3f 100644 --- a/client_test.go +++ b/client_test.go @@ -471,6 +471,41 @@ func TestQueryDatabase(t *testing.T) { "href": null } ] + }, + "Age": { + "id": "$9nb", + "type": "number", + "number": 42 + }, + "Calculation": { + "id": "s(4f", + "type": "formula", + "formula": { + "type": "number", + "number": 42 + } + }, + "Relation": { + "id": "Cxl[", + "type": "relation", + "relation": [ + { + "id": "2be9597f-693f-4b87-baf9-efc545d38ebe" + } + ] + }, + "Rollup": { + "id": "xyA}", + "type": "rollup", + "rollup": { + "type": "array", + "array": [ + { + "type": "number", + "number": 42 + } + ] + } } } } @@ -536,6 +571,41 @@ func TestQueryDatabase(t *testing.T) { }, }, }, + "Age": notion.DatabasePageProperty{ + ID: "$9nb", + Type: notion.DBPropTypeNumber, + Number: notion.Float64Ptr(42), + }, + "Calculation": notion.DatabasePageProperty{ + ID: "s(4f", + Type: notion.DBPropTypeFormula, + Formula: ¬ion.FormulaResult{ + Type: notion.FormulaResultTypeNumber, + Number: notion.Float64Ptr(float64(42)), + }, + }, + "Relation": notion.DatabasePageProperty{ + ID: "Cxl[", + Type: notion.DBPropTypeRelation, + Relation: []notion.Relation{ + { + ID: "2be9597f-693f-4b87-baf9-efc545d38ebe", + }, + }, + }, + "Rollup": notion.DatabasePageProperty{ + ID: "xyA}", + Type: notion.DBPropTypeRollup, + Rollup: ¬ion.RollupResult{ + Type: notion.RollupResultTypeArray, + Array: []notion.DatabasePageProperty{ + { + Type: notion.DBPropTypeNumber, + Number: notion.Float64Ptr(42), + }, + }, + }, + }, }, }, }, diff --git a/database.go b/database.go index df08e69..dc1c5f9 100644 --- a/database.go +++ b/database.go @@ -48,6 +48,27 @@ type SelectOptions struct { Color Color `json:"color,omitempty"` } +type FormulaResult struct { + Type FormulaResultType `json:"type"` + + String *string `json:"string,omitempty"` + Number *float64 `json:"number,omitempty"` + Boolean *bool `json:"boolean,omitempty"` + Date *Date `json:"date,omitempty"` +} + +type Relation struct { + ID string `json:"id"` +} + +type RollupResult struct { + Type RollupResultType `json:"type"` + + Number *float64 `json:"number,omitempty"` + Date *Date `json:"date,omitempty"` + Array []DatabasePageProperty `json:"array,omitempty"` +} + type DatabaseProperty struct { ID string `json:"id"` Type DatabasePropertyType `json:"type"` @@ -186,6 +207,8 @@ type DatabaseQuerySort struct { type ( DatabasePropertyType string NumberFormat string + FormulaResultType string + RollupResultType string SortTimestamp string SortDirection string ) @@ -225,6 +248,17 @@ const ( NumberFormatWon NumberFormat = "won" NumberformatYuan NumberFormat = "yuan" + // Formula result type enums. + FormulaResultTypeString FormulaResultType = "string" + FormulaResultTypeNumber FormulaResultType = "number" + FormulaResultTypeBoolean FormulaResultType = "boolean" + FormulaResultTypeDate FormulaResultType = "date" + + // Rollup result type enums. + RollupResultTypeNumber RollupResultType = "number" + RollupResultTypeDate RollupResultType = "date" + RollupResultTypeArray RollupResultType = "array" + // Sort timestamp enums. SortTimeStampCreatedTime SortTimestamp = "created_time" SortTimeStampLastEditedTime SortTimestamp = "last_edited_time" @@ -254,3 +288,33 @@ func (prop DatabaseProperty) Metadata() interface{} { return nil } } + +// Value returns the underlying result value of an evaluated formula. +func (f FormulaResult) Value() interface{} { + switch f.Type { + case FormulaResultTypeString: + return f.String + case FormulaResultTypeNumber: + return f.Number + case FormulaResultTypeBoolean: + return f.Boolean + case FormulaResultTypeDate: + return f.Date + default: + return nil + } +} + +// Value returns the underlying result value of an evaluated rollup. +func (r RollupResult) Value() interface{} { + switch r.Type { + case RollupResultTypeNumber: + return r.Number + case RollupResultTypeDate: + return r.Date + case RollupResultTypeArray: + return r.Array + default: + return nil + } +} diff --git a/page.go b/page.go index aa7208a..5373e43 100644 --- a/page.go +++ b/page.go @@ -45,15 +45,15 @@ type DatabasePageProperty struct { ID string `json:"id,omitempty"` Type DatabasePropertyType `json:"type,omitempty"` - Title []RichText `json:"title,omitempty"` - RichText []RichText `json:"rich_text,omitempty"` - Number *NumberMetadata `json:"number,omitempty"` - Select *SelectOptions `json:"select,omitempty"` - MultiSelect []SelectOptions `json:"multi_select,omitempty"` - Date *Date `json:"date,omitempty"` - Formula *FormulaMetadata `json:"formula,omitempty"` - Relation *RelationMetadata `json:"relation,omitempty"` - Rollup *RollupMetadata `json:"rollup,omitempty"` + Title []RichText `json:"title,omitempty"` + RichText []RichText `json:"rich_text,omitempty"` + Number *float64 `json:"number,omitempty"` + Select *SelectOptions `json:"select,omitempty"` + MultiSelect []SelectOptions `json:"multi_select,omitempty"` + Date *Date `json:"date,omitempty"` + Formula *FormulaResult `json:"formula,omitempty"` + Relation []Relation `json:"relation,omitempty"` + Rollup *RollupResult `json:"rollup,omitempty"` } // CreatePageParams are the params used for creating a page. diff --git a/util.go b/util.go index 83a0949..e7731ab 100644 --- a/util.go +++ b/util.go @@ -21,3 +21,8 @@ func BoolPtr(b bool) *bool { func TimePtr(t time.Time) *time.Time { return &t } + +// Float64Ptr returns the pointer of a float64 value. +func Float64Ptr(f float64) *float64 { + return &f +}