11const { createRemoteFileNode } = require ( `gatsby-source-filesystem` ) ;
2+ const fetch = require ( "node-fetch" ) ;
3+ const FormData = require ( "form-data" ) ;
24const currentTimeTag = new Date ( ) . getTime ( ) ;
35const createTag = {
46 wordpress_id : currentTimeTag ,
@@ -122,28 +124,52 @@ const createImage = {
122124 path : "/wordpress-balsa/" ,
123125} ;
124126
125- module . exports = async function sourceNodes ( {
126- actions,
127- getNodesByType,
128- getNodes,
129- store,
130- cache,
131- createNodeId,
132- createContentDigest,
133- getCache,
134- reporter,
135- } ) {
136- const { createNode } = actions ;
137-
138- const wordPressTag = getNodesByType ( "wordpress__TAG" ) ;
139-
140- const wordPressTagExists =
141- wordPressTag &&
142- wordPressTag . length > 0 &&
143- wordPressTag [ 0 ] . internal &&
144- wordPressTag [ 0 ] . internal . owner === "gatsby-source-wordpress" ;
145-
146- if ( ! wordPressTagExists ) {
127+ module . exports = async function sourceNodes (
128+ {
129+ actions,
130+ getNodesByType,
131+ getNodes,
132+ store,
133+ cache,
134+ createNodeId,
135+ createContentDigest,
136+ getCache,
137+ reporter,
138+ } ,
139+ { wordpressConfig }
140+ ) {
141+ const { createNode, deleteNode } = actions ;
142+
143+ let url ;
144+
145+ let accessToken ;
146+
147+ let remoteWordPressTagCount ;
148+ let remoteWordPressMediaCount ;
149+
150+ if ( wordpressConfig . hostingWPCOM ) {
151+ url = `https://public-api.wordpress.com/wp/v2/sites/${ wordpressConfig . baseUrl } ` ;
152+ accessToken = await getWPCOMAccessToken ( wordpressConfig . auth ) ;
153+ } else {
154+ url = `https://${ wordpressConfig . baseUrl } /wp-json/wp/v2` ;
155+ }
156+
157+ remoteWordPressMediaCount = await getWordPressEntityCount (
158+ `${ url } /media` ,
159+ accessToken
160+ ) ;
161+ remoteWordPressTagCount = await getWordPressEntityCount (
162+ `${ url } /tags` ,
163+ accessToken
164+ ) ;
165+
166+ const wordPressTags = getNodesByType ( "wordpress__TAG" ) ;
167+
168+ const originalTagSourceExists = wordPressTags . filter (
169+ ( wordPressTag ) => wordPressTag . internal . owner === "gatsby-source-wordpress"
170+ ) ;
171+
172+ if ( remoteWordPressTagCount == 0 || ! originalTagSourceExists ) {
147173 let node = {
148174 ...createTag ,
149175 children : [ ] ,
@@ -156,15 +182,14 @@ module.exports = async function sourceNodes({
156182 createNode ( node ) ;
157183 }
158184
159- const wordpressMedia = getNodesByType ( "wordpress__wp_media" ) ;
185+ const wordpressMedias = getNodesByType ( "wordpress__wp_media" ) ;
160186
161- const mediaExists =
162- wordpressMedia &&
163- wordpressMedia . length > 0 &&
164- wordpressMedia [ 0 ] . internal &&
165- wordpressMedia [ 0 ] . internal . owner === "gatsby-source-wordpress" ;
187+ const originalMediaSourceExists = wordpressMedias . filter (
188+ ( wordpressMedia ) =>
189+ wordpressMedia . internal . owner === "gatsby-source-wordpress"
190+ ) ;
166191
167- if ( ! mediaExists ) {
192+ if ( remoteWordPressMediaCount == 0 || ! originalMediaSourceExists ) {
168193 const encodedSourceUrl = encodeURI ( createImage . source_url ) ;
169194 const mediaDataCacheKey = `wordpress-media-placeholder` ;
170195
@@ -212,3 +237,46 @@ module.exports = async function sourceNodes({
212237 }
213238 }
214239} ;
240+
241+ async function getWPCOMAccessToken ( _auth ) {
242+ let result ;
243+ const oauthUrl = `https://public-api.wordpress.com/oauth2/token` ;
244+
245+ try {
246+ const form = new FormData ( ) ;
247+ form . append ( "client_id" , _auth . wpcom_app_clientId ) ;
248+ form . append ( "client_secret" , _auth . wpcom_app_clientSecret ) ;
249+ form . append ( "username" , _auth . wpcom_user ) ;
250+ form . append ( "password" , _auth . wpcom_pass ) ;
251+ form . append ( "grant_type" , `password` ) ;
252+
253+ const response = await fetch ( oauthUrl , { method : "POST" , body : form } ) ;
254+ result = await response . json ( ) ;
255+ result = result . access_token ;
256+ } catch ( e ) {
257+ console . log ( e ) ;
258+ }
259+
260+ return result ;
261+ }
262+
263+ async function getWordPressEntityCount ( url , accessToken ) {
264+ const getOptions = ( ) => {
265+ let o = {
266+ method : `get` ,
267+ } ;
268+
269+ if ( accessToken ) {
270+ o . headers = {
271+ Authorization : `Bearer ${ accessToken } ` ,
272+ } ;
273+ }
274+
275+ return o ;
276+ } ;
277+ const options = getOptions ( ) ;
278+ const response = await fetch ( url , options ) ;
279+ const data = await response . json ( ) ;
280+
281+ return data . length ;
282+ }
0 commit comments