1
0
mirror of https://github.com/dstotijn/go-notion.git synced 2025-06-08 23:46:12 +02:00
go-notion/page.go

96 lines
2.2 KiB
Go
Raw Normal View History

2021-05-14 23:47:15 +02:00
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
}