rsnext/examples/cms-contentful/lib/api.js
Ante Sepic 3f4872aa67
[Examples] Switch contentful example to graphql (#15223)
Now that all Contentful spaces support GraphQL, we are looking into switching the example from using a JS library to a simple fetch with GraphQL.

@stefanjudis ☝️
2020-11-07 00:51:59 +00:00

116 lines
2.4 KiB
JavaScript

const POST_GRAPHQL_FIELDS = `
slug
title
coverImage {
url
}
date
author {
name
picture {
url
}
}
excerpt
content {
json
}
`
async function fetchGraphQL(query, preview = false) {
return fetch(
`https://graphql.contentful.com/content/v1/spaces/${process.env.CONTENTFUL_SPACE_ID}`,
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${
preview
? process.env.CONTENTFUL_PREVIEW_ACCESS_TOKEN
: process.env.CONTENTFUL_ACCESS_TOKEN
}`,
},
body: JSON.stringify({ query }),
}
).then((response) => response.json())
}
function extractPost(fetchResponse) {
return fetchResponse?.data?.postCollection?.items?.[0]
}
function extractPostEntries(fetchResponse) {
return fetchResponse?.data?.postCollection?.items
}
export async function getPreviewPostBySlug(slug) {
const entry = await fetchGraphQL(
`query {
postCollection(where: { slug: "${slug}" }, preview: true, limit: 1) {
items {
${POST_GRAPHQL_FIELDS}
}
}
}`,
true
)
return extractPost(entry)
}
export async function getAllPostsWithSlug() {
const entries = await fetchGraphQL(
`query {
postCollection(where: { slug_exists: true }, order: date_DESC) {
items {
${POST_GRAPHQL_FIELDS}
}
}
}`
)
return extractPostEntries(entries)
}
export async function getAllPostsForHome(preview) {
const entries = await fetchGraphQL(
`query {
postCollection(order: date_DESC, preview: ${preview ? 'true' : 'false'}) {
items {
${POST_GRAPHQL_FIELDS}
}
}
}`,
preview
)
return extractPostEntries(entries)
}
export async function getPostAndMorePosts(slug, preview) {
const entry = await fetchGraphQL(
`query {
postCollection(where: { slug: "${slug}" }, preview: ${
preview ? 'true' : 'false'
}, limit: 1) {
items {
${POST_GRAPHQL_FIELDS}
}
}
}`,
preview
)
const entries = await fetchGraphQL(
`query {
postCollection(where: { slug_not_in: "${slug}" }, order: date_DESC, preview: ${
preview ? 'true' : 'false'
}, limit: 2) {
items {
${POST_GRAPHQL_FIELDS}
}
}
}`,
preview
)
return {
post: extractPost(entry),
morePosts: extractPostEntries(entries),
}
}