# HG changeset patch # User Matthew Wild # Date 1353558614 18000 # Node ID 9922e8cdf4a44185e14401009d1909a521075c85 # Parent 28dba960849966b0d13f54d8b82fb436b1ecefc0 mod_pubsub_pivotaltracker: Accept activity notifications from Pivotal Tracker web hooks and relay them to a pubsub node diff -r 28dba9608499 -r 9922e8cdf4a4 mod_pubsub_pivotaltracker/mod_pubsub_pivotaltracker.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mod_pubsub_pivotaltracker/mod_pubsub_pivotaltracker.lua Wed Nov 21 23:30:14 2012 -0500 @@ -0,0 +1,82 @@ +module:depends("http"); + +local lom = require "lxp.lom"; +local st = require "util.stanza"; +local json = require "util.json"; +local datetime = require "util.datetime".datetime; + + +local pubsub_service = module:depends("pubsub").service; +local node = module:get_option("pivotaltracker_node", "tracker"); + +local stanza_mt = require "util.stanza".stanza_mt; +local function stanza_from_lom(lom) + if lom.tag then + local child_tags, attr = {}, {}; + local stanza = setmetatable({ name = lom.tag, attr = attr, tags = child_tags }, stanza_mt); + for i, attr_name in ipairs(lom.attr) do + attr[attr_name] = lom.attr[attr_name] + end + for i, child in ipairs(lom) do + if child.tag then + child = stanza_from_lom(child); + child_tags[#child_tags+1] = child; + end + stanza[i] = child; + end + return stanza; + else + return lom; + end +end + +function handle_POST(event) + local data = lom.parse(event.request.body); + + if not data then + return "Invalid XML. From you of all people..."; + end + + data = stanza_from_lom(data); + + if data.name ~= "activity" then + return "Unrecognised XML element: "..data.name; + end + + local activity_id = data:get_child("id"):get_text(); + local description = data:get_child("description"):get_text(); + local author_name = data:get_child("author"):get_text(); + local story = data:get_child("stories"):get_child("story"); + local story_link = story:get_child("url"):get_text(); + + local ok, err = pubsub_service:publish(node, true, "activity", st.stanza("item", { id = "activity", xmlns = "http://jabber.org/protocol/pubsub" }) + :tag("entry", { xmlns = "http://www.w3.org/2005/Atom" }) + :tag("id"):text(activity_id):up() + :tag("title"):text(description):up() + :tag("link", { rel = "alternate", href = story_link }):up() + :tag("published"):text(datetime()):up() + :tag("author") + :tag("name"):text(author_name):up() + :up() + ); + + module:log("debug", "Handled POST: \n%s\n", tostring(event.request.body)); + return "Thank you Pivotal!"; +end + +module:provides("http", { + route = { + POST = handle_POST; + }; +}); + +function module.load() + if not pubsub_service.nodes[node] then + local ok, err = pubsub_service:create(node, true); + if not ok then + module:log("error", "Error creating node: %s", err); + else + module:log("debug", "Node %q created", node); + end + end +end