Changeset

9818:eb4724f20b1e

Merge 0.11->trunk
author Kim Alvefur <zash@zash.se>
date Mon, 28 Jan 2019 01:49:04 +0100
parents 9815:fed614598f88 (current diff) 9817:7aad9eb7f050 (diff)
children 9820:87a1742f928d
files
diffstat 3 files changed, 53 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/plugins/mod_pubsub/pubsub.lib.lua	Sat Jan 26 15:07:11 2019 +0100
+++ b/plugins/mod_pubsub/pubsub.lib.lua	Mon Jan 28 01:49:04 2019 +0100
@@ -295,14 +295,20 @@
 
 function handlers.get_items(origin, stanza, items, service)
 	local node = items.attr.node;
-	local item = items:get_child("item");
-	local item_id = item and item.attr.id;
+
+	local requested_items = {};
+	for item in items:childtags("item") do
+		table.insert(requested_items, item.attr.id);
+	end
+	if requested_items[1] == nil then
+		requested_items = nil;
+	end
 
 	if not node then
 		origin.send(pubsub_error_reply(stanza, "nodeid-required"));
 		return true;
 	end
-	local ok, results = service:get_items(node, stanza.attr.from, item_id);
+	local ok, results = service:get_items(node, stanza.attr.from, requested_items);
 	if not ok then
 		origin.send(pubsub_error_reply(stanza, results));
 		return true;
--- a/spec/util_pubsub_spec.lua	Sat Jan 26 15:07:11 2019 +0100
+++ b/spec/util_pubsub_spec.lua	Mon Jan 28 01:49:04 2019 +0100
@@ -170,6 +170,37 @@
 
 	end);
 
+	describe("the thing", function ()
+		randomize(false); -- These tests are ordered
+
+		local service = pubsub.new();
+
+		it("creates a node with some items", function ()
+			assert.truthy(service:create("node", true, { max_items = 3 }));
+			assert.truthy(service:publish("node", true, "1", "item 1"));
+			assert.truthy(service:publish("node", true, "2", "item 2"));
+			assert.truthy(service:publish("node", true, "3", "item 3"));
+		end);
+
+		it("should return the requested item", function ()
+			local ok, ret = service:get_items("node", true, "1");
+			assert.truthy(ok);
+			assert.same({ "1", ["1"] = "item 1" }, ret);
+		end);
+
+		it("should return multiple requested items", function ()
+			local ok, ret = service:get_items("node", true, { "1", "2" });
+			assert.truthy(ok);
+			assert.same({
+				"1",
+				"2",
+				["1"] = "item 1",
+				["2"] = "item 2",
+			}, ret);
+		end);
+	end);
+
+
 	describe("node config", function ()
 		local service;
 		before_each(function ()
--- a/util/pubsub.lua	Sat Jan 26 15:07:11 2019 +0100
+++ b/util/pubsub.lua	Mon Jan 28 01:49:04 2019 +0100
@@ -600,7 +600,7 @@
 	return true
 end
 
-function service:get_items(node, actor, id) --> (true, { id, [id] = node }) or (false, err)
+function service:get_items(node, actor, ids) --> (true, { id, [id] = node }) or (false, err)
 	-- Access checking
 	if not self:may(node, actor, "get_items") then
 		return false, "forbidden";
@@ -610,20 +610,25 @@
 	if not node_obj then
 		return false, "item-not-found";
 	end
-	if id then -- Restrict results to a single specific item
-		local with_id = self.data[node]:get(id);
-		if not with_id then
-			return true, { };
+	if type(ids) == "string" then -- COMPAT see #1305
+		ids = { ids };
+	end
+	local data = {};
+	if ids then
+		for _, key in ipairs(ids) do
+			local value = self.data[node]:get(key);
+			if value then
+				data[#data+1] = key;
+				data[key] = value;
+			end
 		end
-		return true, { id, [id] = with_id };
 	else
-		local data = {}
 		for key, value in self.data[node]:items() do
 			data[#data+1] = key;
 			data[key] = value;
 		end
-		return true, data;
 	end
+	return true, data;
 end
 
 function service:get_last_item(node, actor) --> (true, id, node) or (false, err)