gatsby-source-c8db
Version:
Source plugin for pulling data into Gatsby from c8db collections
107 lines (95 loc) • 2.96 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _jsc = _interopRequireDefault(require("jsc8"));
var _lodash = _interopRequireDefault(require("lodash"));
const NODE_TYPE = "C8Document";
exports.sourceNodes = async ({
actions,
createNodeId,
createContentDigest
}, pluginOptions) => {
const {
createNode
} = actions;
const helpers = Object.assign({}, actions, {
createContentDigest,
createNodeId,
createNode
});
const {
config,
auth: {
email,
password
},
geoFabric,
collection,
map
} = pluginOptions;
const fabric = new _jsc.default(config);
await fabric.login(email, password);
fabric.useFabric(geoFabric);
const collections = Array.isArray(collection) ? collection : [collection];
for (let i = 0; i < collections.length; ++i) {
const collectionName = collections[i];
const cursor = await fabric.query(`FOR x in ${collectionName} return x`);
const documents = await cursor.all();
documents.forEach(doc => {
const node = createNodeMetaData(doc, collectionName, helpers);
const childrenNodes = [];
if (map) {
const mapObj = map[collectionName];
if (mapObj) {
Object.keys(mapObj).forEach(mediaItemFieldKey => {
if (node[mediaItemFieldKey] && (typeof mapObj[mediaItemFieldKey] === `string` || mapObj[mediaItemFieldKey] instanceof String)) {
const mappingChildNode = prepareMappingChildNode(node, mediaItemFieldKey, node[mediaItemFieldKey], mapObj[mediaItemFieldKey], createContentDigest);
node[`${mediaItemFieldKey}___NODE`] = mappingChildNode.id;
childrenNodes.push(mappingChildNode);
delete node[mediaItemFieldKey];
}
});
}
}
helpers.createNode(node);
childrenNodes.forEach(child => {
helpers.createNode(child);
});
});
}
fabric.close();
return;
};
function createNodeMetaData(item, collectionName, helpers) {
const nodeMetadata = {
id: helpers.createNodeId(item["_id"]),
parent: null,
children: [],
internal: {
type: NODE_TYPE,
content: JSON.stringify(item),
contentDigest: helpers.createContentDigest(item)
}
};
const node = Object.assign({
collectionName
}, item, nodeMetadata);
return node;
}
function prepareMappingChildNode(node, key, text, mediaType, createContentDigest) {
const str = _lodash.default.isString(text) ? text : ` `;
const id = `${node.id}${key}MappingNode`;
const mappingNode = {
id: id,
parent: node.id,
[key]: str,
children: [],
internal: {
type: _lodash.default.camelCase(`${node.internal.type} ${key} MappingNode`),
mediaType: mediaType,
content: str,
contentDigest: createContentDigest(str)
}
};
node.children = node.children.concat([mappingNode.id]);
return mappingNode;
}