forked from loafle/openapi-generator-original
Upgrade the erlang-server dependency from cowboy1.x to cowboy2.x (#1364)
* Upgrade the erlang-server dependency from cowboy1.x to cowboy2.x * Update erlang-server sample * Fix a bug for erlang-server test
This commit is contained in:
parent
172448fa28
commit
5b4a19849e
@ -261,7 +261,7 @@ validate(Rule = {pattern, Pattern}, Name, Value, _ValidatorState) ->
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
validate(Rule = schema, Name, Value, ValidatorState) ->
|
validate(Rule = schema, Name, Value, ValidatorState) ->
|
||||||
Definition = list_to_binary("#/definitions/" ++ {{packageName}}_utils:to_list(Name)),
|
Definition = list_to_binary("#/components/schemas/" ++ {{packageName}}_utils:to_list(Name)),
|
||||||
try
|
try
|
||||||
_ = validate_with_schema(Value, Definition, ValidatorState),
|
_ = validate_with_schema(Value, Definition, ValidatorState),
|
||||||
ok
|
ok
|
||||||
@ -300,7 +300,7 @@ validation_error(ViolatedRule, Name, Info) ->
|
|||||||
{Value :: any(), Req :: cowboy_req:req()} |
|
{Value :: any(), Req :: cowboy_req:req()} |
|
||||||
{error, Reason :: any(), Req :: cowboy_req:req()}.
|
{error, Reason :: any(), Req :: cowboy_req:req()}.
|
||||||
get_value(body, _Name, Req0) ->
|
get_value(body, _Name, Req0) ->
|
||||||
{ok, Body, Req} = cowboy_req:body(Req0),
|
{ok, Body, Req} = cowboy_req:read_body(Req0),
|
||||||
case prepare_body(Body) of
|
case prepare_body(Body) of
|
||||||
{error, Reason} ->
|
{error, Reason} ->
|
||||||
{error, Reason, Req};
|
{error, Reason, Req};
|
||||||
@ -308,19 +308,18 @@ get_value(body, _Name, Req0) ->
|
|||||||
{Value, Req}
|
{Value, Req}
|
||||||
end;
|
end;
|
||||||
|
|
||||||
get_value(qs_val, Name, Req0) ->
|
get_value(qs_val, Name, Req) ->
|
||||||
{QS, Req} = cowboy_req:qs_vals(Req0),
|
QS = cowboy_req:parse_qs(Req),
|
||||||
Value = {{packageName}}_utils:get_opt({{packageName}}_utils:to_qs(Name), QS),
|
Value = {{packageName}}_utils:get_opt({{packageName}}_utils:to_qs(Name), QS),
|
||||||
{Value, Req};
|
{Value, Req};
|
||||||
|
|
||||||
get_value(header, Name, Req0) ->
|
get_value(header, Name, Req) ->
|
||||||
{Headers, Req} = cowboy_req:headers(Req0),
|
Headers = cowboy_req:headers(Req),
|
||||||
Value = {{packageName}}_utils:get_opt({{packageName}}_utils:to_header(Name), Headers),
|
Value = maps:get({{packageName}}_utils:to_header(Name), Headers, undefined),
|
||||||
{Value, Req};
|
{Value, Req};
|
||||||
|
|
||||||
get_value(binding, Name, Req0) ->
|
get_value(binding, Name, Req) ->
|
||||||
{Bindings, Req} = cowboy_req:bindings(Req0),
|
Value = cowboy_req:binding({{packageName}}_utils:to_binding(Name), Req),
|
||||||
Value = {{packageName}}_utils:get_opt({{packageName}}_utils:to_binding(Name), Bindings),
|
|
||||||
{Value, Req}.
|
{Value, Req}.
|
||||||
|
|
||||||
prepare_body(Body) ->
|
prepare_body(Body) ->
|
||||||
|
@ -36,18 +36,19 @@ authorize_api_key(LogicHandler, OperationID, From, KeyParam, Req0) ->
|
|||||||
end
|
end
|
||||||
end.
|
end.
|
||||||
|
|
||||||
get_api_key(header, KeyParam, Req0) ->
|
get_api_key(header, KeyParam, Req) ->
|
||||||
{Headers, Req} = cowboy_req:headers(Req0),
|
Headers = cowboy_req:headers(Req),
|
||||||
{
|
{
|
||||||
openapi_utils:get_opt(
|
maps:get(
|
||||||
{{packageName}}_utils:to_header(KeyParam),
|
openapi_utils:to_header(KeyParam),
|
||||||
Headers
|
Headers,
|
||||||
|
undefined
|
||||||
),
|
),
|
||||||
Req
|
Req
|
||||||
};
|
};
|
||||||
|
|
||||||
get_api_key(qs_val, KeyParam, Req0) ->
|
get_api_key(qs_val, KeyParam, Req) ->
|
||||||
{QS, Req} = cowboy_req:qs_vals(Req0),
|
QS = cowboy_req:parse_qs(Req),
|
||||||
{ {{packageName}}_utils:get_opt(KeyParam, QS), Req}.
|
{ {{packageName}}_utils:get_opt(KeyParam, QS), Req}.
|
||||||
|
|
||||||
|
|
||||||
|
@ -22,11 +22,11 @@ authorize_api_key(_, _) -> {true, #{}}.
|
|||||||
Req :: cowboy_req:req(),
|
Req :: cowboy_req:req(),
|
||||||
Context :: #{}
|
Context :: #{}
|
||||||
) ->
|
) ->
|
||||||
{Status :: cowboy:http_status(), Headers :: cowboy:http_headers(), Body :: #{}}.
|
{Status :: cowboy:http_status(), Headers :: cowboy:http_headers(), Body :: jsx:json_term()}.
|
||||||
|
|
||||||
handle_request(OperationID, Req, Context) ->
|
handle_request(OperationID, Req, Context) ->
|
||||||
error_logger:error_msg(
|
error_logger:error_msg(
|
||||||
"Got not implemented request to process: ~p~n",
|
"Got not implemented request to process: ~p~n",
|
||||||
[{OperationID, Req, Context}]
|
[{OperationID, Req, Context}]
|
||||||
),
|
),
|
||||||
{501, [], #{}}.
|
{501, #{}, #{}}.
|
||||||
|
@ -3,8 +3,7 @@
|
|||||||
|
|
||||||
%% Cowboy REST callbacks
|
%% Cowboy REST callbacks
|
||||||
-export([allowed_methods/2]).
|
-export([allowed_methods/2]).
|
||||||
-export([init/3]).
|
-export([init/2]).
|
||||||
-export([rest_init/2]).
|
|
||||||
-export([allow_missing_post/2]).
|
-export([allow_missing_post/2]).
|
||||||
-export([content_types_accepted/2]).
|
-export([content_types_accepted/2]).
|
||||||
-export([content_types_provided/2]).
|
-export([content_types_provided/2]).
|
||||||
@ -27,17 +26,11 @@
|
|||||||
|
|
||||||
-type state() :: state().
|
-type state() :: state().
|
||||||
|
|
||||||
-spec init(TransportName :: atom(), Req :: cowboy_req:req(), Opts :: {{packageName}}_router:init_opts()) ->
|
-spec init(Req :: cowboy_req:req(), Opts :: {{packageName}}_router:init_opts()) ->
|
||||||
{upgrade, protocol, cowboy_rest, Req :: cowboy_req:req(), Opts :: {{packageName}}_router:init_opts()}.
|
{cowboy_rest, Req :: cowboy_req:req(), State :: state()}.
|
||||||
|
|
||||||
init(_Transport, Req, Opts) ->
|
init(Req, {Operations, LogicHandler, ValidatorState}) ->
|
||||||
{upgrade, protocol, cowboy_rest, Req, Opts}.
|
Method = cowboy_req:method(Req),
|
||||||
|
|
||||||
-spec rest_init(Req :: cowboy_req:req(), Opts :: {{packageName}}_router:init_opts()) ->
|
|
||||||
{ok, Req :: cowboy_req:req(), State :: state()}.
|
|
||||||
|
|
||||||
rest_init(Req0, {Operations, LogicHandler, ValidatorState}) ->
|
|
||||||
{Method, Req} = cowboy_req:method(Req0),
|
|
||||||
OperationID = maps:get(Method, Operations, undefined),
|
OperationID = maps:get(Method, Operations, undefined),
|
||||||
|
|
||||||
error_logger:info_msg("Attempt to process operation: ~p", [OperationID]),
|
error_logger:info_msg("Attempt to process operation: ~p", [OperationID]),
|
||||||
@ -47,7 +40,7 @@ rest_init(Req0, {Operations, LogicHandler, ValidatorState}) ->
|
|||||||
logic_handler = LogicHandler,
|
logic_handler = LogicHandler,
|
||||||
validator_state = ValidatorState
|
validator_state = ValidatorState
|
||||||
},
|
},
|
||||||
{ok, Req, State}.
|
{cowboy_rest, Req, State}.
|
||||||
|
|
||||||
-spec allowed_methods(Req :: cowboy_req:req(), State :: state()) ->
|
-spec allowed_methods(Req :: cowboy_req:req(), State :: state()) ->
|
||||||
{Value :: [binary()], Req :: cowboy_req:req(), State :: state()}.
|
{Value :: [binary()], Req :: cowboy_req:req(), State :: state()}.
|
||||||
@ -192,7 +185,6 @@ valid_entity_length(Req, State) ->
|
|||||||
{true, Req, State}.
|
{true, Req, State}.
|
||||||
|
|
||||||
%%%%
|
%%%%
|
||||||
|
|
||||||
-type result_ok() :: {
|
-type result_ok() :: {
|
||||||
ok,
|
ok,
|
||||||
{Status :: cowboy:http_status(), Headers :: cowboy:http_headers(), Body :: iodata()}
|
{Status :: cowboy:http_status(), Headers :: cowboy:http_headers(), Body :: iodata()}
|
||||||
@ -200,7 +192,7 @@ valid_entity_length(Req, State) ->
|
|||||||
|
|
||||||
-type result_error() :: {error, Reason :: any()}.
|
-type result_error() :: {error, Reason :: any()}.
|
||||||
|
|
||||||
-type processed_response() :: {halt, cowboy_req:req(), state()}.
|
-type processed_response() :: {stop, cowboy_req:req(), state()}.
|
||||||
|
|
||||||
-spec process_response(result_ok() | result_error(), cowboy_req:req(), state()) ->
|
-spec process_response(result_ok() | result_error(), cowboy_req:req(), state()) ->
|
||||||
processed_response().
|
processed_response().
|
||||||
@ -208,24 +200,23 @@ valid_entity_length(Req, State) ->
|
|||||||
process_response(Response, Req0, State = #state{operation_id = OperationID}) ->
|
process_response(Response, Req0, State = #state{operation_id = OperationID}) ->
|
||||||
case Response of
|
case Response of
|
||||||
{ok, {Code, Headers, Body}} ->
|
{ok, {Code, Headers, Body}} ->
|
||||||
{ok, Req} = cowboy_req:reply(Code, Headers, Body, Req0),
|
Req = cowboy_req:reply(Code, Headers, Body, Req0),
|
||||||
{halt, Req, State};
|
{stop, Req, State};
|
||||||
{error, Message} ->
|
{error, Message} ->
|
||||||
error_logger:error_msg("Unable to process request for ~p: ~p", [OperationID, Message]),
|
error_logger:error_msg("Unable to process request for ~p: ~p", [OperationID, Message]),
|
||||||
|
|
||||||
{ok, Req} = cowboy_req:reply(400, Req0),
|
Req = cowboy_req:reply(400, Req0),
|
||||||
{halt, Req, State}
|
{stop, Req, State}
|
||||||
end.
|
end.
|
||||||
|
|
||||||
-spec handle_request_json(cowboy_req:req(), state()) -> {halt, cowboy_req:req(), state()}.
|
-spec handle_request_json(cowboy_req:req(), state()) -> {cowboy_req:resp_body(), cowboy_req:req(), state()}.
|
||||||
|
|
||||||
handle_request_json(
|
handle_request_json(
|
||||||
Req0,
|
Req0,
|
||||||
State = #state{
|
State = #state{
|
||||||
operation_id = OperationID,
|
operation_id = OperationID,
|
||||||
logic_handler = LogicHandler,
|
logic_handler = LogicHandler,
|
||||||
validator_state = ValidatorState,
|
validator_state = ValidatorState
|
||||||
context = Context
|
|
||||||
}
|
}
|
||||||
) ->
|
) ->
|
||||||
case {{packageName}}_api:populate_request(OperationID, Req0, ValidatorState) of
|
case {{packageName}}_api:populate_request(OperationID, Req0, ValidatorState) of
|
||||||
@ -233,8 +224,8 @@ handle_request_json(
|
|||||||
{Code, Headers, Body} = {{packageName}}_logic_handler:handle_request(
|
{Code, Headers, Body} = {{packageName}}_logic_handler:handle_request(
|
||||||
LogicHandler,
|
LogicHandler,
|
||||||
OperationID,
|
OperationID,
|
||||||
Populated,
|
Req1,
|
||||||
Context
|
Populated
|
||||||
),
|
),
|
||||||
_ = {{packageName}}_api:validate_response(
|
_ = {{packageName}}_api:validate_response(
|
||||||
OperationID,
|
OperationID,
|
||||||
|
@ -22,13 +22,13 @@
|
|||||||
{{/authMethods}}
|
{{/authMethods}}
|
||||||
|
|
||||||
|
|
||||||
-callback handle_request(OperationID :: {{packageName}}_api:operation_id(), Request :: any(), Context :: context()) ->
|
-callback handle_request(OperationID :: {{packageName}}_api:operation_id(), cowboy_req:req(), Context :: context()) ->
|
||||||
handler_response().
|
handler_response().
|
||||||
|
|
||||||
-spec handle_request(
|
-spec handle_request(
|
||||||
Handler :: atom(),
|
Handler :: atom(),
|
||||||
OperationID :: {{packageName}}_api:operation_id(),
|
OperationID :: {{packageName}}_api:operation_id(),
|
||||||
Request :: any(),
|
Request :: cowboy_req:req(),
|
||||||
Context :: context()
|
Context :: context()
|
||||||
) ->
|
) ->
|
||||||
handler_response().
|
handler_response().
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
{deps, [
|
{deps, [
|
||||||
{jsx, {git, "https://github.com/talentdeficit/jsx.git", {tag, "2.8.2"}}},
|
{cowboy, {git, "https://github.com/ninenines/cowboy.git", {tag, "2.5.0"}}},
|
||||||
{jesse, {git, "https://github.com/for-GET/jesse.git", {tag, "1.4.0"}}}
|
{rfc3339, {git, "https://github.com/talentdeficit/rfc3339.git", {tag, "master"}}},
|
||||||
|
{jsx, {git, "https://github.com/talentdeficit/jsx.git", {tag, "2.9.0"}}},
|
||||||
|
{jesse, {git, "https://github.com/for-GET/jesse.git", {tag, "1.5.2"}}}
|
||||||
]}.
|
]}.
|
||||||
|
@ -1,30 +1,32 @@
|
|||||||
-module({{packageName}}_server).
|
-module({{packageName}}_server).
|
||||||
|
|
||||||
|
|
||||||
-define(DEFAULT_ACCEPTORS_POOLSIZE, 100).
|
|
||||||
-define(DEFAULT_LOGIC_HANDLER, {{packageName}}_default_logic_handler).
|
-define(DEFAULT_LOGIC_HANDLER, {{packageName}}_default_logic_handler).
|
||||||
|
|
||||||
-export([child_spec/2]).
|
-export([start/2]).
|
||||||
|
|
||||||
-spec child_spec( ID :: any(), #{
|
-spec start( ID :: any(), #{
|
||||||
ip => inet:ip_address(),
|
ip => inet:ip_address(),
|
||||||
port => inet:port_number(),
|
port => inet:port_number(),
|
||||||
logic_handler => module(),
|
logic_handler => module(),
|
||||||
net_opts => []
|
net_opts => []
|
||||||
}) -> supervisor:child_spec().
|
}) -> {ok, pid()} | {error, any()}.
|
||||||
|
|
||||||
child_spec(ID, #{
|
start(ID, #{
|
||||||
ip := IP ,
|
ip := IP ,
|
||||||
port := Port,
|
port := Port,
|
||||||
net_opts := NetOpts
|
net_opts := NetOpts
|
||||||
} = Params) ->
|
} = Params) ->
|
||||||
AcceptorsPool = ?DEFAULT_ACCEPTORS_POOLSIZE,
|
|
||||||
{Transport, TransportOpts} = get_socket_transport(IP, Port, NetOpts),
|
{Transport, TransportOpts} = get_socket_transport(IP, Port, NetOpts),
|
||||||
LogicHandler = maps:get(logic_handler, Params, ?DEFAULT_LOGIC_HANDLER),
|
LogicHandler = maps:get(logic_handler, Params, ?DEFAULT_LOGIC_HANDLER),
|
||||||
ExtraOpts = maps:get(cowboy_extra_opts, Params, []),
|
ExtraOpts = maps:get(cowboy_extra_opts, Params, []),
|
||||||
CowboyOpts = get_cowboy_config(LogicHandler, ExtraOpts),
|
CowboyOpts = get_cowboy_config(LogicHandler, ExtraOpts),
|
||||||
ranch:child_spec({?MODULE, ID}, AcceptorsPool,
|
case Transport of
|
||||||
Transport, TransportOpts, cowboy_protocol, CowboyOpts).
|
ssl ->
|
||||||
|
cowboy:start_tls(ID, TransportOpts, CowboyOpts);
|
||||||
|
tcp ->
|
||||||
|
cowboy:start_clear(ID, TransportOpts, CowboyOpts)
|
||||||
|
end.
|
||||||
|
|
||||||
get_socket_transport(IP, Port, Options) ->
|
get_socket_transport(IP, Port, Options) ->
|
||||||
Opts = [
|
Opts = [
|
||||||
@ -33,9 +35,9 @@ get_socket_transport(IP, Port, Options) ->
|
|||||||
],
|
],
|
||||||
case {{packageName}}_utils:get_opt(ssl, Options) of
|
case {{packageName}}_utils:get_opt(ssl, Options) of
|
||||||
SslOpts = [_|_] ->
|
SslOpts = [_|_] ->
|
||||||
{ranch_ssl, Opts ++ SslOpts};
|
{ssl, Opts ++ SslOpts};
|
||||||
undefined ->
|
undefined ->
|
||||||
{ranch_tcp, Opts}
|
{tcp, Opts}
|
||||||
end.
|
end.
|
||||||
|
|
||||||
get_cowboy_config(LogicHandler, ExtraOpts) ->
|
get_cowboy_config(LogicHandler, ExtraOpts) ->
|
||||||
@ -56,10 +58,10 @@ get_cowboy_config(LogicHandler, [{Key, Value}| Rest], Opts) ->
|
|||||||
|
|
||||||
get_default_dispatch(LogicHandler) ->
|
get_default_dispatch(LogicHandler) ->
|
||||||
Paths = {{packageName}}_router:get_paths(LogicHandler),
|
Paths = {{packageName}}_router:get_paths(LogicHandler),
|
||||||
{dispatch, cowboy_router:compile(Paths)}.
|
#{dispatch => cowboy_router:compile(Paths)}.
|
||||||
|
|
||||||
get_default_opts(LogicHandler) ->
|
get_default_opts(LogicHandler) ->
|
||||||
[{env, [get_default_dispatch(LogicHandler)]}].
|
#{env => get_default_dispatch(LogicHandler)}.
|
||||||
|
|
||||||
store_key(Key, Value, Opts) ->
|
store_key(Key, Value, Opts) ->
|
||||||
lists:keystore(Key, 1, Opts, {Key, Value}).
|
lists:keystore(Key, 1, Opts, {Key, Value}).
|
||||||
|
4
pom.xml
4
pom.xml
@ -1223,8 +1223,8 @@
|
|||||||
<module>samples/client/petstore/elixir</module>
|
<module>samples/client/petstore/elixir</module>
|
||||||
<module>samples/client/petstore/erlang-client</module>
|
<module>samples/client/petstore/erlang-client</module>
|
||||||
<!-- servers -->
|
<!-- servers -->
|
||||||
<!-- disable erlang server test due to dependency issues
|
<!-- disable erlang server test due to dependency issues -->
|
||||||
<module>samples/server/petstore/erlang-server</module> -->
|
<module>samples/server/petstore/erlang-server</module>
|
||||||
<module>samples/server/petstore/jaxrs/jersey2</module>
|
<module>samples/server/petstore/jaxrs/jersey2</module>
|
||||||
<module>samples/server/petstore/jaxrs/jersey2-useTags</module>
|
<module>samples/server/petstore/jaxrs/jersey2-useTags</module>
|
||||||
<module>samples/server/petstore/spring-mvc</module>
|
<module>samples/server/petstore/spring-mvc</module>
|
||||||
|
@ -1 +1 @@
|
|||||||
3.3.2-SNAPSHOT
|
3.3.3-SNAPSHOT
|
@ -1,831 +0,0 @@
|
|||||||
{
|
|
||||||
"swagger" : "2.0",
|
|
||||||
"info" : {
|
|
||||||
"description" : "This is a sample server Petstore server. You can find out more about Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, #swagger](http://swagger.io/irc/). For this sample, you can use the api key `special-key` to test the authorization filters.",
|
|
||||||
"version" : "1.0.0",
|
|
||||||
"title" : "Swagger Petstore",
|
|
||||||
"termsOfService" : "http://swagger.io/terms/",
|
|
||||||
"contact" : {
|
|
||||||
"email" : "apiteam@swagger.io"
|
|
||||||
},
|
|
||||||
"license" : {
|
|
||||||
"name" : "Apache-2.0",
|
|
||||||
"url" : "http://www.apache.org/licenses/LICENSE-2.0.html"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"host" : "petstore.swagger.io",
|
|
||||||
"basePath" : "/v2",
|
|
||||||
"tags" : [ {
|
|
||||||
"name" : "pet",
|
|
||||||
"description" : "Everything about your Pets",
|
|
||||||
"externalDocs" : {
|
|
||||||
"description" : "Find out more",
|
|
||||||
"url" : "http://swagger.io"
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
"name" : "store",
|
|
||||||
"description" : "Access to Petstore orders"
|
|
||||||
}, {
|
|
||||||
"name" : "user",
|
|
||||||
"description" : "Operations about user",
|
|
||||||
"externalDocs" : {
|
|
||||||
"description" : "Find out more about our store",
|
|
||||||
"url" : "http://swagger.io"
|
|
||||||
}
|
|
||||||
} ],
|
|
||||||
"schemes" : [ "http" ],
|
|
||||||
"paths" : {
|
|
||||||
"/pet" : {
|
|
||||||
"post" : {
|
|
||||||
"tags" : [ "pet" ],
|
|
||||||
"summary" : "Add a new pet to the store",
|
|
||||||
"description" : "",
|
|
||||||
"operationId" : "addPet",
|
|
||||||
"consumes" : [ "application/json", "application/xml" ],
|
|
||||||
"produces" : [ "application/xml", "application/json" ],
|
|
||||||
"parameters" : [ {
|
|
||||||
"in" : "body",
|
|
||||||
"name" : "body",
|
|
||||||
"description" : "Pet object that needs to be added to the store",
|
|
||||||
"required" : true,
|
|
||||||
"schema" : {
|
|
||||||
"$ref" : "#/definitions/Pet"
|
|
||||||
}
|
|
||||||
} ],
|
|
||||||
"responses" : {
|
|
||||||
"405" : {
|
|
||||||
"description" : "Invalid input"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"security" : [ {
|
|
||||||
"petstore_auth" : [ "write:pets", "read:pets" ]
|
|
||||||
} ]
|
|
||||||
},
|
|
||||||
"put" : {
|
|
||||||
"tags" : [ "pet" ],
|
|
||||||
"summary" : "Update an existing pet",
|
|
||||||
"description" : "",
|
|
||||||
"operationId" : "updatePet",
|
|
||||||
"consumes" : [ "application/json", "application/xml" ],
|
|
||||||
"produces" : [ "application/xml", "application/json" ],
|
|
||||||
"parameters" : [ {
|
|
||||||
"in" : "body",
|
|
||||||
"name" : "body",
|
|
||||||
"description" : "Pet object that needs to be added to the store",
|
|
||||||
"required" : true,
|
|
||||||
"schema" : {
|
|
||||||
"$ref" : "#/definitions/Pet"
|
|
||||||
}
|
|
||||||
} ],
|
|
||||||
"responses" : {
|
|
||||||
"400" : {
|
|
||||||
"description" : "Invalid ID supplied"
|
|
||||||
},
|
|
||||||
"404" : {
|
|
||||||
"description" : "Pet not found"
|
|
||||||
},
|
|
||||||
"405" : {
|
|
||||||
"description" : "Validation exception"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"security" : [ {
|
|
||||||
"petstore_auth" : [ "write:pets", "read:pets" ]
|
|
||||||
} ]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"/pet/findByStatus" : {
|
|
||||||
"get" : {
|
|
||||||
"tags" : [ "pet" ],
|
|
||||||
"summary" : "Finds Pets by status",
|
|
||||||
"description" : "Multiple status values can be provided with comma separated strings",
|
|
||||||
"operationId" : "findPetsByStatus",
|
|
||||||
"produces" : [ "application/xml", "application/json" ],
|
|
||||||
"parameters" : [ {
|
|
||||||
"name" : "status",
|
|
||||||
"in" : "query",
|
|
||||||
"description" : "Status values that need to be considered for filter",
|
|
||||||
"required" : true,
|
|
||||||
"type" : "array",
|
|
||||||
"items" : {
|
|
||||||
"type" : "string",
|
|
||||||
"enum" : [ "available", "pending", "sold" ],
|
|
||||||
"default" : "available"
|
|
||||||
},
|
|
||||||
"collectionFormat" : "csv"
|
|
||||||
} ],
|
|
||||||
"responses" : {
|
|
||||||
"200" : {
|
|
||||||
"description" : "successful operation",
|
|
||||||
"schema" : {
|
|
||||||
"type" : "array",
|
|
||||||
"items" : {
|
|
||||||
"$ref" : "#/definitions/Pet"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"400" : {
|
|
||||||
"description" : "Invalid status value"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"security" : [ {
|
|
||||||
"petstore_auth" : [ "write:pets", "read:pets" ]
|
|
||||||
} ]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"/pet/findByTags" : {
|
|
||||||
"get" : {
|
|
||||||
"tags" : [ "pet" ],
|
|
||||||
"summary" : "Finds Pets by tags",
|
|
||||||
"description" : "Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.",
|
|
||||||
"operationId" : "findPetsByTags",
|
|
||||||
"produces" : [ "application/xml", "application/json" ],
|
|
||||||
"parameters" : [ {
|
|
||||||
"name" : "tags",
|
|
||||||
"in" : "query",
|
|
||||||
"description" : "Tags to filter by",
|
|
||||||
"required" : true,
|
|
||||||
"type" : "array",
|
|
||||||
"items" : {
|
|
||||||
"type" : "string"
|
|
||||||
},
|
|
||||||
"collectionFormat" : "csv"
|
|
||||||
} ],
|
|
||||||
"responses" : {
|
|
||||||
"200" : {
|
|
||||||
"description" : "successful operation",
|
|
||||||
"schema" : {
|
|
||||||
"type" : "array",
|
|
||||||
"items" : {
|
|
||||||
"$ref" : "#/definitions/Pet"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"400" : {
|
|
||||||
"description" : "Invalid tag value"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"security" : [ {
|
|
||||||
"petstore_auth" : [ "write:pets", "read:pets" ]
|
|
||||||
} ],
|
|
||||||
"deprecated" : true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"/pet/{petId}" : {
|
|
||||||
"get" : {
|
|
||||||
"tags" : [ "pet" ],
|
|
||||||
"summary" : "Find pet by ID",
|
|
||||||
"description" : "Returns a single pet",
|
|
||||||
"operationId" : "getPetById",
|
|
||||||
"produces" : [ "application/xml", "application/json" ],
|
|
||||||
"parameters" : [ {
|
|
||||||
"name" : "petId",
|
|
||||||
"in" : "path",
|
|
||||||
"description" : "ID of pet to return",
|
|
||||||
"required" : true,
|
|
||||||
"type" : "integer",
|
|
||||||
"format" : "int64"
|
|
||||||
} ],
|
|
||||||
"responses" : {
|
|
||||||
"200" : {
|
|
||||||
"description" : "successful operation",
|
|
||||||
"schema" : {
|
|
||||||
"$ref" : "#/definitions/Pet"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"400" : {
|
|
||||||
"description" : "Invalid ID supplied"
|
|
||||||
},
|
|
||||||
"404" : {
|
|
||||||
"description" : "Pet not found"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"security" : [ {
|
|
||||||
"api_key" : [ ]
|
|
||||||
} ]
|
|
||||||
},
|
|
||||||
"post" : {
|
|
||||||
"tags" : [ "pet" ],
|
|
||||||
"summary" : "Updates a pet in the store with form data",
|
|
||||||
"description" : "",
|
|
||||||
"operationId" : "updatePetWithForm",
|
|
||||||
"consumes" : [ "application/x-www-form-urlencoded" ],
|
|
||||||
"produces" : [ "application/xml", "application/json" ],
|
|
||||||
"parameters" : [ {
|
|
||||||
"name" : "petId",
|
|
||||||
"in" : "path",
|
|
||||||
"description" : "ID of pet that needs to be updated",
|
|
||||||
"required" : true,
|
|
||||||
"type" : "integer",
|
|
||||||
"format" : "int64"
|
|
||||||
}, {
|
|
||||||
"name" : "name",
|
|
||||||
"in" : "formData",
|
|
||||||
"description" : "Updated name of the pet",
|
|
||||||
"required" : false,
|
|
||||||
"type" : "string"
|
|
||||||
}, {
|
|
||||||
"name" : "status",
|
|
||||||
"in" : "formData",
|
|
||||||
"description" : "Updated status of the pet",
|
|
||||||
"required" : false,
|
|
||||||
"type" : "string"
|
|
||||||
} ],
|
|
||||||
"responses" : {
|
|
||||||
"405" : {
|
|
||||||
"description" : "Invalid input"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"security" : [ {
|
|
||||||
"petstore_auth" : [ "write:pets", "read:pets" ]
|
|
||||||
} ]
|
|
||||||
},
|
|
||||||
"delete" : {
|
|
||||||
"tags" : [ "pet" ],
|
|
||||||
"summary" : "Deletes a pet",
|
|
||||||
"description" : "",
|
|
||||||
"operationId" : "deletePet",
|
|
||||||
"produces" : [ "application/xml", "application/json" ],
|
|
||||||
"parameters" : [ {
|
|
||||||
"name" : "api_key",
|
|
||||||
"in" : "header",
|
|
||||||
"required" : false,
|
|
||||||
"type" : "string"
|
|
||||||
}, {
|
|
||||||
"name" : "petId",
|
|
||||||
"in" : "path",
|
|
||||||
"description" : "Pet id to delete",
|
|
||||||
"required" : true,
|
|
||||||
"type" : "integer",
|
|
||||||
"format" : "int64"
|
|
||||||
} ],
|
|
||||||
"responses" : {
|
|
||||||
"400" : {
|
|
||||||
"description" : "Invalid pet value"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"security" : [ {
|
|
||||||
"petstore_auth" : [ "write:pets", "read:pets" ]
|
|
||||||
} ]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"/pet/{petId}/uploadImage" : {
|
|
||||||
"post" : {
|
|
||||||
"tags" : [ "pet" ],
|
|
||||||
"summary" : "uploads an image",
|
|
||||||
"description" : "",
|
|
||||||
"operationId" : "uploadFile",
|
|
||||||
"consumes" : [ "multipart/form-data" ],
|
|
||||||
"produces" : [ "application/json" ],
|
|
||||||
"parameters" : [ {
|
|
||||||
"name" : "petId",
|
|
||||||
"in" : "path",
|
|
||||||
"description" : "ID of pet to update",
|
|
||||||
"required" : true,
|
|
||||||
"type" : "integer",
|
|
||||||
"format" : "int64"
|
|
||||||
}, {
|
|
||||||
"name" : "additionalMetadata",
|
|
||||||
"in" : "formData",
|
|
||||||
"description" : "Additional data to pass to server",
|
|
||||||
"required" : false,
|
|
||||||
"type" : "string"
|
|
||||||
}, {
|
|
||||||
"name" : "file",
|
|
||||||
"in" : "formData",
|
|
||||||
"description" : "file to upload",
|
|
||||||
"required" : false,
|
|
||||||
"type" : "file"
|
|
||||||
} ],
|
|
||||||
"responses" : {
|
|
||||||
"200" : {
|
|
||||||
"description" : "successful operation",
|
|
||||||
"schema" : {
|
|
||||||
"$ref" : "#/definitions/ApiResponse"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"security" : [ {
|
|
||||||
"petstore_auth" : [ "write:pets", "read:pets" ]
|
|
||||||
} ]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"/store/inventory" : {
|
|
||||||
"get" : {
|
|
||||||
"tags" : [ "store" ],
|
|
||||||
"summary" : "Returns pet inventories by status",
|
|
||||||
"description" : "Returns a map of status codes to quantities",
|
|
||||||
"operationId" : "getInventory",
|
|
||||||
"produces" : [ "application/json" ],
|
|
||||||
"parameters" : [ ],
|
|
||||||
"responses" : {
|
|
||||||
"200" : {
|
|
||||||
"description" : "successful operation",
|
|
||||||
"schema" : {
|
|
||||||
"type" : "object",
|
|
||||||
"additionalProperties" : {
|
|
||||||
"type" : "integer",
|
|
||||||
"format" : "int32"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"security" : [ {
|
|
||||||
"api_key" : [ ]
|
|
||||||
} ]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"/store/order" : {
|
|
||||||
"post" : {
|
|
||||||
"tags" : [ "store" ],
|
|
||||||
"summary" : "Place an order for a pet",
|
|
||||||
"description" : "",
|
|
||||||
"operationId" : "placeOrder",
|
|
||||||
"produces" : [ "application/xml", "application/json" ],
|
|
||||||
"parameters" : [ {
|
|
||||||
"in" : "body",
|
|
||||||
"name" : "body",
|
|
||||||
"description" : "order placed for purchasing the pet",
|
|
||||||
"required" : true,
|
|
||||||
"schema" : {
|
|
||||||
"$ref" : "#/definitions/Order"
|
|
||||||
}
|
|
||||||
} ],
|
|
||||||
"responses" : {
|
|
||||||
"200" : {
|
|
||||||
"description" : "successful operation",
|
|
||||||
"schema" : {
|
|
||||||
"$ref" : "#/definitions/Order"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"400" : {
|
|
||||||
"description" : "Invalid Order"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"/store/order/{orderId}" : {
|
|
||||||
"get" : {
|
|
||||||
"tags" : [ "store" ],
|
|
||||||
"summary" : "Find purchase order by ID",
|
|
||||||
"description" : "For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions",
|
|
||||||
"operationId" : "getOrderById",
|
|
||||||
"produces" : [ "application/xml", "application/json" ],
|
|
||||||
"parameters" : [ {
|
|
||||||
"name" : "orderId",
|
|
||||||
"in" : "path",
|
|
||||||
"description" : "ID of pet that needs to be fetched",
|
|
||||||
"required" : true,
|
|
||||||
"type" : "integer",
|
|
||||||
"maximum" : 5,
|
|
||||||
"minimum" : 1,
|
|
||||||
"format" : "int64"
|
|
||||||
} ],
|
|
||||||
"responses" : {
|
|
||||||
"200" : {
|
|
||||||
"description" : "successful operation",
|
|
||||||
"schema" : {
|
|
||||||
"$ref" : "#/definitions/Order"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"400" : {
|
|
||||||
"description" : "Invalid ID supplied"
|
|
||||||
},
|
|
||||||
"404" : {
|
|
||||||
"description" : "Order not found"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"delete" : {
|
|
||||||
"tags" : [ "store" ],
|
|
||||||
"summary" : "Delete purchase order by ID",
|
|
||||||
"description" : "For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors",
|
|
||||||
"operationId" : "deleteOrder",
|
|
||||||
"produces" : [ "application/xml", "application/json" ],
|
|
||||||
"parameters" : [ {
|
|
||||||
"name" : "orderId",
|
|
||||||
"in" : "path",
|
|
||||||
"description" : "ID of the order that needs to be deleted",
|
|
||||||
"required" : true,
|
|
||||||
"type" : "string"
|
|
||||||
} ],
|
|
||||||
"responses" : {
|
|
||||||
"400" : {
|
|
||||||
"description" : "Invalid ID supplied"
|
|
||||||
},
|
|
||||||
"404" : {
|
|
||||||
"description" : "Order not found"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"/user" : {
|
|
||||||
"post" : {
|
|
||||||
"tags" : [ "user" ],
|
|
||||||
"summary" : "Create user",
|
|
||||||
"description" : "This can only be done by the logged in user.",
|
|
||||||
"operationId" : "createUser",
|
|
||||||
"produces" : [ "application/xml", "application/json" ],
|
|
||||||
"parameters" : [ {
|
|
||||||
"in" : "body",
|
|
||||||
"name" : "body",
|
|
||||||
"description" : "Created user object",
|
|
||||||
"required" : true,
|
|
||||||
"schema" : {
|
|
||||||
"$ref" : "#/definitions/User"
|
|
||||||
}
|
|
||||||
} ],
|
|
||||||
"responses" : {
|
|
||||||
"default" : {
|
|
||||||
"description" : "successful operation"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"/user/createWithArray" : {
|
|
||||||
"post" : {
|
|
||||||
"tags" : [ "user" ],
|
|
||||||
"summary" : "Creates list of users with given input array",
|
|
||||||
"description" : "",
|
|
||||||
"operationId" : "createUsersWithArrayInput",
|
|
||||||
"produces" : [ "application/xml", "application/json" ],
|
|
||||||
"parameters" : [ {
|
|
||||||
"in" : "body",
|
|
||||||
"name" : "body",
|
|
||||||
"description" : "List of user object",
|
|
||||||
"required" : true,
|
|
||||||
"schema" : {
|
|
||||||
"type" : "array",
|
|
||||||
"items" : {
|
|
||||||
"$ref" : "#/definitions/User"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} ],
|
|
||||||
"responses" : {
|
|
||||||
"default" : {
|
|
||||||
"description" : "successful operation"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"/user/createWithList" : {
|
|
||||||
"post" : {
|
|
||||||
"tags" : [ "user" ],
|
|
||||||
"summary" : "Creates list of users with given input array",
|
|
||||||
"description" : "",
|
|
||||||
"operationId" : "createUsersWithListInput",
|
|
||||||
"produces" : [ "application/xml", "application/json" ],
|
|
||||||
"parameters" : [ {
|
|
||||||
"in" : "body",
|
|
||||||
"name" : "body",
|
|
||||||
"description" : "List of user object",
|
|
||||||
"required" : true,
|
|
||||||
"schema" : {
|
|
||||||
"type" : "array",
|
|
||||||
"items" : {
|
|
||||||
"$ref" : "#/definitions/User"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} ],
|
|
||||||
"responses" : {
|
|
||||||
"default" : {
|
|
||||||
"description" : "successful operation"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"/user/login" : {
|
|
||||||
"get" : {
|
|
||||||
"tags" : [ "user" ],
|
|
||||||
"summary" : "Logs user into the system",
|
|
||||||
"description" : "",
|
|
||||||
"operationId" : "loginUser",
|
|
||||||
"produces" : [ "application/xml", "application/json" ],
|
|
||||||
"parameters" : [ {
|
|
||||||
"name" : "username",
|
|
||||||
"in" : "query",
|
|
||||||
"description" : "The user name for login",
|
|
||||||
"required" : true,
|
|
||||||
"type" : "string"
|
|
||||||
}, {
|
|
||||||
"name" : "password",
|
|
||||||
"in" : "query",
|
|
||||||
"description" : "The password for login in clear text",
|
|
||||||
"required" : true,
|
|
||||||
"type" : "string"
|
|
||||||
} ],
|
|
||||||
"responses" : {
|
|
||||||
"200" : {
|
|
||||||
"description" : "successful operation",
|
|
||||||
"schema" : {
|
|
||||||
"type" : "string"
|
|
||||||
},
|
|
||||||
"headers" : {
|
|
||||||
"X-Rate-Limit" : {
|
|
||||||
"type" : "integer",
|
|
||||||
"format" : "int32",
|
|
||||||
"description" : "calls per hour allowed by the user"
|
|
||||||
},
|
|
||||||
"X-Expires-After" : {
|
|
||||||
"type" : "string",
|
|
||||||
"format" : "date-time",
|
|
||||||
"description" : "date in UTC when toekn expires"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"400" : {
|
|
||||||
"description" : "Invalid username/password supplied"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"/user/logout" : {
|
|
||||||
"get" : {
|
|
||||||
"tags" : [ "user" ],
|
|
||||||
"summary" : "Logs out current logged in user session",
|
|
||||||
"description" : "",
|
|
||||||
"operationId" : "logoutUser",
|
|
||||||
"produces" : [ "application/xml", "application/json" ],
|
|
||||||
"parameters" : [ ],
|
|
||||||
"responses" : {
|
|
||||||
"default" : {
|
|
||||||
"description" : "successful operation"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"/user/{username}" : {
|
|
||||||
"get" : {
|
|
||||||
"tags" : [ "user" ],
|
|
||||||
"summary" : "Get user by user name",
|
|
||||||
"description" : "",
|
|
||||||
"operationId" : "getUserByName",
|
|
||||||
"produces" : [ "application/xml", "application/json" ],
|
|
||||||
"parameters" : [ {
|
|
||||||
"name" : "username",
|
|
||||||
"in" : "path",
|
|
||||||
"description" : "The name that needs to be fetched. Use user1 for testing. ",
|
|
||||||
"required" : true,
|
|
||||||
"type" : "string"
|
|
||||||
} ],
|
|
||||||
"responses" : {
|
|
||||||
"200" : {
|
|
||||||
"description" : "successful operation",
|
|
||||||
"schema" : {
|
|
||||||
"$ref" : "#/definitions/User"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"400" : {
|
|
||||||
"description" : "Invalid username supplied"
|
|
||||||
},
|
|
||||||
"404" : {
|
|
||||||
"description" : "User not found"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"put" : {
|
|
||||||
"tags" : [ "user" ],
|
|
||||||
"summary" : "Updated user",
|
|
||||||
"description" : "This can only be done by the logged in user.",
|
|
||||||
"operationId" : "updateUser",
|
|
||||||
"produces" : [ "application/xml", "application/json" ],
|
|
||||||
"parameters" : [ {
|
|
||||||
"name" : "username",
|
|
||||||
"in" : "path",
|
|
||||||
"description" : "name that need to be deleted",
|
|
||||||
"required" : true,
|
|
||||||
"type" : "string"
|
|
||||||
}, {
|
|
||||||
"in" : "body",
|
|
||||||
"name" : "body",
|
|
||||||
"description" : "Updated user object",
|
|
||||||
"required" : true,
|
|
||||||
"schema" : {
|
|
||||||
"$ref" : "#/definitions/User"
|
|
||||||
}
|
|
||||||
} ],
|
|
||||||
"responses" : {
|
|
||||||
"400" : {
|
|
||||||
"description" : "Invalid user supplied"
|
|
||||||
},
|
|
||||||
"404" : {
|
|
||||||
"description" : "User not found"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"delete" : {
|
|
||||||
"tags" : [ "user" ],
|
|
||||||
"summary" : "Delete user",
|
|
||||||
"description" : "This can only be done by the logged in user.",
|
|
||||||
"operationId" : "deleteUser",
|
|
||||||
"produces" : [ "application/xml", "application/json" ],
|
|
||||||
"parameters" : [ {
|
|
||||||
"name" : "username",
|
|
||||||
"in" : "path",
|
|
||||||
"description" : "The name that needs to be deleted",
|
|
||||||
"required" : true,
|
|
||||||
"type" : "string"
|
|
||||||
} ],
|
|
||||||
"responses" : {
|
|
||||||
"400" : {
|
|
||||||
"description" : "Invalid username supplied"
|
|
||||||
},
|
|
||||||
"404" : {
|
|
||||||
"description" : "User not found"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"securityDefinitions" : {
|
|
||||||
"petstore_auth" : {
|
|
||||||
"type" : "oauth2",
|
|
||||||
"authorizationUrl" : "http://petstore.swagger.io/api/oauth/dialog",
|
|
||||||
"flow" : "implicit",
|
|
||||||
"scopes" : {
|
|
||||||
"write:pets" : "modify pets in your account",
|
|
||||||
"read:pets" : "read your pets"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"api_key" : {
|
|
||||||
"type" : "apiKey",
|
|
||||||
"name" : "api_key",
|
|
||||||
"in" : "header"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"definitions" : {
|
|
||||||
"Order" : {
|
|
||||||
"type" : "object",
|
|
||||||
"properties" : {
|
|
||||||
"id" : {
|
|
||||||
"type" : "integer",
|
|
||||||
"format" : "int64"
|
|
||||||
},
|
|
||||||
"petId" : {
|
|
||||||
"type" : "integer",
|
|
||||||
"format" : "int64"
|
|
||||||
},
|
|
||||||
"quantity" : {
|
|
||||||
"type" : "integer",
|
|
||||||
"format" : "int32"
|
|
||||||
},
|
|
||||||
"shipDate" : {
|
|
||||||
"type" : "string",
|
|
||||||
"format" : "date-time"
|
|
||||||
},
|
|
||||||
"status" : {
|
|
||||||
"type" : "string",
|
|
||||||
"description" : "Order Status",
|
|
||||||
"enum" : [ "placed", "approved", "delivered" ]
|
|
||||||
},
|
|
||||||
"complete" : {
|
|
||||||
"type" : "boolean",
|
|
||||||
"default" : false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"title" : "Pet Order",
|
|
||||||
"description" : "An order for a pets from the pet store",
|
|
||||||
"xml" : {
|
|
||||||
"name" : "Order"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Category" : {
|
|
||||||
"type" : "object",
|
|
||||||
"properties" : {
|
|
||||||
"id" : {
|
|
||||||
"type" : "integer",
|
|
||||||
"format" : "int64"
|
|
||||||
},
|
|
||||||
"name" : {
|
|
||||||
"type" : "string"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"title" : "Pet category",
|
|
||||||
"description" : "A category for a pet",
|
|
||||||
"xml" : {
|
|
||||||
"name" : "Category"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"User" : {
|
|
||||||
"type" : "object",
|
|
||||||
"properties" : {
|
|
||||||
"id" : {
|
|
||||||
"type" : "integer",
|
|
||||||
"format" : "int64"
|
|
||||||
},
|
|
||||||
"username" : {
|
|
||||||
"type" : "string"
|
|
||||||
},
|
|
||||||
"firstName" : {
|
|
||||||
"type" : "string"
|
|
||||||
},
|
|
||||||
"lastName" : {
|
|
||||||
"type" : "string"
|
|
||||||
},
|
|
||||||
"email" : {
|
|
||||||
"type" : "string"
|
|
||||||
},
|
|
||||||
"password" : {
|
|
||||||
"type" : "string"
|
|
||||||
},
|
|
||||||
"phone" : {
|
|
||||||
"type" : "string"
|
|
||||||
},
|
|
||||||
"userStatus" : {
|
|
||||||
"type" : "integer",
|
|
||||||
"format" : "int32",
|
|
||||||
"description" : "User Status"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"title" : "a User",
|
|
||||||
"description" : "A User who is purchasing from the pet store",
|
|
||||||
"xml" : {
|
|
||||||
"name" : "User"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Tag" : {
|
|
||||||
"type" : "object",
|
|
||||||
"properties" : {
|
|
||||||
"id" : {
|
|
||||||
"type" : "integer",
|
|
||||||
"format" : "int64"
|
|
||||||
},
|
|
||||||
"name" : {
|
|
||||||
"type" : "string"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"title" : "Pet Tag",
|
|
||||||
"description" : "A tag for a pet",
|
|
||||||
"xml" : {
|
|
||||||
"name" : "Tag"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Pet" : {
|
|
||||||
"type" : "object",
|
|
||||||
"required" : [ "name", "photoUrls" ],
|
|
||||||
"properties" : {
|
|
||||||
"id" : {
|
|
||||||
"type" : "integer",
|
|
||||||
"format" : "int64"
|
|
||||||
},
|
|
||||||
"category" : {
|
|
||||||
"$ref" : "#/definitions/Category"
|
|
||||||
},
|
|
||||||
"name" : {
|
|
||||||
"type" : "string",
|
|
||||||
"example" : "doggie"
|
|
||||||
},
|
|
||||||
"photoUrls" : {
|
|
||||||
"type" : "array",
|
|
||||||
"xml" : {
|
|
||||||
"name" : "photoUrl",
|
|
||||||
"wrapped" : true
|
|
||||||
},
|
|
||||||
"items" : {
|
|
||||||
"type" : "string"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"tags" : {
|
|
||||||
"type" : "array",
|
|
||||||
"xml" : {
|
|
||||||
"name" : "tag",
|
|
||||||
"wrapped" : true
|
|
||||||
},
|
|
||||||
"items" : {
|
|
||||||
"$ref" : "#/definitions/Tag"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"status" : {
|
|
||||||
"type" : "string",
|
|
||||||
"description" : "pet status in the store",
|
|
||||||
"enum" : [ "available", "pending", "sold" ]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"title" : "a Pet",
|
|
||||||
"description" : "A pet for sale in the pet store",
|
|
||||||
"xml" : {
|
|
||||||
"name" : "Pet"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"ApiResponse" : {
|
|
||||||
"type" : "object",
|
|
||||||
"properties" : {
|
|
||||||
"code" : {
|
|
||||||
"type" : "integer",
|
|
||||||
"format" : "int32"
|
|
||||||
},
|
|
||||||
"type" : {
|
|
||||||
"type" : "string"
|
|
||||||
},
|
|
||||||
"message" : {
|
|
||||||
"type" : "string"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"title" : "An uploaded response",
|
|
||||||
"description" : "Describes the result of uploading an image resource"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"externalDocs" : {
|
|
||||||
"description" : "Find out more about Swagger",
|
|
||||||
"url" : "http://swagger.io"
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,4 +1,6 @@
|
|||||||
{deps, [
|
{deps, [
|
||||||
{jsx, {git, "https://github.com/talentdeficit/jsx.git", {tag, "2.8.2"}}},
|
{cowboy, {git, "https://github.com/ninenines/cowboy.git", {tag, "2.5.0"}}},
|
||||||
{jesse, {git, "https://github.com/for-GET/jesse.git", {tag, "1.4.0"}}}
|
{rfc3339, {git, "https://github.com/talentdeficit/rfc3339.git", {tag, "master"}}},
|
||||||
|
{jsx, {git, "https://github.com/talentdeficit/jsx.git", {tag, "2.9.0"}}},
|
||||||
|
{jesse, {git, "https://github.com/for-GET/jesse.git", {tag, "1.5.2"}}}
|
||||||
]}.
|
]}.
|
||||||
|
@ -649,7 +649,7 @@ validate(Rule = {pattern, Pattern}, Name, Value, _ValidatorState) ->
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
validate(Rule = schema, Name, Value, ValidatorState) ->
|
validate(Rule = schema, Name, Value, ValidatorState) ->
|
||||||
Definition = list_to_binary("#/definitions/" ++ openapi_utils:to_list(Name)),
|
Definition = list_to_binary("#/components/schemas/" ++ openapi_utils:to_list(Name)),
|
||||||
try
|
try
|
||||||
_ = validate_with_schema(Value, Definition, ValidatorState),
|
_ = validate_with_schema(Value, Definition, ValidatorState),
|
||||||
ok
|
ok
|
||||||
@ -688,7 +688,7 @@ validation_error(ViolatedRule, Name, Info) ->
|
|||||||
{Value :: any(), Req :: cowboy_req:req()} |
|
{Value :: any(), Req :: cowboy_req:req()} |
|
||||||
{error, Reason :: any(), Req :: cowboy_req:req()}.
|
{error, Reason :: any(), Req :: cowboy_req:req()}.
|
||||||
get_value(body, _Name, Req0) ->
|
get_value(body, _Name, Req0) ->
|
||||||
{ok, Body, Req} = cowboy_req:body(Req0),
|
{ok, Body, Req} = cowboy_req:read_body(Req0),
|
||||||
case prepare_body(Body) of
|
case prepare_body(Body) of
|
||||||
{error, Reason} ->
|
{error, Reason} ->
|
||||||
{error, Reason, Req};
|
{error, Reason, Req};
|
||||||
@ -696,19 +696,18 @@ get_value(body, _Name, Req0) ->
|
|||||||
{Value, Req}
|
{Value, Req}
|
||||||
end;
|
end;
|
||||||
|
|
||||||
get_value(qs_val, Name, Req0) ->
|
get_value(qs_val, Name, Req) ->
|
||||||
{QS, Req} = cowboy_req:qs_vals(Req0),
|
QS = cowboy_req:parse_qs(Req),
|
||||||
Value = openapi_utils:get_opt(openapi_utils:to_qs(Name), QS),
|
Value = openapi_utils:get_opt(openapi_utils:to_qs(Name), QS),
|
||||||
{Value, Req};
|
{Value, Req};
|
||||||
|
|
||||||
get_value(header, Name, Req0) ->
|
get_value(header, Name, Req) ->
|
||||||
{Headers, Req} = cowboy_req:headers(Req0),
|
Headers = cowboy_req:headers(Req),
|
||||||
Value = openapi_utils:get_opt(openapi_utils:to_header(Name), Headers),
|
Value = maps:get(openapi_utils:to_header(Name), Headers, undefined),
|
||||||
{Value, Req};
|
{Value, Req};
|
||||||
|
|
||||||
get_value(binding, Name, Req0) ->
|
get_value(binding, Name, Req) ->
|
||||||
{Bindings, Req} = cowboy_req:bindings(Req0),
|
Value = cowboy_req:binding(openapi_utils:to_binding(Name), Req),
|
||||||
Value = openapi_utils:get_opt(openapi_utils:to_binding(Name), Bindings),
|
|
||||||
{Value, Req}.
|
{Value, Req}.
|
||||||
|
|
||||||
prepare_body(Body) ->
|
prepare_body(Body) ->
|
||||||
|
@ -32,18 +32,19 @@ authorize_api_key(LogicHandler, OperationID, From, KeyParam, Req0) ->
|
|||||||
end
|
end
|
||||||
end.
|
end.
|
||||||
|
|
||||||
get_api_key(header, KeyParam, Req0) ->
|
get_api_key(header, KeyParam, Req) ->
|
||||||
{Headers, Req} = cowboy_req:headers(Req0),
|
Headers = cowboy_req:headers(Req),
|
||||||
{
|
{
|
||||||
openapi_utils:get_opt(
|
maps:get(
|
||||||
openapi_utils:to_header(KeyParam),
|
openapi_utils:to_header(KeyParam),
|
||||||
Headers
|
Headers,
|
||||||
|
undefined
|
||||||
),
|
),
|
||||||
Req
|
Req
|
||||||
};
|
};
|
||||||
|
|
||||||
get_api_key(qs_val, KeyParam, Req0) ->
|
get_api_key(qs_val, KeyParam, Req) ->
|
||||||
{QS, Req} = cowboy_req:qs_vals(Req0),
|
QS = cowboy_req:parse_qs(Req),
|
||||||
{ openapi_utils:get_opt(KeyParam, QS), Req}.
|
{ openapi_utils:get_opt(KeyParam, QS), Req}.
|
||||||
|
|
||||||
|
|
||||||
|
@ -14,11 +14,11 @@ authorize_api_key(_, _) -> {true, #{}}.
|
|||||||
Req :: cowboy_req:req(),
|
Req :: cowboy_req:req(),
|
||||||
Context :: #{}
|
Context :: #{}
|
||||||
) ->
|
) ->
|
||||||
{Status :: cowboy:http_status(), Headers :: cowboy:http_headers(), Body :: #{}}.
|
{Status :: cowboy:http_status(), Headers :: cowboy:http_headers(), Body :: jsx:json_term()}.
|
||||||
|
|
||||||
handle_request(OperationID, Req, Context) ->
|
handle_request(OperationID, Req, Context) ->
|
||||||
error_logger:error_msg(
|
error_logger:error_msg(
|
||||||
"Got not implemented request to process: ~p~n",
|
"Got not implemented request to process: ~p~n",
|
||||||
[{OperationID, Req, Context}]
|
[{OperationID, Req, Context}]
|
||||||
),
|
),
|
||||||
{501, [], #{}}.
|
{501, #{}, #{}}.
|
||||||
|
@ -18,13 +18,13 @@
|
|||||||
Result :: boolean() | {boolean(), context()}.
|
Result :: boolean() | {boolean(), context()}.
|
||||||
|
|
||||||
|
|
||||||
-callback handle_request(OperationID :: openapi_api:operation_id(), Request :: any(), Context :: context()) ->
|
-callback handle_request(OperationID :: openapi_api:operation_id(), cowboy_req:req(), Context :: context()) ->
|
||||||
handler_response().
|
handler_response().
|
||||||
|
|
||||||
-spec handle_request(
|
-spec handle_request(
|
||||||
Handler :: atom(),
|
Handler :: atom(),
|
||||||
OperationID :: openapi_api:operation_id(),
|
OperationID :: openapi_api:operation_id(),
|
||||||
Request :: any(),
|
Request :: cowboy_req:req(),
|
||||||
Context :: context()
|
Context :: context()
|
||||||
) ->
|
) ->
|
||||||
handler_response().
|
handler_response().
|
||||||
|
@ -3,8 +3,7 @@
|
|||||||
|
|
||||||
%% Cowboy REST callbacks
|
%% Cowboy REST callbacks
|
||||||
-export([allowed_methods/2]).
|
-export([allowed_methods/2]).
|
||||||
-export([init/3]).
|
-export([init/2]).
|
||||||
-export([rest_init/2]).
|
|
||||||
-export([allow_missing_post/2]).
|
-export([allow_missing_post/2]).
|
||||||
-export([content_types_accepted/2]).
|
-export([content_types_accepted/2]).
|
||||||
-export([content_types_provided/2]).
|
-export([content_types_provided/2]).
|
||||||
@ -27,17 +26,11 @@
|
|||||||
|
|
||||||
-type state() :: state().
|
-type state() :: state().
|
||||||
|
|
||||||
-spec init(TransportName :: atom(), Req :: cowboy_req:req(), Opts :: openapi_router:init_opts()) ->
|
-spec init(Req :: cowboy_req:req(), Opts :: openapi_router:init_opts()) ->
|
||||||
{upgrade, protocol, cowboy_rest, Req :: cowboy_req:req(), Opts :: openapi_router:init_opts()}.
|
{cowboy_rest, Req :: cowboy_req:req(), State :: state()}.
|
||||||
|
|
||||||
init(_Transport, Req, Opts) ->
|
init(Req, {Operations, LogicHandler, ValidatorState}) ->
|
||||||
{upgrade, protocol, cowboy_rest, Req, Opts}.
|
Method = cowboy_req:method(Req),
|
||||||
|
|
||||||
-spec rest_init(Req :: cowboy_req:req(), Opts :: openapi_router:init_opts()) ->
|
|
||||||
{ok, Req :: cowboy_req:req(), State :: state()}.
|
|
||||||
|
|
||||||
rest_init(Req0, {Operations, LogicHandler, ValidatorState}) ->
|
|
||||||
{Method, Req} = cowboy_req:method(Req0),
|
|
||||||
OperationID = maps:get(Method, Operations, undefined),
|
OperationID = maps:get(Method, Operations, undefined),
|
||||||
|
|
||||||
error_logger:info_msg("Attempt to process operation: ~p", [OperationID]),
|
error_logger:info_msg("Attempt to process operation: ~p", [OperationID]),
|
||||||
@ -47,7 +40,7 @@ rest_init(Req0, {Operations, LogicHandler, ValidatorState}) ->
|
|||||||
logic_handler = LogicHandler,
|
logic_handler = LogicHandler,
|
||||||
validator_state = ValidatorState
|
validator_state = ValidatorState
|
||||||
},
|
},
|
||||||
{ok, Req, State}.
|
{cowboy_rest, Req, State}.
|
||||||
|
|
||||||
-spec allowed_methods(Req :: cowboy_req:req(), State :: state()) ->
|
-spec allowed_methods(Req :: cowboy_req:req(), State :: state()) ->
|
||||||
{Value :: [binary()], Req :: cowboy_req:req(), State :: state()}.
|
{Value :: [binary()], Req :: cowboy_req:req(), State :: state()}.
|
||||||
@ -423,7 +416,6 @@ valid_entity_length(Req, State) ->
|
|||||||
{true, Req, State}.
|
{true, Req, State}.
|
||||||
|
|
||||||
%%%%
|
%%%%
|
||||||
|
|
||||||
-type result_ok() :: {
|
-type result_ok() :: {
|
||||||
ok,
|
ok,
|
||||||
{Status :: cowboy:http_status(), Headers :: cowboy:http_headers(), Body :: iodata()}
|
{Status :: cowboy:http_status(), Headers :: cowboy:http_headers(), Body :: iodata()}
|
||||||
@ -431,7 +423,7 @@ valid_entity_length(Req, State) ->
|
|||||||
|
|
||||||
-type result_error() :: {error, Reason :: any()}.
|
-type result_error() :: {error, Reason :: any()}.
|
||||||
|
|
||||||
-type processed_response() :: {halt, cowboy_req:req(), state()}.
|
-type processed_response() :: {stop, cowboy_req:req(), state()}.
|
||||||
|
|
||||||
-spec process_response(result_ok() | result_error(), cowboy_req:req(), state()) ->
|
-spec process_response(result_ok() | result_error(), cowboy_req:req(), state()) ->
|
||||||
processed_response().
|
processed_response().
|
||||||
@ -439,24 +431,23 @@ valid_entity_length(Req, State) ->
|
|||||||
process_response(Response, Req0, State = #state{operation_id = OperationID}) ->
|
process_response(Response, Req0, State = #state{operation_id = OperationID}) ->
|
||||||
case Response of
|
case Response of
|
||||||
{ok, {Code, Headers, Body}} ->
|
{ok, {Code, Headers, Body}} ->
|
||||||
{ok, Req} = cowboy_req:reply(Code, Headers, Body, Req0),
|
Req = cowboy_req:reply(Code, Headers, Body, Req0),
|
||||||
{halt, Req, State};
|
{stop, Req, State};
|
||||||
{error, Message} ->
|
{error, Message} ->
|
||||||
error_logger:error_msg("Unable to process request for ~p: ~p", [OperationID, Message]),
|
error_logger:error_msg("Unable to process request for ~p: ~p", [OperationID, Message]),
|
||||||
|
|
||||||
{ok, Req} = cowboy_req:reply(400, Req0),
|
Req = cowboy_req:reply(400, Req0),
|
||||||
{halt, Req, State}
|
{stop, Req, State}
|
||||||
end.
|
end.
|
||||||
|
|
||||||
-spec handle_request_json(cowboy_req:req(), state()) -> {halt, cowboy_req:req(), state()}.
|
-spec handle_request_json(cowboy_req:req(), state()) -> {cowboy_req:resp_body(), cowboy_req:req(), state()}.
|
||||||
|
|
||||||
handle_request_json(
|
handle_request_json(
|
||||||
Req0,
|
Req0,
|
||||||
State = #state{
|
State = #state{
|
||||||
operation_id = OperationID,
|
operation_id = OperationID,
|
||||||
logic_handler = LogicHandler,
|
logic_handler = LogicHandler,
|
||||||
validator_state = ValidatorState,
|
validator_state = ValidatorState
|
||||||
context = Context
|
|
||||||
}
|
}
|
||||||
) ->
|
) ->
|
||||||
case openapi_api:populate_request(OperationID, Req0, ValidatorState) of
|
case openapi_api:populate_request(OperationID, Req0, ValidatorState) of
|
||||||
@ -464,8 +455,8 @@ handle_request_json(
|
|||||||
{Code, Headers, Body} = openapi_logic_handler:handle_request(
|
{Code, Headers, Body} = openapi_logic_handler:handle_request(
|
||||||
LogicHandler,
|
LogicHandler,
|
||||||
OperationID,
|
OperationID,
|
||||||
Populated,
|
Req1,
|
||||||
Context
|
Populated
|
||||||
),
|
),
|
||||||
_ = openapi_api:validate_response(
|
_ = openapi_api:validate_response(
|
||||||
OperationID,
|
OperationID,
|
||||||
|
@ -1,30 +1,32 @@
|
|||||||
-module(openapi_server).
|
-module(openapi_server).
|
||||||
|
|
||||||
|
|
||||||
-define(DEFAULT_ACCEPTORS_POOLSIZE, 100).
|
|
||||||
-define(DEFAULT_LOGIC_HANDLER, openapi_default_logic_handler).
|
-define(DEFAULT_LOGIC_HANDLER, openapi_default_logic_handler).
|
||||||
|
|
||||||
-export([child_spec/2]).
|
-export([start/2]).
|
||||||
|
|
||||||
-spec child_spec( ID :: any(), #{
|
-spec start( ID :: any(), #{
|
||||||
ip => inet:ip_address(),
|
ip => inet:ip_address(),
|
||||||
port => inet:port_number(),
|
port => inet:port_number(),
|
||||||
logic_handler => module(),
|
logic_handler => module(),
|
||||||
net_opts => []
|
net_opts => []
|
||||||
}) -> supervisor:child_spec().
|
}) -> {ok, pid()} | {error, any()}.
|
||||||
|
|
||||||
child_spec(ID, #{
|
start(ID, #{
|
||||||
ip := IP ,
|
ip := IP ,
|
||||||
port := Port,
|
port := Port,
|
||||||
net_opts := NetOpts
|
net_opts := NetOpts
|
||||||
} = Params) ->
|
} = Params) ->
|
||||||
AcceptorsPool = ?DEFAULT_ACCEPTORS_POOLSIZE,
|
|
||||||
{Transport, TransportOpts} = get_socket_transport(IP, Port, NetOpts),
|
{Transport, TransportOpts} = get_socket_transport(IP, Port, NetOpts),
|
||||||
LogicHandler = maps:get(logic_handler, Params, ?DEFAULT_LOGIC_HANDLER),
|
LogicHandler = maps:get(logic_handler, Params, ?DEFAULT_LOGIC_HANDLER),
|
||||||
ExtraOpts = maps:get(cowboy_extra_opts, Params, []),
|
ExtraOpts = maps:get(cowboy_extra_opts, Params, []),
|
||||||
CowboyOpts = get_cowboy_config(LogicHandler, ExtraOpts),
|
CowboyOpts = get_cowboy_config(LogicHandler, ExtraOpts),
|
||||||
ranch:child_spec({?MODULE, ID}, AcceptorsPool,
|
case Transport of
|
||||||
Transport, TransportOpts, cowboy_protocol, CowboyOpts).
|
ssl ->
|
||||||
|
cowboy:start_tls(ID, TransportOpts, CowboyOpts);
|
||||||
|
tcp ->
|
||||||
|
cowboy:start_clear(ID, TransportOpts, CowboyOpts)
|
||||||
|
end.
|
||||||
|
|
||||||
get_socket_transport(IP, Port, Options) ->
|
get_socket_transport(IP, Port, Options) ->
|
||||||
Opts = [
|
Opts = [
|
||||||
@ -33,9 +35,9 @@ get_socket_transport(IP, Port, Options) ->
|
|||||||
],
|
],
|
||||||
case openapi_utils:get_opt(ssl, Options) of
|
case openapi_utils:get_opt(ssl, Options) of
|
||||||
SslOpts = [_|_] ->
|
SslOpts = [_|_] ->
|
||||||
{ranch_ssl, Opts ++ SslOpts};
|
{ssl, Opts ++ SslOpts};
|
||||||
undefined ->
|
undefined ->
|
||||||
{ranch_tcp, Opts}
|
{tcp, Opts}
|
||||||
end.
|
end.
|
||||||
|
|
||||||
get_cowboy_config(LogicHandler, ExtraOpts) ->
|
get_cowboy_config(LogicHandler, ExtraOpts) ->
|
||||||
@ -56,10 +58,10 @@ get_cowboy_config(LogicHandler, [{Key, Value}| Rest], Opts) ->
|
|||||||
|
|
||||||
get_default_dispatch(LogicHandler) ->
|
get_default_dispatch(LogicHandler) ->
|
||||||
Paths = openapi_router:get_paths(LogicHandler),
|
Paths = openapi_router:get_paths(LogicHandler),
|
||||||
{dispatch, cowboy_router:compile(Paths)}.
|
#{dispatch => cowboy_router:compile(Paths)}.
|
||||||
|
|
||||||
get_default_opts(LogicHandler) ->
|
get_default_opts(LogicHandler) ->
|
||||||
[{env, [get_default_dispatch(LogicHandler)]}].
|
#{env => get_default_dispatch(LogicHandler)}.
|
||||||
|
|
||||||
store_key(Key, Value, Opts) ->
|
store_key(Key, Value, Opts) ->
|
||||||
lists:keystore(Key, 1, Opts, {Key, Value}).
|
lists:keystore(Key, 1, Opts, {Key, Value}).
|
||||||
|
@ -3,8 +3,7 @@
|
|||||||
|
|
||||||
%% Cowboy REST callbacks
|
%% Cowboy REST callbacks
|
||||||
-export([allowed_methods/2]).
|
-export([allowed_methods/2]).
|
||||||
-export([init/3]).
|
-export([init/2]).
|
||||||
-export([rest_init/2]).
|
|
||||||
-export([allow_missing_post/2]).
|
-export([allow_missing_post/2]).
|
||||||
-export([content_types_accepted/2]).
|
-export([content_types_accepted/2]).
|
||||||
-export([content_types_provided/2]).
|
-export([content_types_provided/2]).
|
||||||
@ -27,17 +26,11 @@
|
|||||||
|
|
||||||
-type state() :: state().
|
-type state() :: state().
|
||||||
|
|
||||||
-spec init(TransportName :: atom(), Req :: cowboy_req:req(), Opts :: openapi_router:init_opts()) ->
|
-spec init(Req :: cowboy_req:req(), Opts :: openapi_router:init_opts()) ->
|
||||||
{upgrade, protocol, cowboy_rest, Req :: cowboy_req:req(), Opts :: openapi_router:init_opts()}.
|
{cowboy_rest, Req :: cowboy_req:req(), State :: state()}.
|
||||||
|
|
||||||
init(_Transport, Req, Opts) ->
|
init(Req, {Operations, LogicHandler, ValidatorState}) ->
|
||||||
{upgrade, protocol, cowboy_rest, Req, Opts}.
|
Method = cowboy_req:method(Req),
|
||||||
|
|
||||||
-spec rest_init(Req :: cowboy_req:req(), Opts :: openapi_router:init_opts()) ->
|
|
||||||
{ok, Req :: cowboy_req:req(), State :: state()}.
|
|
||||||
|
|
||||||
rest_init(Req0, {Operations, LogicHandler, ValidatorState}) ->
|
|
||||||
{Method, Req} = cowboy_req:method(Req0),
|
|
||||||
OperationID = maps:get(Method, Operations, undefined),
|
OperationID = maps:get(Method, Operations, undefined),
|
||||||
|
|
||||||
error_logger:info_msg("Attempt to process operation: ~p", [OperationID]),
|
error_logger:info_msg("Attempt to process operation: ~p", [OperationID]),
|
||||||
@ -47,7 +40,7 @@ rest_init(Req0, {Operations, LogicHandler, ValidatorState}) ->
|
|||||||
logic_handler = LogicHandler,
|
logic_handler = LogicHandler,
|
||||||
validator_state = ValidatorState
|
validator_state = ValidatorState
|
||||||
},
|
},
|
||||||
{ok, Req, State}.
|
{cowboy_rest, Req, State}.
|
||||||
|
|
||||||
-spec allowed_methods(Req :: cowboy_req:req(), State :: state()) ->
|
-spec allowed_methods(Req :: cowboy_req:req(), State :: state()) ->
|
||||||
{Value :: [binary()], Req :: cowboy_req:req(), State :: state()}.
|
{Value :: [binary()], Req :: cowboy_req:req(), State :: state()}.
|
||||||
@ -218,7 +211,6 @@ valid_entity_length(Req, State) ->
|
|||||||
{true, Req, State}.
|
{true, Req, State}.
|
||||||
|
|
||||||
%%%%
|
%%%%
|
||||||
|
|
||||||
-type result_ok() :: {
|
-type result_ok() :: {
|
||||||
ok,
|
ok,
|
||||||
{Status :: cowboy:http_status(), Headers :: cowboy:http_headers(), Body :: iodata()}
|
{Status :: cowboy:http_status(), Headers :: cowboy:http_headers(), Body :: iodata()}
|
||||||
@ -226,7 +218,7 @@ valid_entity_length(Req, State) ->
|
|||||||
|
|
||||||
-type result_error() :: {error, Reason :: any()}.
|
-type result_error() :: {error, Reason :: any()}.
|
||||||
|
|
||||||
-type processed_response() :: {halt, cowboy_req:req(), state()}.
|
-type processed_response() :: {stop, cowboy_req:req(), state()}.
|
||||||
|
|
||||||
-spec process_response(result_ok() | result_error(), cowboy_req:req(), state()) ->
|
-spec process_response(result_ok() | result_error(), cowboy_req:req(), state()) ->
|
||||||
processed_response().
|
processed_response().
|
||||||
@ -234,24 +226,23 @@ valid_entity_length(Req, State) ->
|
|||||||
process_response(Response, Req0, State = #state{operation_id = OperationID}) ->
|
process_response(Response, Req0, State = #state{operation_id = OperationID}) ->
|
||||||
case Response of
|
case Response of
|
||||||
{ok, {Code, Headers, Body}} ->
|
{ok, {Code, Headers, Body}} ->
|
||||||
{ok, Req} = cowboy_req:reply(Code, Headers, Body, Req0),
|
Req = cowboy_req:reply(Code, Headers, Body, Req0),
|
||||||
{halt, Req, State};
|
{stop, Req, State};
|
||||||
{error, Message} ->
|
{error, Message} ->
|
||||||
error_logger:error_msg("Unable to process request for ~p: ~p", [OperationID, Message]),
|
error_logger:error_msg("Unable to process request for ~p: ~p", [OperationID, Message]),
|
||||||
|
|
||||||
{ok, Req} = cowboy_req:reply(400, Req0),
|
Req = cowboy_req:reply(400, Req0),
|
||||||
{halt, Req, State}
|
{stop, Req, State}
|
||||||
end.
|
end.
|
||||||
|
|
||||||
-spec handle_request_json(cowboy_req:req(), state()) -> {halt, cowboy_req:req(), state()}.
|
-spec handle_request_json(cowboy_req:req(), state()) -> {cowboy_req:resp_body(), cowboy_req:req(), state()}.
|
||||||
|
|
||||||
handle_request_json(
|
handle_request_json(
|
||||||
Req0,
|
Req0,
|
||||||
State = #state{
|
State = #state{
|
||||||
operation_id = OperationID,
|
operation_id = OperationID,
|
||||||
logic_handler = LogicHandler,
|
logic_handler = LogicHandler,
|
||||||
validator_state = ValidatorState,
|
validator_state = ValidatorState
|
||||||
context = Context
|
|
||||||
}
|
}
|
||||||
) ->
|
) ->
|
||||||
case openapi_api:populate_request(OperationID, Req0, ValidatorState) of
|
case openapi_api:populate_request(OperationID, Req0, ValidatorState) of
|
||||||
@ -259,8 +250,8 @@ handle_request_json(
|
|||||||
{Code, Headers, Body} = openapi_logic_handler:handle_request(
|
{Code, Headers, Body} = openapi_logic_handler:handle_request(
|
||||||
LogicHandler,
|
LogicHandler,
|
||||||
OperationID,
|
OperationID,
|
||||||
Populated,
|
Req1,
|
||||||
Context
|
Populated
|
||||||
),
|
),
|
||||||
_ = openapi_api:validate_response(
|
_ = openapi_api:validate_response(
|
||||||
OperationID,
|
OperationID,
|
||||||
|
@ -3,8 +3,7 @@
|
|||||||
|
|
||||||
%% Cowboy REST callbacks
|
%% Cowboy REST callbacks
|
||||||
-export([allowed_methods/2]).
|
-export([allowed_methods/2]).
|
||||||
-export([init/3]).
|
-export([init/2]).
|
||||||
-export([rest_init/2]).
|
|
||||||
-export([allow_missing_post/2]).
|
-export([allow_missing_post/2]).
|
||||||
-export([content_types_accepted/2]).
|
-export([content_types_accepted/2]).
|
||||||
-export([content_types_provided/2]).
|
-export([content_types_provided/2]).
|
||||||
@ -27,17 +26,11 @@
|
|||||||
|
|
||||||
-type state() :: state().
|
-type state() :: state().
|
||||||
|
|
||||||
-spec init(TransportName :: atom(), Req :: cowboy_req:req(), Opts :: openapi_router:init_opts()) ->
|
-spec init(Req :: cowboy_req:req(), Opts :: openapi_router:init_opts()) ->
|
||||||
{upgrade, protocol, cowboy_rest, Req :: cowboy_req:req(), Opts :: openapi_router:init_opts()}.
|
{cowboy_rest, Req :: cowboy_req:req(), State :: state()}.
|
||||||
|
|
||||||
init(_Transport, Req, Opts) ->
|
init(Req, {Operations, LogicHandler, ValidatorState}) ->
|
||||||
{upgrade, protocol, cowboy_rest, Req, Opts}.
|
Method = cowboy_req:method(Req),
|
||||||
|
|
||||||
-spec rest_init(Req :: cowboy_req:req(), Opts :: openapi_router:init_opts()) ->
|
|
||||||
{ok, Req :: cowboy_req:req(), State :: state()}.
|
|
||||||
|
|
||||||
rest_init(Req0, {Operations, LogicHandler, ValidatorState}) ->
|
|
||||||
{Method, Req} = cowboy_req:method(Req0),
|
|
||||||
OperationID = maps:get(Method, Operations, undefined),
|
OperationID = maps:get(Method, Operations, undefined),
|
||||||
|
|
||||||
error_logger:info_msg("Attempt to process operation: ~p", [OperationID]),
|
error_logger:info_msg("Attempt to process operation: ~p", [OperationID]),
|
||||||
@ -47,7 +40,7 @@ rest_init(Req0, {Operations, LogicHandler, ValidatorState}) ->
|
|||||||
logic_handler = LogicHandler,
|
logic_handler = LogicHandler,
|
||||||
validator_state = ValidatorState
|
validator_state = ValidatorState
|
||||||
},
|
},
|
||||||
{ok, Req, State}.
|
{cowboy_rest, Req, State}.
|
||||||
|
|
||||||
-spec allowed_methods(Req :: cowboy_req:req(), State :: state()) ->
|
-spec allowed_methods(Req :: cowboy_req:req(), State :: state()) ->
|
||||||
{Value :: [binary()], Req :: cowboy_req:req(), State :: state()}.
|
{Value :: [binary()], Req :: cowboy_req:req(), State :: state()}.
|
||||||
@ -271,7 +264,6 @@ valid_entity_length(Req, State) ->
|
|||||||
{true, Req, State}.
|
{true, Req, State}.
|
||||||
|
|
||||||
%%%%
|
%%%%
|
||||||
|
|
||||||
-type result_ok() :: {
|
-type result_ok() :: {
|
||||||
ok,
|
ok,
|
||||||
{Status :: cowboy:http_status(), Headers :: cowboy:http_headers(), Body :: iodata()}
|
{Status :: cowboy:http_status(), Headers :: cowboy:http_headers(), Body :: iodata()}
|
||||||
@ -279,7 +271,7 @@ valid_entity_length(Req, State) ->
|
|||||||
|
|
||||||
-type result_error() :: {error, Reason :: any()}.
|
-type result_error() :: {error, Reason :: any()}.
|
||||||
|
|
||||||
-type processed_response() :: {halt, cowboy_req:req(), state()}.
|
-type processed_response() :: {stop, cowboy_req:req(), state()}.
|
||||||
|
|
||||||
-spec process_response(result_ok() | result_error(), cowboy_req:req(), state()) ->
|
-spec process_response(result_ok() | result_error(), cowboy_req:req(), state()) ->
|
||||||
processed_response().
|
processed_response().
|
||||||
@ -287,24 +279,23 @@ valid_entity_length(Req, State) ->
|
|||||||
process_response(Response, Req0, State = #state{operation_id = OperationID}) ->
|
process_response(Response, Req0, State = #state{operation_id = OperationID}) ->
|
||||||
case Response of
|
case Response of
|
||||||
{ok, {Code, Headers, Body}} ->
|
{ok, {Code, Headers, Body}} ->
|
||||||
{ok, Req} = cowboy_req:reply(Code, Headers, Body, Req0),
|
Req = cowboy_req:reply(Code, Headers, Body, Req0),
|
||||||
{halt, Req, State};
|
{stop, Req, State};
|
||||||
{error, Message} ->
|
{error, Message} ->
|
||||||
error_logger:error_msg("Unable to process request for ~p: ~p", [OperationID, Message]),
|
error_logger:error_msg("Unable to process request for ~p: ~p", [OperationID, Message]),
|
||||||
|
|
||||||
{ok, Req} = cowboy_req:reply(400, Req0),
|
Req = cowboy_req:reply(400, Req0),
|
||||||
{halt, Req, State}
|
{stop, Req, State}
|
||||||
end.
|
end.
|
||||||
|
|
||||||
-spec handle_request_json(cowboy_req:req(), state()) -> {halt, cowboy_req:req(), state()}.
|
-spec handle_request_json(cowboy_req:req(), state()) -> {cowboy_req:resp_body(), cowboy_req:req(), state()}.
|
||||||
|
|
||||||
handle_request_json(
|
handle_request_json(
|
||||||
Req0,
|
Req0,
|
||||||
State = #state{
|
State = #state{
|
||||||
operation_id = OperationID,
|
operation_id = OperationID,
|
||||||
logic_handler = LogicHandler,
|
logic_handler = LogicHandler,
|
||||||
validator_state = ValidatorState,
|
validator_state = ValidatorState
|
||||||
context = Context
|
|
||||||
}
|
}
|
||||||
) ->
|
) ->
|
||||||
case openapi_api:populate_request(OperationID, Req0, ValidatorState) of
|
case openapi_api:populate_request(OperationID, Req0, ValidatorState) of
|
||||||
@ -312,8 +303,8 @@ handle_request_json(
|
|||||||
{Code, Headers, Body} = openapi_logic_handler:handle_request(
|
{Code, Headers, Body} = openapi_logic_handler:handle_request(
|
||||||
LogicHandler,
|
LogicHandler,
|
||||||
OperationID,
|
OperationID,
|
||||||
Populated,
|
Req1,
|
||||||
Context
|
Populated
|
||||||
),
|
),
|
||||||
_ = openapi_api:validate_response(
|
_ = openapi_api:validate_response(
|
||||||
OperationID,
|
OperationID,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user