feat(bridge-api): improve error messages for Update Source API

This commit is contained in:
Andrew Mayorov 2024-05-27 17:14:37 +02:00
parent ed7c29ec26
commit 08d88ea814
No known key found for this signature in database
GPG Key ID: 2837C62ACFBFED5D
2 changed files with 40 additions and 7 deletions

View File

@ -658,21 +658,38 @@ schema("/source_types") ->
%%------------------------------------------------------------------------------
check_api_schema(Request, ReqMeta = #{path := Path = "/actions/:id", method := put}) ->
Spec = maps:get(put, schema(Path)),
check_api_schema(Request, ReqMeta = #{path := "/actions/:id", method := put}) ->
BridgeId = emqx_utils_maps:deep_get([bindings, id], Request),
try emqx_bridge_resource:parse_bridge_id(BridgeId, #{atom_name => false}) of
%% NOTE
%% Bridge type is known, refine the API schema to get more specific error messages.
{BridgeType, _Name} ->
Schema = emqx_bridge_v2_schema:action_api_schema("put", BridgeType),
SpecRefined = Spec#{'requestBody' => Schema},
emqx_dashboard_swagger:filter_check_request(Request, ReqMeta#{apispec => SpecRefined})
emqx_dashboard_swagger:filter_check_request(Request, refine_api_schema(Schema, ReqMeta))
catch
throw:#{reason := Reason} ->
?NOT_FOUND(<<"Invalid bridge ID, ", Reason/binary>>)
end;
check_api_schema(Request, ReqMeta = #{path := "/sources/:id", method := put}) ->
SourceId = emqx_utils_maps:deep_get([bindings, id], Request),
try emqx_bridge_resource:parse_bridge_id(SourceId, #{atom_name => false}) of
%% NOTE
%% Source type is known, refine the API schema to get more specific error messages.
{BridgeType, _Name} ->
Schema = emqx_bridge_v2_schema:source_api_schema("put", BridgeType),
emqx_dashboard_swagger:filter_check_request(Request, refine_api_schema(Schema, ReqMeta))
catch
throw:#{reason := Reason} ->
?NOT_FOUND(<<"Invalid source ID, ", Reason/binary>>)
end;
check_api_schema(Request, ReqMeta) ->
emqx_dashboard_swagger:filter_check_request(Request, ReqMeta).
refine_api_schema(Schema, ReqMeta = #{path := Path, method := Method}) ->
Spec = maps:get(Method, schema(Path)),
SpecRefined = Spec#{'requestBody' => Schema},
ReqMeta#{apispec => SpecRefined}.
%%------------------------------------------------------------------------------
%% Thin Handlers
%%------------------------------------------------------------------------------

View File

@ -40,6 +40,7 @@
sources_get_response/0,
sources_put_request/0,
sources_post_request/0,
source_api_schema/2,
sources_examples/1,
source_values/4
]).
@ -169,6 +170,15 @@ sources_api_schema(Method) ->
APISchemas = ?MODULE:registered_sources_api_schemas(Method),
hoconsc:union(bridge_api_union(APISchemas)).
source_api_schema(Method, SourceType) ->
APISchemas = ?MODULE:registered_sources_api_schemas(Method),
case lists:keyfind(atom_to_binary(SourceType), 1, APISchemas) of
{_, SchemaRef} ->
hoconsc:mk(SchemaRef);
false ->
unknown_source_schema(SourceType)
end.
registered_sources_api_schemas(Method) ->
RegisteredSchemas = emqx_action_info:registered_schema_modules_sources(),
[
@ -241,13 +251,19 @@ bridge_api_union(Refs) ->
end
end.
-dialyzer({nowarn_function, [unknown_bridge_schema/1]}).
unknown_bridge_schema(BridgeV2Type) ->
erroneous_value_schema(BridgeV2Type, <<"unknown bridge type">>).
unknown_source_schema(SourceType) ->
erroneous_value_schema(SourceType, <<"unknown source type">>).
-dialyzer({nowarn_function, [erroneous_value_schema/2]}).
erroneous_value_schema(Value, Reason) ->
hoconsc:mk(typerefl:any(), #{
validator => fun(_) ->
throw(#{
value => BridgeV2Type,
reason => <<"unknown bridge type">>
value => Value,
reason => Reason
})
end
}).