diff options
author | Christophe Romain <christophe.romain@process-one.net> | 2009-09-09 21:40:21 +0000 |
---|---|---|
committer | Christophe Romain <christophe.romain@process-one.net> | 2009-09-09 21:40:21 +0000 |
commit | 31c6d6194fee1efab7c57556581ad3b0581d6d0b (patch) | |
tree | 3db870ba95f460b80cc44adf0f403d92b6d6507d /src/mod_pubsub/node_hometree.erl | |
parent | Change some error messages. (diff) |
fix delete item to allow owner being able to remove all publisher items, and also fix EJAB-1036
SVN Revision: 2589
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 |