forked from jonny22094/gatsby-source-marketo-forms
-
Notifications
You must be signed in to change notification settings - Fork 0
/
gatsby-node.js
155 lines (134 loc) · 4.31 KB
/
gatsby-node.js
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
const createNodeHelpers = require('gatsby-node-helpers').default;
const fetch = require('node-fetch');
const queryString = require('query-string');
const wait = (ms) => new Promise((res) => setTimeout(res, ms));
const callWithRetry = async (fnName, fn, depth = 0) => {
try {
return await fn();
} catch (e) {
if (depth > 5) {
console.error('Attempt limit reached, impossible to fetch');
throw e;
}
console.error(e);
console.info(
`Impossible to fetch the data from ${fnName} during the attempt number ${
depth + 1
}, trying again in ${20 + 10 * depth}s`
);
await wait(20000 + 10000 * depth);
return callWithRetry(fn, depth + 1);
}
};
const { createNodeFactory } = createNodeHelpers({
typePrefix: `Marketo`,
});
async function authenticate(authUrl) {
const res = await fetch(authUrl, {});
if (res.ok) {
const { access_token } = await res.json();
return access_token;
} else {
throw new Error('Wrong credentials');
}
}
exports.sourceNodes = async ({ actions, createNodeId }, configOptions) => {
const { createNode } = actions;
const { munchkinId, clientId, clientSecret } = configOptions;
const authOptions = queryString.stringify({
grant_type: 'client_credentials',
client_id: clientId,
client_secret: clientSecret,
});
const formsApiUrl = `https://${munchkinId}.mktorest.com/rest/asset/v1/forms.json?maxReturn=200`;
const authUrl = `https://${munchkinId}.mktorest.com/identity/oauth/token?${authOptions}`;
try {
const accessToken = await authenticate(authUrl);
const fetchForms = async (depth = 0) => {
const allForms = await fetch(formsApiUrl, {
headers: { Authorization: `Bearer ${accessToken}` },
})
.then((response) => {
console.info('Response fetched!');
return response.json();
})
.then(async (data) => {
if (!data.success) {
if (depth > 5) {
console.error(
'Impossible to fetch the forms, maximum number of attempts reached'
);
throw e;
}
console.error(
`Impossible to fetch the forms content during the attempt number ${
depth + 1
}, trying again in ${20 + 10 * depth}s`
);
console.error(`Error code : `, data?.errors[0]?.code);
console.error(`Error message : `, data?.errors[0]?.message);
await wait(20000 + 10000 * depth);
fetchForms(depth + 1);
} else {
console.info('All forms correctly fetched');
return data;
}
})
.catch((error) => {
console.error('Error trying to fetch the forms >>>> ', error);
});
return allForms;
};
const forms = await fetchForms();
async function fetchFormFields(id) {
const url = `https://${munchkinId}.mktorest.com/rest/asset/v1/form/${id}/fields.json`;
const results = await fetch(url, {
headers: { Authorization: `Bearer ${accessToken}` },
})
.then((res) => {
return res.json();
})
.catch((error) => {
console.error(
`Error trying to fetch the form id ${id} fields >>>> `,
error
);
});
if(results.errors) {
results.errors.map((error) => {
console.log(`${error.code}: ${error.message}`)
})
//throw Error();
}
return results;
}
await Promise.all(
forms.result.map(async (form) => {
const { result: children } = await callWithRetry(
'fetchFormFields',
() => fetchFormFields(form.id)
);
const Form = createNodeFactory('Form')({
...form,
children,
});
createNode(Form);
console.info(`Node created for form ID >>>> ${Form.id}: ${Form.name}`);
if(!Form.marketoChildren) {
console.error(`${Form.id} has no fields!`);
}
})
)
.then(() => {
console.info('Form and fields successfully fetched');
})
.catch((error) => {
console.error(
'Error during the Promise.all phase >>>> ',
error.message
);
});
} catch (err) {
console.error('gatsby-source-marketo-forms:', err.message);
}
};