diff --git a/doc/api/hooks_server-side.md b/doc/api/hooks_server-side.md index a319910ba..224d3c7e4 100644 --- a/doc/api/hooks_server-side.md +++ b/doc/api/hooks_server-side.md @@ -751,6 +751,21 @@ exports.exportHtmlAdditionalTagsWithData = function(hook, pad, cb){ }; ``` +## exportEtherpadAdditionalContent +Called from src/node/utils/ExportEtherpad.js and src/node/utils/ImportEtherpad.js + +Things in context: + +Useful for exporting and importing non-pad centric data stored about a pad. For example in ep_comments_page the comments are stored as comments:padId:uniqueIdOfComment and as such when you export .etherpad this data is not included. + +Example: +``` +// Add support for exporting comments metadata +exports.exportEtherpadAdditionalContent = function(hook_name, context, callback){ + return callback(["comments"]); +}; +``` + ## userLeave Called from src/node/handler/PadMessageHandler.js diff --git a/src/node/utils/ExportEtherpad.js b/src/node/utils/ExportEtherpad.js index 0e8ef3bf1..2af4f7bfe 100644 --- a/src/node/utils/ExportEtherpad.js +++ b/src/node/utils/ExportEtherpad.js @@ -16,6 +16,7 @@ let db = require("../db/DB"); +let hooks = require('ep_etherpad-lite/static/js/pluginfw/hooks'); exports.getPadRaw = async function(padId) { @@ -58,5 +59,17 @@ exports.getPadRaw = async function(padId) { } } + await Promise.all([ + // get content that has a different prefix IE comments:padId:foo + // a plugin would return something likle ["comments", "cakes"] + hooks.aCallAll('exportEtherpadAdditionalContent').then((prefixes) => { + prefixes.forEach(async function(prefix) { + let pluginContent = await db.get(prefix + ":" + padId); + data[prefix + ":" + padId] = pluginContent; + }); + }) + ]); + + return data; } diff --git a/src/node/utils/ImportEtherpad.js b/src/node/utils/ImportEtherpad.js index a5b1074e6..1a61efac0 100644 --- a/src/node/utils/ImportEtherpad.js +++ b/src/node/utils/ImportEtherpad.js @@ -16,6 +16,7 @@ var log4js = require('log4js'); const db = require("../db/DB"); +const hooks = require('ep_etherpad-lite/static/js/pluginfw/hooks'); exports.setPadRaw = function(padId, records) { @@ -62,6 +63,19 @@ exports.setPadRaw = function(padId, records) // and create the value newKey = oldPadId.join(":"); // create the new key } + + // is this a key that is supported through a plugin? + await Promise.all([ + // get content that has a different prefix IE comments:padId:foo + // a plugin would return something likle ["comments", "cakes"] + hooks.aCallAll('exportEtherpadAdditionalContent').then((prefixes) => { + prefixes.forEach(async function(prefix) { + if(key.split(":")[0] === prefix){ + newKey = prefix + ":" + padId; + } + }); + }) + ]); } // Write the value to the server