1 |
|
-module(mongoose_graphql_stanza_admin_mutation). |
2 |
|
|
3 |
|
-export([execute/4]). |
4 |
|
|
5 |
|
-ignore_xref([execute/4]). |
6 |
|
|
7 |
|
-include("../mongoose_graphql_types.hrl"). |
8 |
|
-include("mongoose_logger.hrl"). |
9 |
|
-include("jlib.hrl"). |
10 |
|
|
11 |
|
-type result() :: {ok, map()} | {error, term()}. |
12 |
|
|
13 |
|
-spec execute(graphql:endpoint_context(), graphql:ast(), binary(), map()) -> |
14 |
|
result(). |
15 |
|
execute(_Ctx, _Obj, <<"sendMessage">>, Opts) -> |
16 |
:-( |
send_message(Opts); |
17 |
|
execute(_Ctx, _Obj, <<"sendMessageHeadLine">>, Opts) -> |
18 |
:-( |
send_message_headline(Opts); |
19 |
|
execute(_Ctx, _Obj, <<"sendStanza">>, Opts) -> |
20 |
:-( |
send_stanza(Opts). |
21 |
|
|
22 |
|
send_message(#{<<"from">> := From, <<"to">> := To, <<"body">> := Body}) -> |
23 |
:-( |
Packet = mongoose_stanza_helper:build_message(jid:to_binary(From), jid:to_binary(To), Body), |
24 |
:-( |
do_routing(From, To, Packet). |
25 |
|
|
26 |
|
send_message_headline(Opts = #{<<"from">> := From, <<"to">> := To}) -> |
27 |
:-( |
Packet = build_message_with_headline(jid:to_binary(From), jid:to_binary(To), Opts), |
28 |
:-( |
do_routing(From, To, Packet). |
29 |
|
|
30 |
|
send_stanza(#{<<"stanza">> := Packet}) -> |
31 |
:-( |
From = jid:from_binary(exml_query:attr(Packet, <<"from">>)), |
32 |
:-( |
To = jid:from_binary(exml_query:attr(Packet, <<"to">>)), |
33 |
:-( |
do_routing(From, To, Packet). |
34 |
|
|
35 |
|
do_routing(From = #jid{lserver = LServer}, To, Packet) -> |
36 |
:-( |
case mongoose_graphql_helper:check_user(From) of |
37 |
|
{ok, HostType} -> |
38 |
:-( |
do_routing2(HostType, LServer, From, To, Packet); |
39 |
|
Error -> |
40 |
:-( |
Error |
41 |
|
end. |
42 |
|
|
43 |
|
do_routing2(HostType, LServer, From, To, Packet) -> |
44 |
|
%% Based on mod_commands:do_send_packet/3 |
45 |
:-( |
Acc = mongoose_acc:new(#{location => ?LOCATION, |
46 |
|
host_type => HostType, |
47 |
|
lserver => LServer, |
48 |
|
element => Packet}), |
49 |
:-( |
Acc1 = mongoose_hooks:user_send_packet(Acc, From, To, Packet), |
50 |
:-( |
Acc2 = ejabberd_router:route(From, To, Acc1), |
51 |
:-( |
MessID = mod_mam_utils:get_mam_id_ext(Acc2), |
52 |
:-( |
{ok, #{ <<"id">> => MessID }}. |
53 |
|
|
54 |
|
build_message_with_headline(FromBin, ToBin, |
55 |
|
#{<<"body">> := Body, <<"subject">> := Subject}) -> |
56 |
:-( |
Children = maybe_cdata_elem(<<"subject">>, Subject) ++ |
57 |
|
maybe_cdata_elem(<<"body">>, Body), |
58 |
:-( |
Attrs = [{<<"type">>, <<"headline">>}, |
59 |
|
{<<"id">>, mongoose_bin:gen_from_crypto()}, |
60 |
|
{<<"from">>, FromBin}, |
61 |
|
{<<"to">>, ToBin}], |
62 |
:-( |
#xmlel{name = <<"message">>, attrs = Attrs, children = Children}. |
63 |
|
|
64 |
:-( |
maybe_cdata_elem(_, null) -> []; |
65 |
:-( |
maybe_cdata_elem(_, <<>>) -> []; |
66 |
|
maybe_cdata_elem(Name, Text) when is_binary(Text) -> |
67 |
:-( |
[cdata_elem(Name, Text)]. |
68 |
|
|
69 |
|
cdata_elem(Name, Text) when is_binary(Name), is_binary(Text) -> |
70 |
:-( |
#xmlel{name = Name, children = [#xmlcdata{content = Text}]}. |