Documentation
¶
Overview ¶
Package content defines the content object at the center of the CMS.
Index ¶
- Constants
- Variables
- func AddressPrefix(path, slug string) string
- func AddressUnder(prefix, slug string) string
- func FirstSegment(path string) string
- func ReservedRoot(segment string) bool
- func Slugify(title string) string
- type Address
- type AddressReader
- type Content
- type Filter
- type Kind
- type Order
- type OrderBy
- type PageKind
- type Registry
- func (r *Registry) Active(ctx context.Context, key string) (Type, error)
- func (r *Registry) All(ctx context.Context) ([]Type, error)
- func (r *Registry) ByKey(ctx context.Context, key string) (Type, error)
- func (r *Registry) ByRouteWord(ctx context.Context, word string) (Type, error)
- func (r *Registry) Create(ctx context.Context, t Type) (Type, error)
- func (r *Registry) Default(ctx context.Context) (Type, error)
- func (r *Registry) Delete(ctx context.Context, key string) error
- func (r *Registry) Update(ctx context.Context, t Type) (Type, error)
- type Resolver
- type Revision
- type RevisionKind
- type Status
- type Store
- type Type
- type TypeReader
- type TypeStore
Constants ¶
const MaxDepth = 10
MaxDepth bounds how many levels of content nest under one another.
const PageWord = "page"
PageWord is the segment a numbered listing hides behind.
const TypePost = "post"
TypePost is the key of the built-in post type.
Variables ¶
var ErrConflict = errors.New("content: conflicting update")
ErrConflict reports that the content item changed after the update was prepared.
var ErrCycle = errors.New("content: the item cannot nest inside itself")
ErrCycle reports that content would nest inside itself.
var ErrDefaultRequired = errors.New("content: the default type must stay")
ErrDefaultRequired reports that the default content type may not be deactivated or removed.
var ErrHoldsChildren = errors.New("content: the item still holds children")
ErrHoldsChildren reports that content still holds content nested under it.
var ErrInvalidAuthor = errors.New("content: invalid author")
ErrInvalidAuthor reports that a content item carries no author.
var ErrInvalidKey = errors.New("content: invalid type key")
ErrInvalidKey reports that a type key is not a lowercase word.
var ErrInvalidLabel = errors.New("content: invalid type label")
ErrInvalidLabel reports that a type carries no label.
var ErrInvalidOrder = errors.New("content: invalid order")
ErrInvalidOrder reports that a sort direction is not one the CMS sorts in.
var ErrInvalidOrderBy = errors.New("content: invalid orderby")
ErrInvalidOrderBy reports that a sort column is not one the CMS sorts by.
var ErrInvalidPageKind = errors.New("content: invalid page kind")
ErrInvalidPageKind reports that a page kind is not one the CMS renders.
var ErrInvalidRevisionCap = errors.New("content: invalid revision cap")
ErrInvalidRevisionCap reports that a revision cap is not a number of rows.
var ErrInvalidRouteWord = errors.New("content: invalid route word")
ErrInvalidRouteWord reports that a route word is not a lowercase word.
var ErrInvalidStatus = errors.New("content: invalid status")
ErrInvalidStatus reports that a status value is not one the CMS stores.
var ErrInvalidTransition = errors.New("content: invalid status transition")
ErrInvalidTransition reports that a status change is not allowed.
var ErrInvalidType = errors.New("content: invalid type")
ErrInvalidType reports that a content type is not registered.
var ErrNotFound = errors.New("content: not found")
ErrNotFound reports that no content item exists for the requested ID.
var ErrNotHierarchical = errors.New("content: the type does not nest")
ErrNotHierarchical reports that a content type does not nest.
ErrPageKindUnavailable reports that a page kind waits for relation fields.
var ErrParentTrashed = errors.New("content: the parent is in the trash")
ErrParentTrashed reports that a parent is on its way out of the site.
var ErrParentType = errors.New("content: the parent holds another kind of content")
ErrParentType reports that a parent holds another kind of content.
var ErrReservedAddress = errors.New("content: the address is reserved")
ErrReservedAddress reports that an address names a place the CMS keeps.
var ErrRevisionNotFound = errors.New("content: revision not found")
ErrRevisionNotFound reports that no revision exists for the requested ID.
var ErrRootTaken = errors.New("content: another type holds the root")
ErrRootTaken reports that another content type already lives at the root.
var ErrRouteWordReserved = errors.New("content: route word reserved")
ErrRouteWordReserved reports that the route word names a place the CMS keeps.
var ErrRouteWordTaken = errors.New("content: route word taken")
ErrRouteWordTaken reports that another content type answers under the route word.
var ErrSlugTaken = errors.New("content: slug taken")
ErrSlugTaken reports that a content type already holds the requested slug.
var ErrTooDeep = errors.New("content: the nesting limit is reached")
ErrTooDeep reports that content nests beyond the limit.
var ErrTypeInUse = errors.New("content: type still holds content")
ErrTypeInUse reports that the content type still holds content.
var ErrTypeInactive = errors.New("content: type is not active")
ErrTypeInactive reports that the content type is not active.
var ErrTypeNotFound = errors.New("content: type not found")
ErrTypeNotFound reports that no content type carries the requested key.
var ErrTypeTaken = errors.New("content: type key taken")
ErrTypeTaken reports that a content type already carries the requested key.
var ReservedRouteWords = []string{"admin", "api", "gophenberg", "_gophenberg", "media"}
ReservedRouteWords are the first address segments the CMS keeps for itself.
Functions ¶
func AddressPrefix ¶
AddressPrefix returns the address an item's slug hangs from.
func AddressUnder ¶
AddressUnder returns the address of a child carrying slug beneath prefix.
func FirstSegment ¶
FirstSegment returns the first segment of an address.
func ReservedRoot ¶
ReservedRoot reports whether the segment names a place the CMS keeps for itself.
Types ¶
type AddressReader ¶
AddressReader reads the published content an address holds.
type Content ¶
type Content struct {
ID uuid.UUID
Type string
ParentID *uuid.UUID
Path string
Slug string
Title string
Content string
Excerpt string
Status Status
AuthorID uuid.UUID
PublishedAt *time.Time
CreatedAt time.Time
UpdatedAt time.Time
}
Content is a content item holding Gutenberg-serialized block HTML.
func Reparent ¶
Reparent returns the item and the height it carries nested under parent, or the reason they may not sit there.
func (Content) Rename ¶
Rename returns the item carrying slug where it already answers, or the reason it may not.
func (*Content) Restore ¶
Restore returns a trashed content item to draft, or reports ErrInvalidTransition.
func (*Content) Transition ¶
Transition moves the content item to the given status, stamping PublishedAt on the first publication and returning ErrInvalidTransition when disallowed.
type Filter ¶
type Filter struct {
Type string
Status Status
Search string
OrderBy OrderBy
Order Order
Page int
PerPage int
}
Filter narrows a content listing.
type Order ¶
type Order string
Order names a sort direction.
The directions a listing can be sorted in.
func ParseOrder ¶
ParseOrder returns the direction named by raw, or ErrInvalidOrder.
type OrderBy ¶
type OrderBy string
OrderBy names a column a listing can be sorted by.
The columns a listing can be sorted by.
func ParseOrderBy ¶
ParseOrderBy returns the column named by raw, or ErrInvalidOrderBy.
type Registry ¶
type Registry struct {
// contains filtered or unexported fields
}
Registry answers which content types the CMS holds, caching what it reads.
func NewRegistry ¶
NewRegistry returns a Registry reading through store.
func (*Registry) Active ¶
Active returns the type carrying the key when it is active, or the reason it serves nothing.
func (*Registry) ByKey ¶
ByKey returns the type carrying the key, or ErrTypeNotFound.
func (*Registry) ByRouteWord ¶
ByRouteWord returns the active type answering under the word, or ErrTypeNotFound.
func (*Registry) Default ¶
Default returns the type living at the root, or ErrTypeNotFound.
type Resolver ¶
type Resolver struct {
// contains filtered or unexported fields
}
Resolver answers what a public address holds.
func NewResolver ¶
func NewResolver(store AddressReader, registry TypeReader) *Resolver
NewResolver returns a Resolver reading content through store and types through registry.
type Revision ¶
type Revision struct {
ID uuid.UUID
ContentID uuid.UUID
Kind RevisionKind
AuthorID uuid.UUID
Title string
Content string
Excerpt string
CreatedAt time.Time
}
Revision is a snapshot of a content item's editable content.
func NewRevision ¶
NewRevision returns a snapshot of the item's editable content, credited to the given author.
type RevisionKind ¶
type RevisionKind string
RevisionKind distinguishes an update snapshot from a per-author autosave.
const ( RevisionKindRevision RevisionKind = "revision" RevisionKindAutosave RevisionKind = "autosave" )
The kinds of revision a content item carries.
type Status ¶
type Status string
Status is the publication state of a content item.
const ( StatusDraft Status = "draft" StatusPending Status = "pending" StatusPrivate Status = "private" StatusScheduled Status = "scheduled" StatusPublished Status = "published" StatusTrash Status = "trash" )
The statuses a content item may hold. Scheduled is stored but unreachable until a publish worker exists.
func ParseStatus ¶
ParseStatus returns the Status named by value, or ErrInvalidStatus.
type Store ¶
type Store interface {
Create(ctx context.Context, c Content) (Content, error)
ByID(ctx context.Context, id uuid.UUID) (Content, error)
PublishedByPath(ctx context.Context, path string) (Content, error)
Children(ctx context.Context, id uuid.UUID) (int, error)
Depth(ctx context.Context, id uuid.UUID) (int, error)
List(ctx context.Context, f Filter) ([]Content, int, error)
Update(
ctx context.Context, c Content, expectedUpdatedAt time.Time, snapshot *Revision, revisionCap int,
) (Content, error)
Trash(ctx context.Context, id uuid.UUID, updatedAt time.Time) (Content, error)
Restore(ctx context.Context, id uuid.UUID, updatedAt time.Time) (Content, error)
Delete(ctx context.Context, id uuid.UUID) error
Counts(ctx context.Context, contentType string) (map[Status]int, error)
Revisions(ctx context.Context, contentID uuid.UUID) ([]Revision, error)
RevisionByID(ctx context.Context, contentID, revisionID uuid.UUID) (Revision, error)
DeleteRevision(ctx context.Context, contentID, revisionID uuid.UUID) error
SaveAutosave(ctx context.Context, autosave Revision) (Revision, error)
Autosave(ctx context.Context, contentID, authorID uuid.UUID) (Revision, error)
DeleteAutosave(ctx context.Context, contentID, authorID uuid.UUID) error
}
Store persists content items and their revisions.
type Type ¶
type Type struct {
Key string
SingularLabel string
PluralLabel string
RouteWord string
Hierarchical bool
Revisions bool
RevisionCap int
PageKind PageKind
Default bool
Active bool
CreatedAt time.Time
UpdatedAt time.Time
}
Type describes a kind of content the CMS stores.
type TypeReader ¶
TypeReader answers which type answers under a route word.
type TypeStore ¶
type TypeStore interface {
List(ctx context.Context) ([]Type, error)
ByKey(ctx context.Context, key string) (Type, error)
Create(ctx context.Context, t Type) (Type, error)
Update(ctx context.Context, t Type) (Type, error)
Delete(ctx context.Context, key string) error
}
TypeStore persists the content type registry.