generated from snek-at/jaen-template-v2
-
Notifications
You must be signed in to change notification settings - Fork 2
/
gatsby-node.ts
196 lines (181 loc) · 4.59 KB
/
gatsby-node.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
import dotenv from 'dotenv'
import {fetchReviews, IReview} from './src/common/requests/reviews'
import {
createAllProductsShopPage,
createCollectionShopAndProductPages
} from './src/common/page-generator'
import type {GatsbyNode} from 'gatsby'
const GOOGLE_REVIEW_NODE_TYPE = 'GoogleReview'
export const sourceNodes: GatsbyNode['sourceNodes'] = async ({
actions,
cache,
reporter,
createNodeId,
createContentDigest
}) => {
dotenv.config()
const {createNode} = actions
const cacheKey = 'scaleSerpReviews'
const twentyFourHoursInMilliseconds = 24 * 60 * 60 * 1000 // 86400000
let obj = await cache.get(cacheKey)
if (!obj) {
reporter.info(`Cold cache hit for ${cacheKey}`)
reporter.info(`Fetching reviews from ScaleSerp API`)
obj = {created: Date.now()}
try {
obj.data = await fetchReviews()
} catch (e) {
reporter.info(`Failed to fetch reviews from ScaleSerp API`)
}
} else if (Date.now() > obj.lastChecked + twentyFourHoursInMilliseconds) {
reporter.info(
`Warm cache hit for ${cacheKey}, but stale data. Fetching reviews from ScaleSerp API`
)
/* Reload after a day */
try {
obj.data = await fetchReviews()
} catch (e) {
reporter.info(`Failed to fetch reviews from ScaleSerp API`)
}
} else {
reporter.info(
`Warm cache hit for ${cacheKey}, not fetching reviews from ScaleSerp API`
)
}
obj.lastChecked = Date.now()
await cache.set(cacheKey, obj)
const reviews: IReview[] = obj.data || []
reviews.forEach(review => {
if (review.rating >= 3) {
createNode({
rating: review.rating,
position: review.position,
body: review.body,
date: review.date,
sourceImage: review.source_image,
sourceLink: review.source_link,
source: review.source,
id: createNodeId(`${GOOGLE_REVIEW_NODE_TYPE}-${review.position}`),
test: true,
parent: null,
children: [],
internal: {
type: GOOGLE_REVIEW_NODE_TYPE,
content: JSON.stringify(review),
contentDigest: createContentDigest(review)
}
})
}
})
}
export const createPages: GatsbyNode['createPages'] = async function ({
actions,
graphql
}) {
const {data} = await graphql(`
query {
meta: allShopifyProduct {
tags: distinct(field: tags)
}
allShopifyCollection {
edges {
node {
title
handle
image {
gatsbyImageData
}
products {
id
handle
createdAt
descriptionHtml
title
tags
status
totalInventory
contextualPricing {
maxVariantPricing {
price {
amount
}
compareAtPrice {
amount
}
}
}
images {
shopifyId
gatsbyImageData
}
featuredImage {
id
gatsbyImageData
}
}
}
}
}
allShopifyProduct(sort: {fields: title, order: ASC}) {
edges {
node {
id
handle
collections {
handle
}
descriptionHtml
title
tags
status
totalInventory
createdAt
contextualPricing {
maxVariantPricing {
price {
amount
}
compareAtPrice {
amount
}
}
}
images {
shopifyId
gatsbyImageData
}
featuredImage {
id
gatsbyImageData
}
}
}
}
}
`)
createAllProductsShopPage(data, actions)
createCollectionShopAndProductPages(data, actions)
}
export const createSchemaCustomization: GatsbyNode['createSchemaCustomization'] =
({actions}) => {
const {createTypes} = actions
const typeDefs = `
type GoogleReview implements Node @dontInfer {
rating: Int
position: Int
body: String
date: String
sourceLink: String
sourceImage: String
source: String
}
type ShopifyPrice {
amount: String
}
type ShopifyProductContextualPricingMaxVariantPricing {
compareAtPrice: ShopifyPrice
price: ShopifyPrice
}
`
createTypes(typeDefs)
}