# HG changeset patch # User Kim Alvefur # Date 1616444315 -3600 # Node ID f7381268a59792db966b99c6bf85a8d4dceebc28 # Parent bd320ec2c2fcd1034b9c9a2bd51042f051e48c64 mod_pubsub_post: Add support for mapping incoming JSON to XML Using the new util.datamapper pubsub_post_mappings[node] = filename or schema diff -r bd320ec2c2fc -r f7381268a597 mod_pubsub_post/mod_pubsub_post.lua --- a/mod_pubsub_post/mod_pubsub_post.lua Mon Mar 22 00:45:10 2021 +0100 +++ b/mod_pubsub_post/mod_pubsub_post.lua Mon Mar 22 21:18:35 2021 +0100 @@ -16,6 +16,26 @@ local pubsub_service = module:depends("pubsub").service; +local mappings = module:get_option("pubsub_post_mappings", nil); +local datamapper; +if type(mappings) == "table" then + datamapper = require "util.datamapper"; + for node, f in pairs(mappings) do + if type(f) == "string" then + local fh = assert(module:load_resource(f)); + mappings[node] = assert(json.parse(fh:read("*a"))); + fh:close() + end + end +end + +local function wrap(node, parsed, raw) + if mappings and mappings[node] then + return datamapper.unparse(mappings[node], parsed) + end + return st.stanza("json", { xmlns="urn:xmpp:json:0" }):text(raw); +end + local error_mapping = { ["forbidden"] = 403; ["item-not-found"] = 404; @@ -42,8 +62,8 @@ if type(parsed) ~= "table" then return { status_code = 400; body = "object or array expected"; }; end - local wrapper = st.stanza("json", { xmlns="urn:xmpp:json:0" }):text(data); - return publish_payload(node, actor, type(parsed.id) == "string" and parsed.id or "current", wrapper); + local payload = wrap(node, parsed, data) + return publish_payload(node, actor, type(parsed.id) == "string" and parsed.id or "current", payload); end local function publish_atom(node, actor, feed)