summaryrefslogtreecommitdiff
path: root/src/mod_shared_roster_riak.erl
diff options
context:
space:
mode:
authorEvgeniy Khramtsov <ekhramtsov@process-one.net>2016-04-14 11:45:43 +0300
committerEvgeniy Khramtsov <ekhramtsov@process-one.net>2016-04-14 11:45:43 +0300
commitf8e3560ad262cdc1734b2ba565de2e0e0afe9f8b (patch)
treefeba7cb0f7a4a4866e25b2e531b2e1846868ab13 /src/mod_shared_roster_riak.erl
parentClean mod_roster.erl from DB specific code (diff)
Clean mod_shared_roster.erl from DB specific code
Diffstat (limited to 'src/mod_shared_roster_riak.erl')
-rw-r--r--src/mod_shared_roster_riak.erl139
1 files changed, 139 insertions, 0 deletions
diff --git a/src/mod_shared_roster_riak.erl b/src/mod_shared_roster_riak.erl
new file mode 100644
index 00000000..0df35e37
--- /dev/null
+++ b/src/mod_shared_roster_riak.erl
@@ -0,0 +1,139 @@
+%%%-------------------------------------------------------------------
+%%% @author Evgeny Khramtsov <ekhramtsov@process-one.net>
+%%% @copyright (C) 2016, Evgeny Khramtsov
+%%% @doc
+%%%
+%%% @end
+%%% Created : 14 Apr 2016 by Evgeny Khramtsov <ekhramtsov@process-one.net>
+%%%-------------------------------------------------------------------
+-module(mod_shared_roster_riak).
+
+-behaviour(mod_shared_roster).
+
+%% API
+-export([init/2, list_groups/1, groups_with_opts/1, create_group/3,
+ delete_group/2, get_group_opts/2, set_group_opts/3,
+ get_user_groups/2, get_group_explicit_users/2,
+ get_user_displayed_groups/3, is_user_in_group/3,
+ add_user_to_group/3, remove_user_from_group/3, import/2]).
+
+-include("jlib.hrl").
+-include("mod_roster.hrl").
+-include("mod_shared_roster.hrl").
+
+%%%===================================================================
+%%% API
+%%%===================================================================
+init(_Host, _Opts) ->
+ ok.
+
+list_groups(Host) ->
+ case ejabberd_riak:get_keys_by_index(sr_group, <<"host">>, Host) of
+ {ok, Gs} ->
+ [G || {G, _} <- Gs];
+ _ ->
+ []
+ end.
+
+groups_with_opts(Host) ->
+ case ejabberd_riak:get_by_index(sr_group, sr_group_schema(),
+ <<"host">>, Host) of
+ {ok, Rs} ->
+ [{G, O} || #sr_group{group_host = {G, _}, opts = O} <- Rs];
+ _ ->
+ []
+ end.
+
+create_group(Host, Group, Opts) ->
+ {atomic, ejabberd_riak:put(#sr_group{group_host = {Group, Host},
+ opts = Opts},
+ sr_group_schema(),
+ [{'2i', [{<<"host">>, Host}]}])}.
+
+delete_group(Host, Group) ->
+ try
+ ok = ejabberd_riak:delete(sr_group, {Group, Host}),
+ ok = ejabberd_riak:delete_by_index(sr_user, <<"group_host">>,
+ {Group, Host}),
+ {atomic, ok}
+ catch _:{badmatch, Err} ->
+ {atomic, Err}
+ end.
+
+get_group_opts(Host, Group) ->
+ case ejabberd_riak:get(sr_group, sr_group_schema(), {Group, Host}) of
+ {ok, #sr_group{opts = Opts}} -> Opts;
+ _ -> error
+ end.
+
+set_group_opts(Host, Group, Opts) ->
+ {atomic, ejabberd_riak:put(#sr_group{group_host = {Group, Host},
+ opts = Opts},
+ sr_group_schema(),
+ [{'2i', [{<<"host">>, Host}]}])}.
+
+get_user_groups(US, Host) ->
+ case ejabberd_riak:get_by_index(sr_user, sr_user_schema(), <<"us">>, US) of
+ {ok, Rs} ->
+ [Group || #sr_user{group_host = {Group, H}} <- Rs, H == Host];
+ _ ->
+ []
+ end.
+
+get_group_explicit_users(Host, Group) ->
+ case ejabberd_riak:get_by_index(sr_user, sr_user_schema(),
+ <<"group_host">>, {Group, Host}) of
+ {ok, Rs} ->
+ [R#sr_user.us || R <- Rs];
+ _ ->
+ []
+ end.
+
+get_user_displayed_groups(LUser, LServer, GroupsOpts) ->
+ case ejabberd_riak:get_by_index(sr_user, sr_user_schema(),
+ <<"us">>, {LUser, LServer}) of
+ {ok, Rs} ->
+ [{Group, proplists:get_value(Group, GroupsOpts, [])}
+ || #sr_user{group_host = {Group, _}} <- Rs];
+ _ ->
+ []
+ end.
+
+is_user_in_group(US, Group, Host) ->
+ case ejabberd_riak:get_by_index(sr_user, sr_user_schema(), <<"us">>, US) of
+ {ok, Rs} ->
+ lists:any(
+ fun(#sr_user{group_host = {G, H}}) ->
+ (Group == G) and (Host == H)
+ end, Rs);
+ _Err ->
+ false
+ end.
+
+add_user_to_group(Host, US, Group) ->
+ {atomic, ejabberd_riak:put(
+ #sr_user{us = US, group_host = {Group, Host}},
+ sr_user_schema(),
+ [{i, {US, {Group, Host}}},
+ {'2i', [{<<"us">>, US},
+ {<<"group_host">>, {Group, Host}}]}])}.
+
+remove_user_from_group(Host, US, Group) ->
+ {atomic, ejabberd_riak:delete(sr_group, {US, {Group, Host}})}.
+
+import(_LServer, #sr_group{group_host = {_, Host}} = G) ->
+ ejabberd_riak:put(G, sr_group_schema(), [{'2i', [{<<"host">>, Host}]}]);
+import(_LServer, #sr_user{us = US, group_host = {Group, Host}} = User) ->
+ ejabberd_riak:put(User, sr_user_schema(),
+ [{i, {US, {Group, Host}}},
+ {'2i', [{<<"us">>, US},
+ {<<"group_host">>, {Group, Host}}]}]).
+
+%%%===================================================================
+%%% Internal functions
+%%%===================================================================
+sr_group_schema() ->
+ {record_info(fields, sr_group), #sr_group{}}.
+
+sr_user_schema() ->
+ {record_info(fields, sr_user), #sr_user{}}.