package module
Version: v0.0.0-...-022116b Latest Latest

This package is not in the latest version of its module.

Go to latest
Published: Jun 25, 2020 License: MIT Imports: 11 Imported by: 0



Build Status client kit for Go

This client is currently used in production on

Go 1.3 is required.


// start api with the default config (3 workers, 5 seconds timeout on requests)
api, err := goprismic.Get("", "repo key", goprismic.DefaultConfig)

docs, err := api.Master().Form("everything").Query("[[:d = at(document.tags, [\"Featured\"])]]").Order("", goprismic.OrderAsc).Page(1).Submit()
if err != nil {
	// handle error
if len(docs) == 0 {
	// nothing found
doc := docs[0]

st, found := doc.GetStructuredTextFragment("content")
if found {

You have to resolve document links using a user-supplied link resolver :

r := func(l link.Link) string {
	return l.(*link.DocumentLink).Document.Slug

and resolve links at document/fragment/block level :


st, _ := doc.GetStructuredTextFragment("content")

p, _ := st.GetFirstParagraph()


A simple asynchronous caching proxy is included.

// Up to 1000 documents will be cached.
proxy, err := proxy.New("", "repo key", goprismic.DefaultConfig, proxy.Config{CacheSize: 1000})

// Not cached
docs, err := proxy.Direct().Master().Form("everything").Submit()

// Cached
doc, err := proxy.GetDocument(id)

// Cached
doc, err := proxy.GetDocumentBy("product", "fieldname", "fieldvalue")

// Cached
doc, err := proxy.GetDocumentBy("product", "fieldname", "fieldvalue")

// Cached
res, err := proxy.Search().Form("menu").PageSize(200).Submit()

When a document is updated :

  • between "update time" and "update time + TTL", documents are asynchronously refreshed (if a document is accessed, the cached version is returned, and the cache is asynchronously updated),
  • after "update time + TTL", documents are fetched directly from prismic (cache miss).

If no ttl is set, refreshes are always asynchronous.

You can define :

  • a refresh chance (between 0 and 1) - only a fraction of contents will be refreshed at a time, ensuring that prismic is not flooded after an update,
  • a master refresh interval - the proxy will check for updates at the defined frequency.

The proxy will try to avoid flooding prismic by automatically lower/raise the refresh chance.


Access to the prismic api is done using workers, limiting the number of simultaneous connexions to the API.

See for the api documentation and for the proxy documentation.

Blog post :


This bundle is released under the MIT license (see LICENSE).




View Source
const (
	StatusOK = iota
View Source
const (
	OrderAsc = iota


View Source
var DefaultConfig = Config{
	Workers: 3,
	Timeout: 5 * time.Second,

Default configuration


This section is empty.


type Api

type Api struct {
	URL         string
	AccessToken string
	Data        ApiData

	Config Config

	Status int
	// contains filtered or unexported fields

func Get

func Get(u, accessToken string, cfg Config) (*Api, error)

Api entry point Use Get(url, accessToken, DefaultConfig) to use the default config

func (*Api) GetMasterRef

func (a *Api) GetMasterRef() string

Returns the master ref

func (*Api) Master

func (a *Api) Master() *SearchForm

Fetches the master ref

func (*Api) Ref

func (a *Api) Ref(label string) *SearchForm

Fetch another ref

func (*Api) Refresh

func (a *Api) Refresh() error

Refreshes the Api data

type ApiData

type ApiData struct {
	Forms         map[string]Form   `json:"forms"`
	Refs          []Ref             `json:"refs"`
	Bookmarks     map[string]string `json:"bookmarks"`
	Tags          []string          `json:"tags"`
	Types         map[string]string `json:"types"`
	OAuthInitiate string            `json:"oauth_initiate"`
	OAuthToken    string            `json:"oauth_token"`

type Config

type Config struct {
	// Number of workers (simultaneous connections)
	Workers int
	// Timeout for HTTP requests
	Timeout time.Duration
	// Debug mode
	Debug bool

type Document

type Document struct {
	Id        string        `json:"id"`
	Type      string        `json:"type"`
	Href      string        `json:"href"`
	Tags      []string      `json:"tags"`
	Slugs     []string      `json:"slugs"`
	Fragments fragment.Tree `json:"data"`

A document is made of fragments of various types

func (*Document) GetBool

func (d *Document) GetBool(field string) (bool, bool)

Returns the boolean representation of a fragment (the first found)

func (*Document) GetColor

func (d *Document) GetColor(field string) (string, bool)

Returns a color value (the first found)

func (*Document) GetColorFragment

func (d *Document) GetColorFragment(field string) (*fragment.Color, bool)

Returns a color fragment (the first found)

func (*Document) GetDate

func (d *Document) GetDate(field string) (time.Time, bool)

Returns a date value (the first found)

func (*Document) GetDateFragment

func (d *Document) GetDateFragment(field string) (*fragment.Date, bool)

Returns a date fragment (the first found)

func (*Document) GetFragment

func (d *Document) GetFragment(field string) (fragment.Interface, bool)

Returns the first fragment of a certain name

func (*Document) GetFragmentAt

func (d *Document) GetFragmentAt(field string, index int) (fragment.Interface, bool)

Returns the nth fragment of a certain name

func (*Document) GetFragments

func (d *Document) GetFragments(field string) (fragment.List, bool)

Returns the list of fragments of a certain name

func (*Document) GetGeoPointFragment

func (d *Document) GetGeoPointFragment(field string) (*fragment.GeoPoint, bool)

Returns a geopoint fragment (returns the first found)

func (*Document) GetImageFragment

func (d *Document) GetImageFragment(field string) (*fragment.Image, bool)

Returns an image fragment (the first found)

func (*Document) GetLinkFragment

func (d *Document) GetLinkFragment(field string) (*fragment.Link, bool)

Returns a link fragment (the first found)

func (*Document) GetNumber

func (d *Document) GetNumber(field string) (float64, bool)

Returns a number value (the first found)

func (*Document) GetNumberFragment

func (d *Document) GetNumberFragment(field string) (*fragment.Number, bool)

Returns a number fragment (the first found)

func (*Document) GetSlug

func (d *Document) GetSlug() string

Returns the document slug

func (*Document) GetStructuredTextBlocks

func (d *Document) GetStructuredTextBlocks(field string) ([]block.Block, bool)

Returns the list of blocks of a structured text fragment

func (*Document) GetStructuredTextFragment

func (d *Document) GetStructuredTextFragment(field string) (*fragment.StructuredText, bool)

Returns a structured text fragment (returns the first found)

func (*Document) GetText

func (d *Document) GetText(field string) (string, bool)

Returns a text value (the first found)

func (*Document) GetTextFragment

func (d *Document) GetTextFragment(field string) (*fragment.Text, bool)

Returns a text fragment (the first found)

func (*Document) HasSlug

func (d *Document) HasSlug(slug string) bool

Tests if the document has a slug

func (d *Document) ResolveLinks(r link.Resolver)

Resolves links

type Field

type Field struct {
	Type    string `json:"type"`
	Default string `json:"default"`

A form field

type Form

type Form struct {
	Name    string           `json:"name"`
	Method  string           `json:"method"`
	Rel     string           `json:"rel"`
	EncType string           `json:"enctype"`
	Action  string           `json:"action"`
	Fields  map[string]Field `json:"fields"`

A form

type PrismicError

type PrismicError struct {
	Message string `json:"message"`
	Type    string `json:"type"`
	Line    int    `json:"line"`
	Column  int    `json:"column"`
	Until   int64  `json:"until"`

func (*PrismicError) Error

func (e *PrismicError) Error() string

func (*PrismicError) IsOverCapacity

func (e *PrismicError) IsOverCapacity() bool

type Ref

type Ref struct {
	Id          string `json:"id"`
	Ref         string `json:"ref"`
	Label       string `json:"label"`
	IsMasterRef bool   `json:"isMasterRef"`
	ScheduledAt int64  `json:"scheduledAt"`

func (*Ref) ScheduledTime

func (r *Ref) ScheduledTime() *time.Time

type SearchForm

type SearchForm struct {
	// contains filtered or unexported fields

func (*SearchForm) Data

func (s *SearchForm) Data(data map[string]string) *SearchForm

Adds form data

func (*SearchForm) Error

func (s *SearchForm) Error() error

Returns the error

func (*SearchForm) Form

func (s *SearchForm) Form(name string) *SearchForm

Selects the form on which to use

func (*SearchForm) Order

func (s *SearchForm) Order(field string, order int) *SearchForm

Order result - can be chained multiple times

example : form.Order("", OrderAsc).Order("my.product.size", OrderDesc)

func (*SearchForm) Page

func (s *SearchForm) Page(page int) *SearchForm

Sets the page number

func (*SearchForm) PageSize

func (s *SearchForm) PageSize(pageSize int) *SearchForm

Sets the page size

func (*SearchForm) Query

func (s *SearchForm) Query(query string) *SearchForm

Query the form using a predicate query ([[:d = any(document.type, ["article"])]])

func (*SearchForm) Submit

func (s *SearchForm) Submit() (*SearchResult, error)

Searches the repository

type SearchResult

type SearchResult struct {
	Page           int        `json:"page"`
	TotalPages     int        `json:"total_pages"`
	ResultsPerPage int        `json:"results_per_page"`
	TotalResults   int        `json:"total_results_size"`
	Results        []Document `json:"results"`


Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL