Skip to content

mattdean1/contentful-sync-redis

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

27 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Build Status

contentful-sync-redis

Keep an up-to-date copy of your Contentful space in Redis

What does this package do?

  • Keeps a copy of your Contentful space in Redis, using the Contentful Sync API.
  • Provides a helper function to resolve Links inside your entries.

Why wouldn't I use the Contentful Javascript SDK?

The Contentful JS SDK is a only thin wrapper on top of their API, and it can be tedious to implement the Sync API in every project.

Install

npm install --save contentful-sync-redis

Usage

const ContentfulSyncRedis = require('contentful-sync-redis')
const cf = new ContentfulSyncRedis({ space: 'space_id', token: 'access_token' })
cf.getEntries()
	.then(entries => yourFunction(entries))

API

Initialisation

Initialise the module using the new operator, passing in the mandatory values for:

  • Contentful space ID
  • Contentful access token

Optionally, also pass in:

  • Contentful API host
    • Default: cdn.contentful.com
  • Redis URL
    • Default: redis://localhost:6379
const ContentfulSyncRedis = require('contentful-sync-redis')
const cf = new ContentfulSyncRedis({
	space: 'string',
	token: 'string',
	contentfulHost: 'optionalString',
	redisHost: 'optionalString',
})

Synchronisation

Perform the initial download of content to Redis - it's often worth calling this just after initialisation

cf.sync() // returns an empty promise

Getting Entries

Return all entries in the Contentful space, after making sure the cache is synced.

You can use this without calling sync() beforehand.

cf.getEntries() // returns a promise containing the entries

Get Entries and Resolve Links

A wrapper function that calls getEntries and then resolveReferences.

cf.getResolvedEntries(entries) // returns a promise containing the resolved entries

Resolving Links

Dereferences links to other entries in your content and groups fields by locale. Pass in an array of entries.

cf.resolveReferences(entries) // returns a promise containing the resolved entries

e.g.

cf.resolveReferences([
	{
	  sys: { ... },
	  fields: {
	    title: {
	      "en-US": `Home`,
	    },
	    summary: {
	      "en-US": `This is the homepage, it talks about the site `,
	    },
	    sections: {
	      "en-US": [
	        {
	          sys: {
	            type: `Link`,
	            linkType: `Entry`,
	            id: `6Gz0vGZmAoSgOSAM2Ks4gW`,
	          },
	        },
	        {
	          sys: {
	            type: `Link`,
	            linkType: `Entry`,
	            id: `S9n6QORFyEeKEUaGS2Ym4`,
	          },
	        },
	      ],
	    },
	  },
	}
])

Returns a Promise which resolves to:

{
  sys: { ... },
  fields: {
    "en-US": {
      title: `Home`,
      summary: `This is the homepage, it talks about the site `,
      sections: [
        {
          sys: { ... },
          fields: {
            "en-US": {
              title: `About us`,
              content: `Made by Matt Dean`,
            },
          },
        },
        {
          sys: { ... },
          fields: {
            "en-US": {
              title: `Introduction`,
              content: `Hi this is contentful-sync-redis`,
            },
          },
        },
      ],
    },
  },
}

Where 'sections' is a multi-reference field

Logging

See the debug module. Use the package name (contentful-sync-redis) as the string in the environment variable.

Release Map / Changelog

MVP - 0.1

  • Implement Sync API
  • resolveReferences helper function
  • Preview API supported

0.2

  • Tests using Mocha
  • CI integration using Travis
  • Contribution guidelines

0.3

  • Group fields by locale
  • No longer configure Redis client using an environment variable

0.4

  • Add sugar function to get entries and resolve references with a single call

1.0

  • Support old versions of Node using webpack

Later releases / To do

  • Plugin functionality to allow for other databases
  • Support filtering content
  • Support assets

Contributions

All contributions welcome! Please feel free to open an issue/PR 😄