fix(Bridge REST API): no feedback when deleting bridge

This fixes https://emqx.atlassian.net/browse/EMQX-8648. The issue
described in `EMQX-8648` is that when deleting a non-existing bridge the
server gives a success response. See below:

```
curl --head -u admin:public2 -X 'DELETE' 'http://localhost:18083/api/v5/bridges/webhook:i_do_not_exist'
HTTP/1.1 204 No Content
date: Tue, 03 Jan 2023 16:59:01 GMT
server: Cowboy
```

After the fix, deleting a non existing bridge will give the following
response:

```
HTTP/1.1 404 Not Found
content-length: 49
content-type: application/json
date: Thu, 05 Jan 2023 12:40:35 GMT
server: Cowboy
```

Closes: EMQX-8648
This commit is contained in:
Kjell Winblad 2023-01-04 16:00:42 +01:00
parent 70eb5ffb58
commit b59c4c34c5
3 changed files with 28 additions and 12 deletions

View File

@ -328,6 +328,7 @@ schema("/bridges/:id") ->
responses => #{ responses => #{
204 => <<"Bridge deleted">>, 204 => <<"Bridge deleted">>,
400 => error_schema(['INVALID_ID'], "Update bridge failed"), 400 => error_schema(['INVALID_ID'], "Update bridge failed"),
404 => error_schema('NOT_FOUND', "Bridge not found"),
403 => error_schema('FORBIDDEN_REQUEST', "Forbidden operation"), 403 => error_schema('FORBIDDEN_REQUEST', "Forbidden operation"),
503 => error_schema('SERVICE_UNAVAILABLE', "Service unavailable") 503 => error_schema('SERVICE_UNAVAILABLE', "Service unavailable")
} }
@ -433,19 +434,24 @@ schema("/nodes/:node/bridges/:id/operation/:operation") ->
end, end,
?TRY_PARSE_ID( ?TRY_PARSE_ID(
Id, Id,
case emqx_bridge:check_deps_and_remove(BridgeType, BridgeName, AlsoDeleteActs) of case emqx_bridge:lookup(BridgeType, BridgeName) of
{ok, _} -> {ok, _} ->
204; case emqx_bridge:check_deps_and_remove(BridgeType, BridgeName, AlsoDeleteActs) of
{error, {rules_deps_on_this_bridge, RuleIds}} -> {ok, _} ->
{403, 204;
error_msg( {error, {rules_deps_on_this_bridge, RuleIds}} ->
'FORBIDDEN_REQUEST', {403,
{<<"There're some rules dependent on this bridge">>, RuleIds} error_msg(
)}; 'FORBIDDEN_REQUEST',
{error, timeout} -> {<<"There're some rules dependent on this bridge">>, RuleIds}
{503, error_msg('SERVICE_UNAVAILABLE', <<"request timeout">>)}; )};
{error, Reason} -> {error, timeout} ->
{500, error_msg('INTERNAL_ERROR', Reason)} {503, error_msg('SERVICE_UNAVAILABLE', <<"request timeout">>)};
{error, Reason} ->
{500, error_msg('INTERNAL_ERROR', Reason)}
end;
{error, not_found} ->
{404, error_msg('NOT_FOUND', <<"Bridge not found">>)}
end end
). ).

View File

@ -303,6 +303,15 @@ t_http_crud_apis(Config) ->
}, },
jsx:decode(ErrMsg2) jsx:decode(ErrMsg2)
), ),
%% Deleting a non-existing bridge should result in an error
{ok, 404, ErrMsg3} = request(delete, uri(["bridges", BridgeID]), []),
?assertMatch(
#{
<<"code">> := _,
<<"message">> := <<"Bridge not found">>
},
jsx:decode(ErrMsg3)
),
ok. ok.
t_check_dependent_actions_on_delete(Config) -> t_check_dependent_actions_on_delete(Config) ->

View File

@ -0,0 +1 @@
When deleting a non-existing bridge the server gave a success response. This has been fixed so that the server instead gives an error response when the user attempts to delete a non-existing bridge.