--- /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