From 3fa58efededf0056f2934873c191fdd012253a8c Mon Sep 17 00:00:00 2001 From: John McLear Date: Fri, 6 Nov 2020 13:48:25 +0000 Subject: [PATCH] pluginfw: Export .etherpad hooks (#4466) * export support * proper prefix * just a basic example, needs working on still * docs * comments shouldnt be hard coded --- doc/api/hooks_server-side.md | 15 +++++++++++++++ src/node/utils/ExportEtherpad.js | 13 +++++++++++++ src/node/utils/ImportEtherpad.js | 14 ++++++++++++++ 3 files changed, 42 insertions(+) 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