1 |
|
-module(mongoose_graphql_muc_helper). |
2 |
|
|
3 |
|
-export([make_rooms_payload/2, make_room_desc/1, muc_room_config_to_map/1, make_muc_room_config/2, |
4 |
|
format_user/1, format_users/1, add_user_resource/2, format_affs/1]). |
5 |
|
|
6 |
|
-export([default_kick_reason/1, default_invite_reason/1, default_room_removal_reason/1]). |
7 |
|
|
8 |
|
-ignore_xref(format_user/1). |
9 |
|
|
10 |
|
-include("mongoose_rsm.hrl"). |
11 |
|
-include("mod_muc_room.hrl"). |
12 |
|
|
13 |
|
-spec add_user_resource(jid:jid(), binary() | null) -> |
14 |
|
{ok, jid:jid()} | {no_session, iolist()}. |
15 |
|
add_user_resource(JID, null) -> |
16 |
3 |
case mongoose_session_api:get_user_resource(JID, 1) of |
17 |
|
{ok, Resource} -> |
18 |
2 |
{ok, jid:replace_resource(JID, Resource)}; |
19 |
|
{wrong_res_number, _ErrMsg}-> |
20 |
1 |
{no_session, "Given user does not have any session"} |
21 |
|
end; |
22 |
|
add_user_resource(JID, Resource) -> |
23 |
1 |
{ok, jid:replace_resource(JID, Resource)}. |
24 |
|
|
25 |
|
make_rooms_payload(Rooms, #rsm_out{count = Count, index = Index, first = First, last = Last}) -> |
26 |
6 |
Rooms2 = [{ok, make_room_desc(R)} || R <- Rooms], |
27 |
6 |
#{<<"rooms">> => Rooms2, <<"count">> => Count, <<"index">> => Index, |
28 |
|
<<"first">> => First, <<"last">> => Last}. |
29 |
|
|
30 |
|
make_room_desc(#{jid := JID, title := Title} = Room) -> |
31 |
62 |
Private = maps:get(private, Room, null), |
32 |
62 |
UsersNumber = maps:get(users_number, Room, null), |
33 |
62 |
#{<<"jid">> => JID, <<"title">> => Title, |
34 |
|
<<"private">> => Private, <<"usersNumber">> => UsersNumber}. |
35 |
|
|
36 |
|
default_invite_reason(EndpointName) -> |
37 |
4 |
iolist_to_binary(io_lib:format("User invited through the ~s GraphQL API", [EndpointName])). |
38 |
|
|
39 |
|
default_kick_reason(EndpointName) -> |
40 |
6 |
iolist_to_binary(io_lib:format("User kicked through the ~s GraphQL API", [EndpointName])). |
41 |
|
|
42 |
|
default_room_removal_reason(EndpointName) -> |
43 |
6 |
iolist_to_binary(io_lib:format("Room deleted through the ~s GraphQL API", [EndpointName])). |
44 |
|
|
45 |
|
format_users(Users) -> |
46 |
3 |
[{ok, format_user(U)} || U <- Users]. |
47 |
|
|
48 |
|
format_user(#{jid := JID, role := Role, nick := Nick}) -> |
49 |
6 |
#{<<"jid">> => JID, <<"role">> => Role, <<"nick">> => Nick}. |
50 |
|
|
51 |
|
format_affs(Affs) -> |
52 |
6 |
[{ok, format_aff(A)} || A <- Affs]. |
53 |
|
|
54 |
|
format_aff({JID, Aff}) -> |
55 |
8 |
#{<<"jid">> => JID, <<"affiliation">> => Aff}. |
56 |
|
|
57 |
|
-spec muc_room_config_to_map(mod_muc_room:config()) -> map(). |
58 |
|
muc_room_config_to_map(Conf) -> |
59 |
4 |
#{<<"title">> => Conf#config.title, |
60 |
|
<<"description">> => Conf#config.description, |
61 |
|
<<"allowChangeSubject">> => Conf#config.allow_change_subj, |
62 |
|
<<"allowQueryUsers">> => Conf#config.allow_query_users, |
63 |
|
<<"allowPrivateMessages">> => Conf#config.allow_private_messages, |
64 |
|
<<"allowVisitorStatus">> => Conf#config.allow_visitor_status, |
65 |
|
<<"allowVisitorNickchange">> => Conf#config.allow_visitor_nickchange, |
66 |
|
<<"public">> => Conf#config.public, |
67 |
|
<<"publicList">> => Conf#config.public_list, |
68 |
|
<<"persistent">> => Conf#config.persistent, |
69 |
|
<<"moderated">> => Conf#config.moderated, |
70 |
|
<<"membersByDefault">> => Conf#config.members_by_default, |
71 |
|
<<"membersOnly">> => Conf#config.members_only, |
72 |
|
<<"allowUserInvites">> => Conf#config.allow_user_invites, |
73 |
|
<<"allowMultipleSession">> => Conf#config.allow_multiple_sessions, |
74 |
|
<<"passwordProtected">> => Conf#config.password_protected, |
75 |
|
<<"password">> => Conf#config.password, |
76 |
|
<<"anonymous">> => Conf#config.anonymous, |
77 |
|
<<"mayGetMemberList">> => format_maygetmemberlist(Conf#config.maygetmemberlist), |
78 |
|
<<"maxUsers">> => Conf#config.max_users, |
79 |
|
<<"logging">> => Conf#config.logging}. |
80 |
|
|
81 |
|
-spec make_muc_room_config(map(), mod_muc_room:config()) -> mod_muc_room:config(). |
82 |
|
make_muc_room_config(Map, Conf) -> |
83 |
2 |
#config{ |
84 |
|
title = maybe_value(<<"title">>, Conf#config.title, Map), |
85 |
|
description = maybe_value(<<"description">>, Conf#config.description, Map), |
86 |
|
allow_change_subj = maybe_value(<<"allowChangeSubject">>, Conf#config.allow_change_subj, Map), |
87 |
|
allow_query_users = maybe_value(<<"allowQueryUsers">>, Conf#config.allow_query_users, Map), |
88 |
|
allow_private_messages = maybe_value(<<"allowPrivateMessages">>, |
89 |
|
Conf#config.allow_private_messages, Map), |
90 |
|
allow_visitor_status = maybe_value(<<"allowVisitorStatus">>, |
91 |
|
Conf#config.allow_visitor_status, Map), |
92 |
|
allow_visitor_nickchange = maybe_value(<<"allowVisitorNickchange">>, |
93 |
|
Conf#config.allow_visitor_nickchange, Map), |
94 |
|
public = maybe_value(<<"public">>, Conf#config.public, Map), |
95 |
|
public_list = maybe_value(<<"publicList">>, Conf#config.public_list, Map), |
96 |
|
persistent = maybe_value(<<"persistent">>, Conf#config.persistent, Map), |
97 |
|
moderated = maybe_value(<<"moderated">>, Conf#config.moderated, Map), |
98 |
|
members_by_default = maybe_value(<<"membersByDefault">>, Conf#config.members_by_default, Map), |
99 |
|
members_only = maybe_value(<<"membersOnly">>, Conf#config.members_only, Map), |
100 |
|
allow_user_invites = maybe_value(<<"allowUserInvites">>, Conf#config.allow_user_invites, Map), |
101 |
|
allow_multiple_sessions = maybe_value(<<"allowMultipleSession">>, |
102 |
|
Conf#config.allow_multiple_sessions, Map), |
103 |
|
password_protected = maybe_value(<<"passwordProtected">>, |
104 |
|
Conf#config.password_protected, Map), |
105 |
|
password = maybe_value(<<"password">>, Conf#config.password, Map), |
106 |
|
anonymous = maybe_value(<<"anonymous">>, Conf#config.anonymous, Map), |
107 |
|
maygetmemberlist = maybe_value(<<"mayGetMemberList">>, Conf#config.maygetmemberlist, Map), |
108 |
|
max_users = maybe_value(<<"maxUsers">>, Conf#config.max_users, Map), |
109 |
|
logging = maybe_value(<<"logging">>, Conf#config.logging, Map) |
110 |
|
}. |
111 |
|
|
112 |
|
maybe_value(Key, Default, Map) -> |
113 |
42 |
case maps:get(Key, Map) of |
114 |
36 |
null -> Default; |
115 |
6 |
Val -> Val |
116 |
|
end. |
117 |
|
|
118 |
4 |
format_maygetmemberlist(Elements) -> [{ok, E} || E <- Elements]. |