Skip to content

Commit

Permalink
[1.0] [source-contentful] Create new way to detect not-resolvable ent…
Browse files Browse the repository at this point in the history
…ries/assets (gatsbyjs#1264)

* Create new way to handle not resolveable entries/assets since fetch doesn't show errors in same way

* Fix timer
  • Loading branch information
KyleAMathews authored Jun 27, 2017
1 parent c64a932 commit 1a65ba7
Show file tree
Hide file tree
Showing 2 changed files with 82 additions and 78 deletions.
31 changes: 14 additions & 17 deletions packages/gatsby-source-contentful/src/gatsby-node.js
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ exports.sourceNodes = async (
console.log(`Deleted entries `, currentSyncData.deletedEntries.length)
console.log(`Updated assets `, currentSyncData.assets.length)
console.log(`Deleted assets `, currentSyncData.deletedAssets.length)
console.timeEnd(`fetch Contentful data`)
console.timeEnd(`Fetch Contentful data`)

// Update syncToken
const nextSyncToken = currentSyncData.nextSyncToken
Expand All @@ -117,33 +117,30 @@ exports.sourceNodes = async (
},
})

// Create map of not resolvable ids so we can filter them out while creating
// Create map of resolvable ids so we can check links against them while creating
// links.
const notResolvable = new Map()
entryList.forEach(ents => {
if (ents.errors) {
ents.errors.forEach(error => {
if (error.sys.id === `notResolvable`) {
notResolvable.set(error.details.id, error.details)
}
})
}
const resolvable = new Set()
existingNodes.forEach(n => resolvable.add(n.id))

const newOrUpdatedEntries = []
entryList.forEach(entries => {
entries.forEach(entry => {
newOrUpdatedEntries.push(entry.sys.id)
resolvable.add(entry.sys.id)
})
})
assets.forEach(assetItem => resolvable.add(assetItem.sys.id))

// Build foreign reference map before starting to insert any nodes
const foreignReferenceMap = processAPIData.buildForeignReferenceMap({
contentTypeItems,
entryList,
notResolvable,
resolvable,
defaultLocale,
})

// Update existing entry nodes that weren't updated but that need reverse
// links added.
const newOrUpdatedEntries = []
entryList.forEach(entries =>
entries.forEach(entry => newOrUpdatedEntries.push(entry.sys.id))
)
Object.keys(foreignReferenceMap)
existingNodes
.filter(n => _.includes(newOrUpdatedEntries, n.id))
Expand Down Expand Up @@ -171,7 +168,7 @@ exports.sourceNodes = async (
conflictFieldPrefix,
entries: entryList[i],
createNode,
notResolvable,
resolvable,
foreignReferenceMap,
defaultLocale,
})
Expand Down
129 changes: 68 additions & 61 deletions packages/gatsby-source-contentful/src/process-api-data.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ const makeTypeName = type => _.upperFirst(_.camelCase(`${typePrefix} ${type}`))
exports.buildForeignReferenceMap = ({
contentTypeItems,
entryList,
notResolvable,
resolvable,
defaultLocale,
}) => {
const foreignReferenceMap = {}
Expand All @@ -18,42 +18,44 @@ exports.buildForeignReferenceMap = ({
entryList[i].forEach(entryItem => {
const entryItemFields = entryItem.fields
Object.keys(entryItemFields).forEach(entryItemFieldKey => {
let entryItemFieldValue =
entryItemFields[entryItemFieldKey][defaultLocale]
if (Array.isArray(entryItemFieldValue)) {
if (
entryItemFieldValue[0].sys &&
entryItemFieldValue[0].sys.type &&
entryItemFieldValue[0].sys.id
) {
entryItemFieldValue.forEach(v => {
// Don't create link to an unresolvable field.
if (notResolvable.has(v.sys.id)) {
return
}
if (entryItemFields[entryItemFieldKey][defaultLocale]) {
let entryItemFieldValue =
entryItemFields[entryItemFieldKey][defaultLocale]
if (Array.isArray(entryItemFieldValue)) {
if (
entryItemFieldValue[0].sys &&
entryItemFieldValue[0].sys.type &&
entryItemFieldValue[0].sys.id
) {
entryItemFieldValue.forEach(v => {
// Don't create link to an unresolvable field.
if (!resolvable.has(v.sys.id)) {
return
}

if (!foreignReferenceMap[v.sys.id]) {
foreignReferenceMap[v.sys.id] = []
}
foreignReferenceMap[v.sys.id].push({
name: `${contentTypeItemId}___NODE`,
id: entryItem.sys.id,
if (!foreignReferenceMap[v.sys.id]) {
foreignReferenceMap[v.sys.id] = []
}
foreignReferenceMap[v.sys.id].push({
name: `${contentTypeItemId}___NODE`,
id: entryItem.sys.id,
})
})
}
} else if (
entryItemFieldValue.sys &&
entryItemFieldValue.sys.type &&
entryItemFieldValue.sys.id &&
resolvable.has(entryItemFieldValue.sys.id)
) {
if (!foreignReferenceMap[entryItemFieldValue.sys.id]) {
foreignReferenceMap[entryItemFieldValue.sys.id] = []
}
foreignReferenceMap[entryItemFieldValue.sys.id].push({
name: `${contentTypeItemId}___NODE`,
id: entryItem.sys.id,
})
}
} else if (
entryItemFieldValue.sys &&
entryItemFieldValue.sys.type &&
entryItemFieldValue.sys.id &&
!notResolvable.has(entryItemFieldValue.sys.id)
) {
if (!foreignReferenceMap[entryItemFieldValue.sys.id]) {
foreignReferenceMap[entryItemFieldValue.sys.id] = []
}
foreignReferenceMap[entryItemFieldValue.sys.id].push({
name: `${contentTypeItemId}___NODE`,
id: entryItem.sys.id,
})
}
})
})
Expand All @@ -63,16 +65,17 @@ exports.buildForeignReferenceMap = ({
}

function createTextNode(node, key, text, createNode) {
const str = _.isString(text) ? text : ` `
const textNode = {
id: `${node.id}${key}TextNode`,
parent: node.id,
children: [],
[key]: text,
[key]: str,
internal: {
type: _.camelCase(`${node.internal.type} ${key} TextNode`),
mediaType: `text/x-markdown`,
content: text,
contentDigest: digest(text),
content: str,
contentDigest: digest(str),
},
}

Expand All @@ -89,7 +92,7 @@ exports.createContentTypeNodes = ({
conflictFieldPrefix,
entries,
createNode,
notResolvable,
resolvable,
foreignReferenceMap,
defaultLocale,
}) => {
Expand Down Expand Up @@ -120,31 +123,33 @@ exports.createContentTypeNodes = ({

// Add linkages to other nodes based on foreign references
Object.keys(entryItemFields).forEach(entryItemFieldKey => {
const entryItemFieldValue =
entryItemFields[entryItemFieldKey][defaultLocale]
if (Array.isArray(entryItemFieldValue)) {
if (
entryItemFieldValue[0].sys &&
entryItemFieldValue[0].sys.type &&
entryItemFieldValue[0].sys.id
) {
entryItemFields[
`${entryItemFieldKey}___NODE`
] = entryItemFieldValue
.filter(v => !notResolvable.has(v.sys.id))
.map(v => v.sys.id)
if (entryItemFields[entryItemFieldKey][defaultLocale]) {
const entryItemFieldValue =
entryItemFields[entryItemFieldKey][defaultLocale]
if (Array.isArray(entryItemFieldValue)) {
if (
entryItemFieldValue[0].sys &&
entryItemFieldValue[0].sys.type &&
entryItemFieldValue[0].sys.id
) {
entryItemFields[
`${entryItemFieldKey}___NODE`
] = entryItemFieldValue
.filter(v => resolvable.has(v.sys.id))
.map(v => v.sys.id)

delete entryItemFields[entryItemFieldKey]
}
} else if (
entryItemFieldValue.sys &&
entryItemFieldValue.sys.type &&
entryItemFieldValue.sys.id &&
resolvable.has(entryItemFieldValue.sys.id)
) {
entryItemFields[`${entryItemFieldKey}___NODE`] =
entryItemFieldValue.sys.id
delete entryItemFields[entryItemFieldKey]
}
} else if (
entryItemFieldValue.sys &&
entryItemFieldValue.sys.type &&
entryItemFieldValue.sys.id &&
!notResolvable.has(entryItemFieldValue.sys.id)
) {
entryItemFields[`${entryItemFieldKey}___NODE`] =
entryItemFieldValue.sys.id
delete entryItemFields[entryItemFieldKey]
}
})

Expand Down Expand Up @@ -251,8 +256,10 @@ exports.createAssetNodes = ({ assetItem, createNode, defaultLocale }) => {
// Create a node for each asset. They may be referenced by Entries
assetItem.fields = {
file: assetItem.fields.file[defaultLocale],
title: assetItem.fields.title[defaultLocale],
description: assetItem.fields.description[defaultLocale],
title: assetItem.fields.title ? assetItem.fields.title[defaultLocale] : ``,
description: assetItem.fields.description
? assetItem.fields.description[defaultLocale]
: ``,
}
const assetNode = {
id: assetItem.sys.id,
Expand Down

0 comments on commit 1a65ba7

Please sign in to comment.