diff --git a/apps/roster/src/rest/rest_cowboy_chat_handler.erl b/apps/roster/src/rest/rest_cowboy_chat_handler.erl index 7f7e1d45ab972c38eea71f56c56565b2ac11e9db..6783e4887a212cf45d60a546e470210c04424a00 100644 --- a/apps/roster/src/rest/rest_cowboy_chat_handler.erl +++ b/apps/roster/src/rest/rest_cowboy_chat_handler.erl @@ -32,7 +32,9 @@ init(#{path := Path, method := Method, qs := QS} = Req, #{endpoint := Endpoint} = State) when Endpoint =:= chat; Endpoint =:= room_chat -> - ?LOG_INFO("~s:~s ~p", [Method, Path, QS]), + Headers = cowboy_req:headers(Req), + CT = maps:get(<<"content-type">>, Headers, <<"no-content-type">>), + ?LOG_INFO("~s:~s:~s ~p", [Method, Path, CT, QS]), {cowboy_rest, Req, State}. is_authorized(Req, State) -> @@ -216,7 +218,8 @@ room_chat_from_json(Req, State) -> State2 -> case send_message(State2) of {ok, MsgId} -> - Req2 = set_ok_resp(integer_to_binary(MsgId), Req1), + Resp = [{<<"server_message_id">>, MsgId}], + Req2 = set_ok_resp(Resp, Req1), {true, Req2, State2}; error -> Req2 = set_error_resp(<<"Failed sending message">>, Req1), diff --git a/apps/roster/src/rest/rest_cowboy_cri_handler.erl b/apps/roster/src/rest/rest_cowboy_cri_handler.erl index ef02dfaebac22488ee3c2f69dd3c7db18ad1b434..3c06dc7911c918dc3281cca5df1eb45afaf101c0 100644 --- a/apps/roster/src/rest/rest_cowboy_cri_handler.erl +++ b/apps/roster/src/rest/rest_cowboy_cri_handler.erl @@ -49,7 +49,9 @@ init(#{path := Path, method := Method, qs := QS} = Req, Endpoint =:= ?cri_room_members; Endpoint =:= ?cri_room_type; Endpoint =:= ?cri_bubble -> - ?LOG_INFO("~s:~s ~p", [Method, Path, QS]), + Headers = cowboy_req:headers(Req), + CT = maps:get(<<"content-type">>, Headers, <<"no-content-type">>), + ?LOG_INFO("~s:~s:~s ~p", [Method, Path, CT, QS]), {cowboy_rest, Req, State}. is_authorized(Req, State) -> diff --git a/apps/roster/src/rest/rest_cowboy_csv_handler.erl b/apps/roster/src/rest/rest_cowboy_csv_handler.erl index a21da1b5958243a3855820c79878fbbc1cde28eb..6f261d0051e44eb81f2fb055bdc6ea9ecdd52d86 100644 --- a/apps/roster/src/rest/rest_cowboy_csv_handler.erl +++ b/apps/roster/src/rest/rest_cowboy_csv_handler.erl @@ -31,7 +31,9 @@ init(#{path := Path, method := Method, qs := QS} = Req, #{endpoint := Endpoint} = State) when Endpoint =:= ?groups_csv; Endpoint =:= ?chats_csv -> - ?LOG_INFO("~s:~s ~p", [Method, Path, QS]), + Headers = cowboy_req:headers(Req), + CT = maps:get(<<"content-type">>, Headers, <<"no-content-type">>), + ?LOG_INFO("~s:~s:~s ~p", [Method, Path, CT, QS]), {cowboy_rest, Req, State}. is_authorized(Req, State) -> diff --git a/apps/roster/src/rest/rest_cowboy_fake_numbers_handler.erl b/apps/roster/src/rest/rest_cowboy_fake_numbers_handler.erl index 7e3e8591f72707b92e8795be055b94edc8ab1370..e35fb36b8c553ffdd7914fd52620e2bf79c0bd03 100644 --- a/apps/roster/src/rest/rest_cowboy_fake_numbers_handler.erl +++ b/apps/roster/src/rest/rest_cowboy_fake_numbers_handler.erl @@ -32,7 +32,9 @@ init(#{path := Path, method := Method, qs := QS} = Req, #{endpoint := Endpoint} = State) when Endpoint =:= fn; Endpoint =:= fake_numbers -> - ?LOG_INFO("~s:~s ~p", [Method, Path, QS]), + Headers = cowboy_req:headers(Req), + CT = maps:get(<<"content-type">>, Headers, <<"no-content-type">>), + ?LOG_INFO("~s:~s:~s ~p", [Method, Path, CT, QS]), {cowboy_rest, Req, State}. resource_exists(Req, State) -> diff --git a/apps/roster/src/rest/rest_cowboy_link_handler.erl b/apps/roster/src/rest/rest_cowboy_link_handler.erl index 82216edc8d41ac287b1d022a932cfaebcaa2699b..53b89df5a35263afd1b81633512f0cac05f4e948 100644 --- a/apps/roster/src/rest/rest_cowboy_link_handler.erl +++ b/apps/roster/src/rest/rest_cowboy_link_handler.erl @@ -26,7 +26,9 @@ init(#{path := Path, method := Method, qs := QS} = Req, #{endpoint := link_room} = State) -> - ?LOG_INFO("~s:~s ~p", [Method, Path, QS]), + Headers = cowboy_req:headers(Req), + CT = maps:get(<<"content-type">>, Headers, <<"no-content-type">>), + ?LOG_INFO("~s:~s:~s ~p", [Method, Path, CT, QS]), {cowboy_rest, Req, State}. is_authorized(Req, State) -> diff --git a/apps/roster/src/rest/rest_cowboy_metric_handler.erl b/apps/roster/src/rest/rest_cowboy_metric_handler.erl index 2b88370df1985b9c6604bc8a1d7df3a9784b5fb5..6c0212edea9a4b0764946fec30d0f9c6aebb9b8d 100644 --- a/apps/roster/src/rest/rest_cowboy_metric_handler.erl +++ b/apps/roster/src/rest/rest_cowboy_metric_handler.erl @@ -25,7 +25,9 @@ %%%=================================================================== init(#{path := Path, method := Method} = Req, #{endpoint := metrics} = State) -> - ?LOG_INFO("~s:~s", [Method, Path]), + Headers = cowboy_req:headers(Req), + CT = maps:get(<<"content-type">>, Headers, <<"no-content-type">>), + ?LOG_INFO("~s:~s:~s", [Method, Path, CT]), {cowboy_rest, Req, State}. is_authorized(Req, State) -> diff --git a/apps/roster/src/rest/rest_cowboy_publish_handler.erl b/apps/roster/src/rest/rest_cowboy_publish_handler.erl index a030da52bbd817765841f3c4d5ede4d611cba7ff..2ddc1a6faf839860fd4a9ca85ba429f5fbf83250 100644 --- a/apps/roster/src/rest/rest_cowboy_publish_handler.erl +++ b/apps/roster/src/rest/rest_cowboy_publish_handler.erl @@ -26,7 +26,9 @@ init(#{path := Path, method := Method, qs := QS} = Req, #{endpoint := publish} = State) -> - ?LOG_INFO("~s:~s ~p", [Method, Path, QS]), + Headers = cowboy_req:headers(Req), + CT = maps:get(<<"content-type">>, Headers, <<"no-content-type">>), + ?LOG_INFO("~s:~s:~p ~p", [Method, Path, CT, QS]), {cowboy_rest, Req, State}. is_authorized(Req, State) -> diff --git a/apps/roster/src/rest/rest_cowboy_push_handler.erl b/apps/roster/src/rest/rest_cowboy_push_handler.erl index 5b603bd61c7ecaf88cc8a8e11c2afe821f6cdaea..96303a561d8b4c422fa307d16505daac0f74753f 100644 --- a/apps/roster/src/rest/rest_cowboy_push_handler.erl +++ b/apps/roster/src/rest/rest_cowboy_push_handler.erl @@ -25,7 +25,9 @@ init(#{path := Path, method := Method, qs := QS} = Req, #{endpoint := push_message} = State) -> - ?LOG_INFO("~s:~s ~p", [Method, Path, QS]), + Headers = cowboy_req:headers(Req), + CT = maps:get(<<"content-type">>, Headers, <<"no-content-type">>), + ?LOG_INFO("~s:~s:~s ~p", [Method, Path, CT, QS]), {cowboy_rest, Req, State}. is_authorized(Req, State) -> diff --git a/apps/roster/src/rest/rest_cowboy_room_handler.erl b/apps/roster/src/rest/rest_cowboy_room_handler.erl index f8fba266c6b0d8103c1fcc836868f825fe8b011e..a613cfe9b1134e0e97819dbb3cb3c71cc1395549 100644 --- a/apps/roster/src/rest/rest_cowboy_room_handler.erl +++ b/apps/roster/src/rest/rest_cowboy_room_handler.erl @@ -27,7 +27,9 @@ init(#{path := Path, method := Method, qs := QS} = Req, #{endpoint := room} = State) -> - ?LOG_INFO("~s:~s ~p", [Method, Path, QS]), + Headers = cowboy_req:headers(Req), + CT = maps:get(<<"content-type">>, Headers, <<"no-content-type">>), + ?LOG_INFO("~s:~s:~s ~p", [Method, Path, CT, QS]), {cowboy_rest, Req, State}. is_authorized(Req, State) -> diff --git a/apps/roster/src/rest/rest_cowboy_session_handler.erl b/apps/roster/src/rest/rest_cowboy_session_handler.erl index 1d4b27941e3b368404d3bb67a8577f6a5285b081..08e054e7bdf554bfd263a8a4b75d850fe8580ba8 100644 --- a/apps/roster/src/rest/rest_cowboy_session_handler.erl +++ b/apps/roster/src/rest/rest_cowboy_session_handler.erl @@ -28,7 +28,9 @@ init(#{path := Path, method := Method, qs := QS} = Req, #{endpoint := sessions} = State) -> - ?LOG_INFO("~s:~s ~p", [Method, Path, QS]), + Headers = cowboy_req:headers(Req), + CT = maps:get(<<"content-type">>, Headers, <<"no-content-type">>), + ?LOG_INFO("~s:~s:~s ~p", [Method, Path, CT, QS]), {cowboy_rest, Req, State}. resource_exists(Req, State) -> diff --git a/apps/roster/src/rest/rest_cowboy_test_handler.erl b/apps/roster/src/rest/rest_cowboy_test_handler.erl index 3ffeb38081eff6b1e4773f064afae17e0d7a0bbf..16803f9e8c118f6897615138912b38822f84d49e 100644 --- a/apps/roster/src/rest/rest_cowboy_test_handler.erl +++ b/apps/roster/src/rest/rest_cowboy_test_handler.erl @@ -23,7 +23,9 @@ init(#{path := Path, method := Method, qs := QS} = Req, #{endpoint := test_api} = State) -> - ?LOG_INFO("~s:~s ~p", [Method, Path, QS]), + Headers = cowboy_req:headers(Req), + CT = maps:get(<<"content-type">>, Headers, <<"no-content-type">>), + ?LOG_INFO("~s:~s:~s ~p", [Method, Path, CT, QS]), {cowboy_rest, Req, State}. is_authorized(Req, State) -> diff --git a/apps/roster/src/rest/rest_cowboy_transcribe_handler.erl b/apps/roster/src/rest/rest_cowboy_transcribe_handler.erl index fc633efeea3c7ca303e99687a74ce5b87753a712..92898eafdbf02a6b514799d8314afdd549a0eff2 100644 --- a/apps/roster/src/rest/rest_cowboy_transcribe_handler.erl +++ b/apps/roster/src/rest/rest_cowboy_transcribe_handler.erl @@ -34,7 +34,9 @@ init(#{path := Path, method := Method, qs := QS} = Req, #{endpoint := Endpoint} = State) when Endpoint =:= ?groups_transcribe; Endpoint =:= ?chats_transcribe -> - ?LOG_INFO("~s:~s ~p", [Method, Path, QS]), + Headers = cowboy_req:headers(Req), + CT = maps:get(<<"content-type">>, Headers, <<"no-content-type">>), + ?LOG_INFO("~s:~s:~s ~p", [Method, Path, CT, QS]), {cowboy_rest, Req, State}. is_authorized(Req, State) -> diff --git a/apps/roster/src/rest/rest_cowboy_users_handler.erl b/apps/roster/src/rest/rest_cowboy_users_handler.erl index 138620201a2efc02a738e509ceec5e5b00a24720..a23ed0fe7f746d7ac1d0e5c48b7c92babc4ffd77 100644 --- a/apps/roster/src/rest/rest_cowboy_users_handler.erl +++ b/apps/roster/src/rest/rest_cowboy_users_handler.erl @@ -27,7 +27,9 @@ init(#{path := Path, method := Method, qs := QS} = Req, #{endpoint := users} = State) -> - ?LOG_INFO("~s:~s ~p", [Method, Path, QS]), + Headers = cowboy_req:headers(Req), + CT = maps:get(<<"content-type">>, Headers, <<"no-content-type">>), + ?LOG_INFO("~s:~s:~s ~p", [Method, Path, CT, QS]), {cowboy_rest, Req, State}. is_authorized(Req, State) -> diff --git a/apps/roster/src/rest/rest_cowboy_whitelist_handler.erl b/apps/roster/src/rest/rest_cowboy_whitelist_handler.erl index 0597cc95d8048f4cd27f00c9aae962a78098c03c..e4bb1a16d683b2157fa6ede1b4486b659edc33ee 100644 --- a/apps/roster/src/rest/rest_cowboy_whitelist_handler.erl +++ b/apps/roster/src/rest/rest_cowboy_whitelist_handler.erl @@ -32,7 +32,9 @@ init(#{path := Path, method := Method, qs := QS} = Req, #{endpoint := Endpoint} = State) when Endpoint =:= whitelist; Endpoint =:= admin_whitelist -> - ?LOG_INFO("~s:~s ~p", [Method, Path, QS]), + Headers = cowboy_req:headers(Req), + CT = maps:get(<<"content-type">>, Headers, <<"no-content-type">>), + ?LOG_INFO("~s:~s:~s ~p", [Method, Path, CT, QS]), {cowboy_rest, Req, State}. resource_exists(Req, State) -> diff --git a/rebar.config b/rebar.config index ee02d575c48f2b8a924d3fb951374cde16ccf28c..3c68f2103bf9755c32ccf33928781a038676ac3a 100644 --- a/rebar.config +++ b/rebar.config @@ -35,7 +35,8 @@ {jose, {git, "https://github.com/NYNJA-MC/jose-erlang.git", {ref, "7094018"}}}, {uuid, {git, "https://github.com/avtobiff/erlang-uuid.git",{branch,"master"}}}, {enenra, {git, "https://github.com/nlfiedler/enenra", {tag, "0.3.0"}}}, - {'qdate', {git, "https://github.com/enterprizing/qdate.git", {ref,"fba988fc54214bb37a3ce11d5c5a3cc68752c3ce"}}} + {'qdate', {git, "https://github.com/enterprizing/qdate.git", {ref,"fba988fc54214bb37a3ce11d5c5a3cc68752c3ce"}}}, + {redbug, {git, "https://github.com/massemanet/redbug.git", {tag, "2.0.1"}}} ]}. @@ -87,7 +88,7 @@ ssl_verify_fun,locus,emqttd,hackney,roster,service,active, cowboy,emq_dashboard,emqttc,enenra,envy,uuid,erlydtl,forms, gen_smtp, jwt, migresia, mini_s3, nitro, opencensus, - qdate,rest,rfc3339,sh,stacktrace_compat]}, + qdate,rest,rfc3339,sh,stacktrace_compat, redbug]}, {sys_config, "./sys.config"}, {vm_args, "./vm.args"}, {dev_mode, true}, diff --git a/rebar.lock b/rebar.lock index dedcc49b0a0b033bd12843e5518e83831d859ddb..c972e7c5ddb4272b259f886bbcc0a810c3257dfd 100644 --- a/rebar.lock +++ b/rebar.lock @@ -171,6 +171,10 @@ {git,"https://github.com/ninenines/ranch", {ref,"3190aef88aea04d6dce8545fe9b4574288903f44"}}, 1}, + {<<"redbug">>, + {git,"https://github.com/massemanet/redbug.git", + {ref,"4cdfd2106432579502da535e390466fe9ca0d41f"}}, + 0}, {<<"rest">>, {git,"git://github.com/synrc/rest", {ref,"9a4e21d50a96b06649944c9a88ad595114db6c31"}}, diff --git a/spec/nynja_rest.yaml b/spec/nynja_rest.yaml index 350ff414433adecae01f922a4288f30000d66911..61661cd5325861601f16c876bfcbda917d8be11e 100644 --- a/spec/nynja_rest.yaml +++ b/spec/nynja_rest.yaml @@ -375,7 +375,10 @@ paths: status: type: string data: - type: string + type: object + properties: + server_message_id: + type: string '400': description: "Malformed request" content: diff --git a/test/api_nynja.erl b/test/api_nynja.erl index fee6315e99b5ac67df71ee4902e694ecd52807a2..b68545c8c1e0df59ee20ddee705e3c78af5cf2f1 100644 --- a/test/api_nynja.erl +++ b/test/api_nynja.erl @@ -463,7 +463,12 @@ operations() -> [{"application/json", #{schema => #{<<"properties">> => - #{<<"data">> => #{<<"type">> => <<"string">>}, + #{<<"data">> => + #{<<"properties">> => + #{<<"server_message_id">> => + #{<<"type">> => <<"integer">>} + }, + <<"type">> => <<"object">>}, <<"status">> => #{<<"type">> => <<"string">>}}, <<"type">> => <<"object">>}}}], diff --git a/test/server_SUITE.erl b/test/server_SUITE.erl index 2d6bde147623b4364602dab7d58a8dc8e65e8d99..a0a9c72e91584e9620731192897f9621c7d91152 100644 --- a/test/server_SUITE.erl +++ b/test/server_SUITE.erl @@ -566,7 +566,7 @@ room_chat_message(Cfg) -> Content = <<"I am the rest message">>, Mime = <<"text">>, - {ok, 200, #{ status := <<"ok">>, data := MsgId1 }} + {ok, 200, #{ status := <<"ok">>, data := #{ server_message_id := MsgId1 }}} = request('PostRoomChatMessage', #{ sender_uuid => User1UUID , room_uuid => RoomUUID @@ -577,12 +577,12 @@ room_chat_message(Cfg) -> %% Make sure the message arrived ct:pal("Emptying: ~p", [nynja:ws_receive(User1, any, 100)]), History1 = nynja:get_messages(User1, RoomFeed, MsgId1, 1), - ensure_msg_in_history(History1, binary_to_integer(MsgId1), Mime, Content), + ensure_msg_in_history(History1, MsgId1, Mime, Content), %% Ensure the other member got it as well. ct:pal("Emptying: ~p", [nynja:ws_receive(User2, any, 100)]), History2 = nynja:get_messages(User2, RoomFeed, MsgId1, 1), - ensure_msg_in_history(History2, binary_to_integer(MsgId1), Mime, Content), + ensure_msg_in_history(History2, MsgId1, Mime, Content), ok.