gatsby-source-iubenda-documents
Version:
Gatsby plugin for Iubenda Privacy Policy and Terms & Conditions
105 lines (89 loc) • 2.96 kB
JavaScript
const fetch = require("node-fetch");
const PRIVACY_URL = "https://www.iubenda.com/api/privacy-policy/";
const TERMS_URL = "https://www.iubenda.com/api/terms-and-conditions/";
exports.onPreInit = () =>
console.log("✨ Loaded gatsby-source-iubenda-documents");
exports.sourceNodes = async (
{ actions, createContentDigest, createNodeId, getNodesByType },
pluginOptions
) => {
const { createNode } = actions;
const { documentIds } = pluginOptions;
const formatResult = (content) =>
content.replace(/"/g, "").replace(/\\/g, "");
const fetchDocument = async (url) => {
const response = await fetch(`${url}/no-markup`);
if (!response.ok) {
const error = new Error();
error.code = response.status;
throw error;
}
const json = await response.json();
return formatResult(json.content);
};
const handleError = (error, name, documentId) => {
// Error codes from https://www.iubenda.com/en/help/78-privacy-policy-direct-text-embedding-api#api
switch (error.code) {
case 404:
console.log(`👀 ${name} for ${documentId} not found.`);
break;
case 403:
console.log(
`🛑 To access the ${name} for ${documentId} via API, convert it to Pro.`
);
break;
case 500:
console.log(
"❌ Application Error. Please contact info@iubenda.com for support."
);
break;
default:
console.log("❌ An unexpected error happened!");
break;
}
};
const logFetchSuccess = (name, documentId) => {
console.log(`🚛 ${name} for ${documentId} fetched.`);
};
return await Promise.all(
documentIds.map(async (documentId) => {
const data = {
privacyPolicy: null,
cookiePolicy: null,
termsAndConditions: null
};
try {
const document = await fetchDocument(PRIVACY_URL + documentId);
data.privacyPolicy = document;
logFetchSuccess("Privacy Policy", documentId);
} catch (error) {
handleError(error, "Privacy Policy", documentId);
}
try {
const document = await fetchDocument(PRIVACY_URL + documentId + "/cookie-policy");
data.cookiePolicy = document;
logFetchSuccess("Cookie Policy", documentId);
} catch (error) {
handleError(error, "Cookie Policy", documentId);
}
try {
const document = await fetchDocument(TERMS_URL + documentId);
data.termsAndConditions = document;
logFetchSuccess("Terms and Conditions", documentId);
} catch (error) {
handleError(error, "Terms and Conditions", documentId);
}
createNode({
...data,
id: createNodeId(documentId),
documentId: documentId,
parent: null,
children: [],
internal: {
type: "IubendaDocument",
contentDigest: createContentDigest(data),
},
});
})
);
};