1 |
|
-module(mongoose_graphql_stanza_helper). |
2 |
|
|
3 |
|
-import(mongoose_graphql_helper, [null_to_undefined/1, make_error/2]). |
4 |
|
|
5 |
|
-export([get_last_messages/5, row_to_map/1, handle_event/1]). |
6 |
|
|
7 |
|
-include("mongoose.hrl"). |
8 |
|
-include("jlib.hrl"). |
9 |
|
|
10 |
|
-spec get_last_messages(Caller :: jid:jid(), |
11 |
|
Limit :: null | non_neg_integer(), |
12 |
|
With :: null | jid:jid(), |
13 |
|
Before :: null | mod_mam:unix_timestamp(), boolean()) -> |
14 |
|
{ok, map()} | {unknown_user, iodata()}. |
15 |
|
get_last_messages(Caller, Limit, With, Before, CheckUser) -> |
16 |
:-( |
case mongoose_stanza_api:lookup_recent_messages( |
17 |
|
Caller, null_to_undefined(With), null_to_undefined(Before), |
18 |
|
null_to_undefined(Limit), CheckUser) of |
19 |
|
{ok, {Rows, Limit2}} -> |
20 |
:-( |
Maps = lists:map(fun row_to_map/1, Rows), |
21 |
:-( |
{ok, #{<<"stanzas">> => Maps, <<"limit">> => Limit2}}; |
22 |
|
Error -> |
23 |
:-( |
Error |
24 |
|
end. |
25 |
|
|
26 |
|
-spec handle_event(term()) -> {ok, map() | null}. |
27 |
|
handle_event({route, Acc}) -> |
28 |
5 |
{From, _To, Packet} = mongoose_acc:packet(Acc), |
29 |
5 |
case Packet of |
30 |
|
Stanza = #xmlel{name = <<"message">>} -> |
31 |
4 |
StanzaID = exml_query:attr(Stanza, <<"id">>, <<>>), |
32 |
4 |
Timestamp = os:system_time(microsecond), |
33 |
4 |
stanza_result(From, Timestamp, StanzaID, Stanza); |
34 |
|
_ -> |
35 |
1 |
{ok, null} % Skip other stanza types |
36 |
|
end; |
37 |
|
handle_event(Msg) -> |
38 |
:-( |
?UNEXPECTED_INFO(Msg), |
39 |
:-( |
{ok, null}. |
40 |
|
|
41 |
|
-spec row_to_map(mod_mam:message_row()) -> {ok, map()}. |
42 |
|
row_to_map(#{id := Id, jid := From, packet := Stanza}) -> |
43 |
:-( |
{Microseconds, _} = mod_mam_utils:decode_compact_uuid(Id), |
44 |
:-( |
StanzaID = mod_mam_utils:mess_id_to_external_binary(Id), |
45 |
:-( |
stanza_result(From, Microseconds, StanzaID, Stanza). |
46 |
|
|
47 |
|
stanza_result(From, Timestamp, StanzaID, Stanza) -> |
48 |
4 |
Map = #{<<"sender">> => From, <<"timestamp">> => Timestamp, |
49 |
|
<<"stanza_id">> => StanzaID, <<"stanza">> => Stanza}, |
50 |
4 |
{ok, Map}. |