Gatsby

Gatsby Source Strapi With Schema

Gatsby source plugin for pulling documents from strapi API

Installing the plugin

You can install

npm i gatsby-source-strapi-schema

Setting up the plugin

You can enable and configure this plugin in your gatsby-config.js file.

Basic Usage:

This plugin requires at least findcomponents and findcontenttypes permission. Also requires findone permission for each collection and Single Type. Also it is advisable to include all types of content connected through relation types to avoid problems

// gatsby-config.js
module.exports = {
  ...
  plugins: [
    ... // Other plugins
    {
      resolve: "gatsby-source-strapi-schema",
      options: {
        apiURL: "http://localhost:1337",
        collectionTypes: ["article", "category", "Writer"],
        singleTypes: ["global", "homepage"]
      }
    }
  ]
}

Advanced usage:

Authenticated requests

Strapi’s Roles & Permissions plugin allows you to protect your API actions. If you need to access a route that is only available to a logged in user, you can provide your credentials so that this plugin can access to the protected data.

// gatsby-config.js
module.exports = {
  ...
  plugins: [
    ... // Other plugins
    {
      resolve: "gatsby-source-strapi-schema",
      options: {
        apiURL: "http://localhost:1337",
        loginData: {
          identifier: "", // May be userName or email
          password: "" // Password
        },
        collectionTypes: ["article", "category", "Writer"],
        singleTypes: ["global", "homepage"]
      }
    }
  ]
}

Custom endpoints

By default, we use the pluralize package to deduct the endpoint that matches a collection type. You can opt out of this behavior. To do so, pass an entity definition object with your custom endpoint.

// gatsby-config.js
module.exports = {
  ...
  plugins: [
    ... // Other plugins
    {
      resolve: "gatsby-source-strapi-schema",
      options: {
        apiURL: "http://localhost:1337",
        collectionTypes: [
          {
            name: "post",
            endpoint: "articles"
          }, 
          "category",
          { 
            name: "author",
            endpoint: "Writer"
          }
        ],
        singleTypes: ["global", "homepage"]
      }
    }
  ]
}

Internationalization support

By default, this plugin will only fetch data in the default locale of your Strapi app. If your content types are available in different locales, you can also pass an entity definition object to specify the locale you want to fetch for a content type. Use the all value to get all available locales on a collection type.

// gatsby-config.js
module.exports = {
  ...
  plugins: [
    ... // Other plugins
    {
      resolve: "gatsby-source-strapi-schema",
      options: {
        apiURL: "http://localhost:1337",
        collectionTypes: [
          // Fetch all locales for collection-name
          {
            name: "article",
            api: { qs: { _locale: `all` } }
          },
          // Only fetch english content for other-collection-name
          {
            name: "category",
            api: { qs: { _locale: `en` } }

          },
          // Combined with a custom endpoint
          {
            name: "author",
            endpoint: "writer",
            api: { qs: { _locale: `en` } }
          }
        ],
        singleTypes: ["global", "homepage"]
      }
    }
  ]
}

For single types, the all value will not work, since single type queries do not return an array. If you want a single type to be available in different locales, add several entity definition objects for that same single type. The source plugin will merge them together, so you can access the right locale in your queries using the locale filter.

// gatsby-config.js
module.exports = {
  ...
  plugins: [
    ... // Other plugins
    {
      resolve: "gatsby-source-strapi-schema",
      options: {
        apiURL: "http://localhost:1337",
        collectionTypes: ["article", "category", "Writer"],
        singleTypes: [
          "global", 
          {
            name:"homepage",
            api: { qs: { _locale: "en" } }
          }, 
          {
            name:"homepage",
            api: { qs: { _locale: "es" } }
          }
        ]
      }
    }
  ]
}

Api Endpoints (Publication State)

Queries to Strapi Content API can use several API parameters, all documentation can be found here

// gatsby-config.js
module.exports = {
  ...
  plugins: [
    ... // Other plugins
    {
      resolve: "gatsby-source-strapi-schema",
      options: {
        apiURL: "http://localhost:1337",
        collectionTypes: [
          {
            name: "article",
            // 'preview' fetches both draft & published content
            api: { qs: { _publicationState: "preview"} }
          },
          "category",
          "Writer"
        ],
        singleTypes: ["global", "homepage"]
      }
    }
  ]
}

Querying data

You can query created nodes from your Gatsby Graphql Api like the following:

{
  allStrapiArticle {
    nodes{
      id
      title
      slug
    }
  }
}

You can filter created nodes using graphql filters as described in Gatsby documentation

{
  allStrapiArticle(filter: { category: { strapiId: { eq: 4 } } }) {
    nodes {
      id
      title
      slug
    }
  }
}

You can query images to be used with Gatsby image

{
  allStrapiArticle {
    nodes {
      id
      title
      image {
        id
        name
        alternativeText
        caption
        localFile {
          childImageSharp {
            gatsbyImageData
          }
        }
      }
    }
  }
}

You can use fragments to query reusable components

fragment seo on StrapiComponentSharedSeo {
  id
  metaTitle
  metaDescription
  shareImage {
    id
    alternativeText
    name
    localFile {
      childImageSharp {
        gatsbyImageData
      }
    }
  }
}

query Home {
  strapiHomepage {
    id
    seo {
      ...seo
    }
  }
}

query Articles {
  allStrapiArticle {
    nodes {
      id
      title
      seo {
        ...seo
      }
    }
  }
}