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

243 lines
8.9 KiB
Go
Raw Permalink Normal View History

2021-05-13 22:11:32 +02:00
package notion
import (
"time"
)
// Database is a resource on the Notion platform.
// See: https://developers.notion.com/reference/database
type Database struct {
ID string `json:"id"`
CreatedTime time.Time `json:"created_time"`
LastEditedTime time.Time `json:"last_edited_time"`
Title []RichText `json:"title"`
Properties DatabaseProperties `json:"properties"`
}
2021-05-14 23:47:15 +02:00
// DatabaseProperties is a mapping of properties defined on a database.
2021-05-14 17:34:46 +02:00
type DatabaseProperties map[string]DatabaseProperty
2021-05-13 22:11:32 +02:00
// Database property metadata types.
2021-05-13 22:11:32 +02:00
type (
NumberMetadata struct {
2021-05-13 22:11:32 +02:00
Format string `json:"format"`
}
SelectMetadata struct {
2021-05-13 22:11:32 +02:00
Options []SelectOptions `json:"options"`
}
FormulaMetadata struct {
2021-05-13 22:11:32 +02:00
Expression string `json:"expression"`
}
RelationMetadata struct {
DatabaseID string `json:"database_id,omitempty"`
SyncedPropName *string `json:"synced_property_name,omitempty"`
SyncedPropID *string `json:"synced_property_id,omitempty"`
2021-05-13 22:11:32 +02:00
}
RollupMetadata struct {
RelationPropName string `json:"relation_property_name,omitempty"`
RelationPropID string `json:"relation_property_id,omitempty"`
RollupPropName string `json:"rollup_property_name,omitempty"`
RollupPropID string `json:"rollup_property_id,omitempty"`
Function string `json:"function,omitempty"`
2021-05-13 22:11:32 +02:00
}
)
type SelectOptions struct {
ID string `json:"id,omitempty"`
Name string `json:"name,omitempty"`
Color Color `json:"color,omitempty"`
2021-05-13 22:11:32 +02:00
}
type DatabaseProperty struct {
2021-05-15 13:42:01 +02:00
ID string `json:"id"`
Type DatabasePropertyType `json:"type"`
2021-05-13 22:11:32 +02:00
Number *NumberMetadata `json:"number,omitempty"`
Select *SelectMetadata `json:"select,omitempty"`
MultiSelect *SelectMetadata `json:"multi_select,omitempty"`
Formula *FormulaMetadata `json:"formula,omitempty"`
Relation *RelationMetadata `json:"relation,omitempty"`
Rollup *RollupMetadata `json:"rollup,omitempty"`
}
2021-05-14 23:47:15 +02:00
// DatabaseQuery is used for quering a database.
type DatabaseQuery struct {
Filter DatabaseQueryFilter `json:"filter,omitempty"`
Sorts []DatabaseQuerySort `json:"sorts,omitempty"`
StartCursor string `json:"start_cursor,omitempty"`
PageSize int `json:"page_size,omitempty"`
}
// DatabaseQueryResponse contains the results and pagination data from a query request.
type DatabaseQueryResponse struct {
Results []Page `json:"results"`
HasMore bool `json:"has_more"`
NextCursor *string `json:"next_cursor"`
}
// DatabaseQueryFilter is used to filter database contents.
// See: https://developers.notion.com/reference/post-database-query#post-database-query-filter
type DatabaseQueryFilter struct {
Property string `json:"property,omitempty"`
Text TextDatabaseQueryFilter `json:"text,omitempty"`
Number NumberDatabaseQueryFilter `json:"number,omitempty"`
Checkbox CheckboxDatabaseQueryFilter `json:"checkbox,omitempty"`
Select SelectDatabaseQueryFilter `json:"select,omitempty"`
MultiSelect MultiSelectDatabaseQueryFilter `json:"multi_select,omitempty"`
Date DateDatabaseQueryFilter `json:"date,omitempty"`
People PeopleDatabaseQueryFilter `json:"people,omitempty"`
Files FilesDatabaseQueryFilter `json:"files,omitempty"`
Relation RelationDatabaseQueryFilter `json:"relation,omitempty"`
Or []DatabaseQueryFilter `json:"or,omitempty"`
And []DatabaseQueryFilter `json:"and,omitempty"`
}
type TextDatabaseQueryFilter struct {
Equals string `json:"equals,omitempty"`
DoesNotEqual string `json:"does_not_equal,omitempty"`
Contains string `json:"contains,omitempty"`
DoesNotContain string `json:"does_not_contain,omitempty"`
StartsWith string `json:"starts_with,omitempty"`
EndsWith string `json:"ends_with,omitempty"`
IsEmpty bool `json:"is_empty,omitempty"`
IsNotEmpty bool `json:"is_not_empty,omitempty"`
}
type NumberDatabaseQueryFilter struct {
Equals *int `json:"equals,omitempty"`
DoesNotEqual *int `json:"does_not_equal,omitempty"`
GreaterThan *int `json:"greater_than,omitempty"`
LessThan *int `json:"less_than,omitempty"`
GreaterThanOrEqualTo *int `json:"greater_than_or_equal_to,omitempty"`
LessThanOrEqualTo *int `json:"less_than_or_equal_to,omitempty"`
IsEmpty bool `json:"is_empty,omitempty"`
IsNotEmpty bool `json:"is_not_empty,omitempty"`
}
type CheckboxDatabaseQueryFilter struct {
Equals *bool `json:"equals,omitempty"`
DoesNotEqual *bool `json:"does_not_equal,omitempty"`
}
type SelectDatabaseQueryFilter struct {
Equals string `json:"equals,omitempty"`
DoesNotEqual string `json:"does_not_equal,omitempty"`
IsEmpty bool `json:"is_empty,omitempty"`
IsNotEmpty bool `json:"is_not_empty,omitempty"`
}
type MultiSelectDatabaseQueryFilter struct {
Contains string `json:"contains,omitempty"`
DoesNotContain string `json:"does_not_contain,omitempty"`
IsEmpty bool `json:"is_empty,omitempty"`
IsNotEmpty bool `json:"is_not_empty,omitempty"`
}
type DateDatabaseQueryFilter struct {
2021-05-15 13:42:01 +02:00
Equals *time.Time `json:"equals,omitempty"`
Before *time.Time `json:"before,omitempty"`
After *time.Time `json:"after,omitempty"`
OnOrBefore *time.Time `json:"on_or_before,omitempty"`
OnOrAfter *time.Time `json:"on_or_after,omitempty"`
IsEmpty bool `json:"is_empty,omitempty"`
IsNotEmpty bool `json:"is_not_empty,omitempty"`
PastWeek *struct{} `json:"past_week,omitempty"`
PastMonth *struct{} `json:"past_month,omitempty"`
PastYear *struct{} `json:"past_year,omitempty"`
NextWeek *struct{} `json:"next_week,omitempty"`
NextMonth *struct{} `json:"next_month,omitempty"`
NextYear *struct{} `json:"next_year,omitempty"`
2021-05-14 23:47:15 +02:00
}
type PeopleDatabaseQueryFilter struct {
Contains string `json:"contains,omitempty"`
DoesNotContain string `json:"does_not_contain,omitempty"`
IsEmpty bool `json:"is_empty,omitempty"`
IsNotEmpty bool `json:"is_not_empty,omitempty"`
}
type FilesDatabaseQueryFilter struct {
IsEmpty bool `json:"is_empty,omitempty"`
IsNotEmpty bool `json:"is_not_empty,omitempty"`
}
type RelationDatabaseQueryFilter struct {
Contains string `json:"contains,omitempty"`
DoesNotContain string `json:"does_not_contain,omitempty"`
IsEmpty bool `json:"is_empty,omitempty"`
IsNotEmpty bool `json:"is_not_empty,omitempty"`
}
type FormulaDatabaseQueryFilter struct {
Text TextDatabaseQueryFilter `json:"text,omitempty"`
Checkbox CheckboxDatabaseQueryFilter `json:"checkbox,omitempty"`
Number NumberDatabaseQueryFilter `json:"number,omitempty"`
Date DateDatabaseQueryFilter `json:"date,omitempty"`
}
type DatabaseQuerySort struct {
Property string `json:"property,omitempty"`
Timestamp SortTimestamp `json:"timestamp,omitempty"`
Direction SortDirection `json:"direction,omitempty"`
}
type (
2021-05-15 13:42:01 +02:00
DatabasePropertyType string
SortTimestamp string
SortDirection string
2021-05-14 23:47:15 +02:00
)
const (
2021-05-15 13:42:01 +02:00
// Database property type enums.
DBPropTypeTitle DatabasePropertyType = "title"
DBPropTypeRichText DatabasePropertyType = "rich_text"
DBPropTypeNumber DatabasePropertyType = "number"
DBPropTypeSelect DatabasePropertyType = "select"
DBPropTypeMultiSelect DatabasePropertyType = "multi_select"
DBPropTypeDate DatabasePropertyType = "date"
DBPropTypePeople DatabasePropertyType = "people"
DBPropTypeFile DatabasePropertyType = "file"
DBPropTypeCheckbox DatabasePropertyType = "checkbox"
DBPropTypeURL DatabasePropertyType = "url"
DBPropTypeEmail DatabasePropertyType = "email"
DBPropTypePhoneNumber DatabasePropertyType = "phone_number"
DBPropTypeFormula DatabasePropertyType = "formula"
DBPropTypeRelation DatabasePropertyType = "relation"
DBPropTypeRollup DatabasePropertyType = "rollup"
DBPropTypeCreatedTime DatabasePropertyType = "created_time"
DBPropTypeCreatedBy DatabasePropertyType = "created_by"
DBPropTypeLastEditedTime DatabasePropertyType = "last_edited_time"
DBPropTypeLastEditedBy DatabasePropertyType = "last_edited_by"
2021-05-14 23:47:15 +02:00
// Sort timestamp enums.
SortTimeStampCreatedTime SortTimestamp = "created_time"
SortTimeStampLastEditedTime SortTimestamp = "last_edited_time"
// Sort direction enums.
SortDirAsc SortDirection = "ascending"
SortDirDesc SortDirection = "descending"
)
// Metadata returns the underlying property metadata, based on its `type` field.
// When type is unknown/unmapped or doesn't have additional properies, `nil` is returned.
func (prop DatabaseProperty) Metadata() interface{} {
switch prop.Type {
case "number":
return prop.Number
case "select":
return prop.Select
case "multi_select":
return prop.MultiSelect
case "formula":
return prop.Formula
case "relation":
return prop.Relation
case "rollup":
return prop.Rollup
default:
return nil
}
2021-05-13 22:11:32 +02:00
}