Created
June 18, 2020 21:53
-
-
Save matthewbeta/d5e50b3d06a171876272f2a98a2ed22e to your computer and use it in GitHub Desktop.
Rough Gatsby Plugin for downloading images from Craft CMS
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const { createRemoteFileNode } = require(`gatsby-source-filesystem`); | |
const axios = require('axios'); | |
require('console-success'); | |
const ENTRY_API_URI = `${process.env.GATSBY_API_URL}/entries.json`; | |
const CATEGORY_API_URI = `${process.env.GATSBY_API_URL}/categories.json`; | |
exports.sourceNodes = async ({ actions, createNodeId, cache, store, createContentDigest }) => { | |
const { createNode, createNodeField } = actions; | |
const { data: entry } = await axios.get(ENTRY_API_URI); | |
const { data: category } = await axios.get(CATEGORY_API_URI); | |
let data = []; | |
data.push(...entry.data); | |
data.push(...category.data); | |
let barIncrement = 0; | |
let totalImages = 0; | |
for (const entry of data) { | |
totalImages = totalImages + entry.craftImages.length; | |
} | |
for (const entry of data) { | |
for (const image of entry.craftImages) { | |
barIncrement++; | |
try { | |
console.success(`Downloaded ${barIncrement} of ${totalImages} | ${image.name}`); | |
const node = Object.assign( | |
{ | |
id: createNodeId(`craft-source-${image.id}-${barIncrement}`), | |
createNodeId, | |
createNode, // note: some unique identifier here, I'm not familiar with the data source | |
parent: null, | |
store, | |
cache, | |
children: [], | |
internal: { | |
type: `CraftImage`, | |
contentDigest: createContentDigest(image) | |
} | |
}, | |
image | |
); // now we can query for any of the data on the API response for an image | |
createNode(node); | |
const imageNode = await createRemoteFileNode({ | |
url: `${process.env.GATSBY_API_URL}${image.url}`, | |
cache, | |
store, | |
createNode, | |
createNodeId, | |
parentNodeId: node.id | |
}); | |
await createNodeField({ | |
node: imageNode, | |
name: 'craftImage', | |
value: 'true' | |
}); | |
await createNodeField({ | |
node: imageNode, | |
name: 'featureImage', | |
value: JSON.stringify(image.featureImage) | |
}); | |
await createNodeField({ | |
node: imageNode, | |
name: 'entrySlug', | |
value: entry.slug | |
}); | |
await createNodeField({ | |
node: imageNode, | |
name: 'entryUri', | |
value: entry.uri | |
}); | |
await createNodeField({ | |
node: imageNode, | |
name: 'entryTitle', | |
value: entry.title | |
}); | |
await createNodeField({ | |
node: imageNode, | |
name: 'craftImageId', | |
value: image.id | |
}); | |
await createNodeField({ | |
node: imageNode, | |
name: 'craftAltTag', | |
value: image.altTag | |
}); | |
await createNodeField({ | |
node: imageNode, | |
name: 'craftAssetVolume', | |
value: image.volume | |
}); | |
await createNodeField({ | |
node: imageNode, | |
name: 'craftImageEntryUrl', | |
value: image.url | |
}); | |
node[`image___NODE`] = imageNode.id; | |
} catch (error) { | |
console.warn('error creating node', error); | |
} | |
} | |
} | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment