// [...] - boilerplate code to connect to Crossbar.io function main (session) { // subscribe to future vote event session.subscribe("http://crossbar.io/crossbar/demo/vote#onvote", function(topicUri, event) { document.getElementById("votes" + event.subject).value = event.votes; }); // get the current vote count session.call("http://crossbar.io/crossbar/demo/vote#get").then( function(res){ for(var i = 0; i < res.length; i++) { document.getElementById("votes" + res[i].subject).value = res[i].votes; } }, ab.log); // wire up vote buttons var voteButtons = document.getElementById("voteContainer"). getElementsByTagName("button"); for(var i = 0; i < voteButtons.length; i++) { voteButtons[i].onclick = function(evt) { session.call("http://crossbar.io/crossbar/demo/vote#vote", evt.target.id).then(ab.log, ab.log); } } // subscribe to vote reset event session.subscribe("http://crossbar.io/crossbar/demo/vote#onreset", function() { var voteCounters = document.getElementById("voteContainer"). getElementsByTagName("input"); for(var i = 0; i < voteCounters.length; i++) { voteCounters[i].value = 0; } }); // wire up reset button document.getElementById("resetVotes").onclick = function() { session.call("http://crossbar.io/crossbar/demo/vote#reset"). then(ab.log, ab.log); }; }
CREATE or REPLACE PACKAGE BODY votes_api AS FUNCTION get RETURN JSON_LIST AS l_res SYS_REFCURSOR; BEGIN -- open cursor from query -- OPEN l_res FOR SELECT subject AS "subject", votes AS "votes" FROM votes ORDER BY subject; -- transform result set into JSON list of object -- RETURN json_dyn.executeList(l_res); END get; FUNCTION vote (p_subject VARCHAR2) RETURN NUMBER IS l_votes NUMBER; l_res JSON := JSON(); BEGIN -- check args -- IF p_subject NOT IN ('Banana', 'Lemon', 'Chocolate') THEN -- raise custom exception, this gets transformed -- into a proper RPC error return -- webmq.raise(BASEURI || 'invalid_argument', 'No subject "' || p_subject || '" to vote on.'); END IF; -- update votes, returing new count -- UPDATE votes SET votes = votes + 1 WHERE subject = p_subject RETURNING votes INTO l_votes; COMMIT; -- create and publish PubSub event -- l_res.put('subject', p_subject); l_res.put('votes', l_votes); webmq.publish(BASEURI || 'onvote', l_res); RETURN l_votes; END vote; PROCEDURE reset AS BEGIN -- reset all votes -- UPDATE votes SET votes = 0; COMMIT; -- publish event with no payload -- webmq.publish(BASEURI || 'onreset'); END reset; END;