mirror of
https://github.com/dstotijn/go-notion.git
synced 2025-12-23 23:51:17 +02:00
Add "query database" endpoint
This commit is contained in:
95
page.go
Normal file
95
page.go
Normal file
@@ -0,0 +1,95 @@
|
||||
package notion
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"time"
|
||||
)
|
||||
|
||||
// Page is a resource on the Notion platform. Its parent is either a workspace,
|
||||
// another page, or a database.
|
||||
// See: https://developers.notion.com/reference/page
|
||||
type Page struct {
|
||||
ID string `json:"id"`
|
||||
CreatedTime time.Time `json:"created_time"`
|
||||
LastEditedTime time.Time `json:"last_edited_time"`
|
||||
Parent PageParent `json:"parent"`
|
||||
Archived bool `json:"archived"`
|
||||
|
||||
// Properties differ between parent type.
|
||||
// See the `UnmarshalJSON` method.
|
||||
Properties interface{} `json:"properties"`
|
||||
}
|
||||
|
||||
type PageParent struct {
|
||||
Type string `json:"type"`
|
||||
|
||||
PageID *string `json:"page_id"`
|
||||
DatabaseID *string `json:"database_id"`
|
||||
}
|
||||
|
||||
// PageProperties are properties of a page whose parent is a page or a workspace.
|
||||
type PageProperties struct {
|
||||
Title struct {
|
||||
Title []RichText `json:"title"`
|
||||
} `json:"title"`
|
||||
}
|
||||
|
||||
// DatabasePageProperties are properties of a page whose parent is a database.
|
||||
type DatabasePageProperties map[string]DatabasePageProperty
|
||||
|
||||
type DatabasePageProperty struct {
|
||||
DatabaseProperty
|
||||
RichText []RichText `json:"rich_text"`
|
||||
Select *SelectMetadata `json:"select"`
|
||||
MultiSelect []SelectMetadata `json:"multi_select"`
|
||||
}
|
||||
|
||||
// UnmarshalJSON implements json.Unmarshaler.
|
||||
//
|
||||
// Pages get a different Properties type based on the parent of the page.
|
||||
// If parent type is `workspace` or `page_id`, PageProperties is used. Else if
|
||||
// parent type is `database_id`, DatabasePageProperties is used.
|
||||
func (p *Page) UnmarshalJSON(b []byte) error {
|
||||
type (
|
||||
PageAlias Page
|
||||
PageDTO struct {
|
||||
PageAlias
|
||||
Properties json.RawMessage `json:"properties"`
|
||||
}
|
||||
)
|
||||
|
||||
var dto PageDTO
|
||||
|
||||
err := json.Unmarshal(b, &dto)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
page := dto.PageAlias
|
||||
|
||||
switch dto.Parent.Type {
|
||||
case "workspace":
|
||||
fallthrough
|
||||
case "page_id":
|
||||
var props PageProperties
|
||||
err := json.Unmarshal(dto.Properties, &props)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
page.Properties = props
|
||||
case "database_id":
|
||||
var props DatabasePageProperties
|
||||
err := json.Unmarshal(dto.Properties, &props)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
page.Properties = props
|
||||
default:
|
||||
return fmt.Errorf("unknown page parent type %q", dto.Parent.Type)
|
||||
}
|
||||
|
||||
*p = Page(page)
|
||||
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user