Mercurial > prosody-modules
diff mod_pubsub_post/mod_pubsub_post.lua @ 4521:f7381268a597
mod_pubsub_post: Add support for mapping incoming JSON to XML
Using the new util.datamapper
pubsub_post_mappings[node] = filename or schema
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Mon, 22 Mar 2021 21:18:35 +0100 |
parents | 0d3926e49b55 |
children | 08b71d02c6dc |
line wrap: on
line diff
--- 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)