diff options
Diffstat (limited to 'src/mod_pubsub/node_hometree.erl')
-rw-r--r-- | src/mod_pubsub/node_hometree.erl | 38 |
1 files changed, 31 insertions, 7 deletions
diff --git a/src/mod_pubsub/node_hometree.erl b/src/mod_pubsub/node_hometree.erl index c4fcde6da..289c720ed 100644 --- a/src/mod_pubsub/node_hometree.erl +++ b/src/mod_pubsub/node_hometree.erl @@ -557,12 +557,30 @@ delete_item(NodeId, Publisher, PublishModel, ItemId) -> case lists:member(ItemId, Items) of true -> del_item(NodeId, ItemId), - NewItems = lists:delete(ItemId, Items), - set_state(GenState#pubsub_state{items = NewItems}), + set_state(GenState#pubsub_state{items = lists:delete(ItemId, Items)}), {result, {default, broadcast}}; false -> - %% Non-existent node or item - {error, ?ERR_ITEM_NOT_FOUND} + case Affiliation of + owner -> + %% Owner can delete other publishers items as well + {result, States} = get_states(NodeId), + lists:foldl( + fun(#pubsub_state{items = PI, affiliation = publisher} = S, Res) -> + case lists:member(ItemId, PI) of + true -> + del_item(NodeId, ItemId), + set_state(S#pubsub_state{items = lists:delete(ItemId, PI)}), + {result, {default, broadcast}}; + false -> + Res + end; + (_, Res) -> + Res + end, {error, ?ERR_ITEM_NOT_FOUND}, States); + _ -> + %% Non-existent node or item + {error, ?ERR_ITEM_NOT_FOUND} + end end end. @@ -576,9 +594,15 @@ purge_node(NodeId, Owner) -> GenKey = jlib:jid_remove_resource(SubKey), GenState = get_state(NodeId, GenKey), case GenState of - #pubsub_state{items = Items, affiliation = owner} -> - del_items(NodeId, Items), - set_state(GenState#pubsub_state{items = []}), + #pubsub_state{affiliation = owner} -> + {result, States} = get_states(NodeId), + lists:foreach( + fun(#pubsub_state{items = []}) -> + ok; + (#pubsub_state{items = Items} = S) -> + del_items(NodeId, Items), + set_state(S#pubsub_state{items = []}) + end, States), {result, {default, broadcast}}; _ -> %% Entity is not owner |