gatsby-source-esa
Version:
Gatsby source plugin for building websites using esa.io as a data source.
84 lines (73 loc) • 1.96 kB
JavaScript
;
var _axios = _interopRequireDefault(require("axios"));
var _crypto = _interopRequireDefault(require("crypto"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const createContentDigest = obj => _crypto.default.createHash(`md5`).update(JSON.stringify(obj)).digest(`hex`);
exports.sourceNodes = async ({
actions,
createNodeId
}, {
accessToken,
teamName,
baseCategory = '',
q = ''
}) => {
if (!accessToken) {
throw 'You need to set an accessToken.';
}
if (!teamName) {
throw 'You need to set an teamName.';
}
const {
createNode
} = actions;
const client = _axios.default.create({
baseURL: 'https://api.esa.io/v1'
});
client.interceptors.request.use(config => {
config.headers.Authorization = `Bearer ${accessToken}`;
return config;
});
let next_page = 1;
while (next_page) {
const {
data
} = await client.request({
method: 'get',
url: `/teams/${teamName}/posts`,
params: {
q,
page: next_page
}
});
data.posts.forEach(post => {
const contentDigest = createContentDigest(post);
const nodeId = createNodeId(`EsaPost${post.number}`);
const bodyNode = {
id: createNodeId(`EsaPost${post.number}Body`),
parent: nodeId,
children: [],
internal: {
type: 'EsaPostBody',
mediaType: 'text/markdown',
content: post.body_md,
contentDigest: createContentDigest(post.body_md)
}
};
createNode({ ...post,
body___NODE: bodyNode.id,
relative_category: (post.category || '').replace(new RegExp(`${baseCategory}/?`), ''),
id: nodeId,
children: [],
parent: null,
internal: {
type: 'EsaPost',
contentDigest
}
});
createNode(bodyNode);
});
next_page = data.next_page;
}
return;
};