From 45ca8da1d708f0c8a5991117bba2b62a4790eafc Mon Sep 17 00:00:00 2001 From: Michal Piechowiak Date: Fri, 6 Apr 2018 20:18:28 +0200 Subject: [PATCH] [gatsby-source-wordpress] take advantage of `modified` field in media rest endpoint to not request file if we already have it --- .../src/gatsby-node.js | 3 +- .../gatsby-source-wordpress/src/normalize.js | 49 ++++++++++++++----- 2 files changed, 38 insertions(+), 14 deletions(-) diff --git a/packages/gatsby-source-wordpress/src/gatsby-node.js b/packages/gatsby-source-wordpress/src/gatsby-node.js index b9fc54f522f8f..98a9695592872 100644 --- a/packages/gatsby-source-wordpress/src/gatsby-node.js +++ b/packages/gatsby-source-wordpress/src/gatsby-node.js @@ -34,7 +34,7 @@ exports.sourceNodes = async ( excludedRoutes = [], } ) => { - const { createNode } = boundActionCreators + const { createNode, touchNode } = boundActionCreators _verbose = verboseOutput _siteURL = `${protocol}://${baseUrl}` _useACF = useACF @@ -99,6 +99,7 @@ exports.sourceNodes = async ( store, cache, createNode, + touchNode, _auth, }) diff --git a/packages/gatsby-source-wordpress/src/normalize.js b/packages/gatsby-source-wordpress/src/normalize.js index 24e2d9045686d..ecc56ab8d7428 100644 --- a/packages/gatsby-source-wordpress/src/normalize.js +++ b/packages/gatsby-source-wordpress/src/normalize.js @@ -393,27 +393,50 @@ exports.downloadMediaFiles = async ({ store, cache, createNode, + touchNode, _auth, }) => Promise.all( entities.map(async e => { - let fileNode + let fileNodeID if (e.__type === `wordpress__wp_media`) { - try { - fileNode = await createRemoteFileNode({ - url: e.source_url, - store, - cache, - createNode, - auth: _auth, - }) - } catch (e) { - // Ignore + const mediaDataCacheKey = `wordpress-media-${e.wordpress_id}` + const cacheMediaData = await cache.get(mediaDataCacheKey) + + // If we have cached media data and it wasn't modified, reuse + // previously created file node to not try to redownload + if (cacheMediaData && e.modified === cacheMediaData.modified) { + fileNodeID = cacheMediaData.fileNodeID + touchNode(cacheMediaData.fileNodeID) + } + + // If we don't have cached data, download the file + if (!fileNodeID) { + try { + const fileNode = await createRemoteFileNode({ + url: e.source_url, + store, + cache, + createNode, + auth: _auth, + }) + + if (fileNode) { + fileNodeID = fileNode.id + + await cache.set(mediaDataCacheKey, { + fileNodeID, + modified: e.modified, + }) + } + } catch (e) { + // Ignore + } } } - if (fileNode) { - e.localFile___NODE = fileNode.id + if (fileNodeID) { + e.localFile___NODE = fileNodeID delete e.media_details.sizes }