Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F113014
cast.ex
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Award Token
Flag For Later
Size
3 KB
Referenced Files
None
Subscribers
None
cast.ex
View Options
defmodule
OpenApiSpex.Plug.Cast
do
@moduledoc
"""
Module plug that will cast the `Conn.params` and `Conn.body_params` according to the schemas defined for the operation.
Note that when using this plug, the body params are no longer merged into `Conn.params` and must be read from `Conn.body_params`
separately.
The operation_id can be given at compile time as an argument to `init`:
plug OpenApiSpex.Plug.Cast, operation_id: "MyApp.ShowUser"
For phoenix applications, the operation_id can be obtained at runtime automatically.
defmodule MyAppWeb.UserController do
use Phoenix.Controller
plug OpenApiSpex.Plug.Cast
...
end
If you want customize the error response, you can provide the `:render_error` option to register a plug which creates
a custom response in the case of a validation error.
##
Example
defmodule MyAppWeb.UserController do
use Phoenix.Controller
plug OpenApiSpex.Plug.Cast,
render_error: MyApp.RenderError
...
end
defmodule MyApp.RenderError do
def init(opts), do: opts
def call(conn, reason) do
msg = %{error: reason} |> Posion.encode!()
conn
|> Conn.put_resp_content_type("application/json")
|> Conn.send_resp(400, msg)
end
end
"""
@behaviour
Plug
alias
Plug.Conn
@impl
Plug
@deprecated
"Use OpenApiSpex.Plug.CastAndValidate instead"
def
init
(
opts
)
do
opts
|>
Map
.
new
()
|>
Map
.
put_new
(
:render_error
,
OpenApiSpex.Plug.DefaultRenderError
)
end
@impl
Plug
@deprecated
"Use OpenApiSpex.Plug.CastAndValidate instead"
def
call
(
conn
=
%{
private
:
%{
open_api_spex
:
private_data
}},
%{
operation_id
:
operation_id
,
render_error
:
render_error
})
do
spec
=
private_data
.
spec
operation
=
private_data
.
operation_lookup
[
operation_id
]
content_type
=
Conn
.
get_req_header
(
conn
,
"content-type"
)
|>
Enum
.
at
(
0
,
""
)
|>
String
.
split
(
";"
)
|>
Enum
.
at
(
0
)
private_data
=
Map
.
put
(
private_data
,
:operation_id
,
operation_id
)
conn
=
Conn
.
put_private
(
conn
,
:open_api_spex
,
private_data
)
case
apply
(
OpenApiSpex
,
:cast
,
[
spec
,
operation
,
conn
,
content_type
])
do
{
:ok
,
conn
}
->
conn
{
:error
,
reason
}
->
opts
=
render_error
.
init
(
reason
)
conn
|>
render_error
.
call
(
opts
)
|>
Plug.Conn
.
halt
()
end
end
def
call
(
conn
=
%{
private
:
%{
phoenix_controller
:
controller
,
phoenix_action
:
action
,
open_api_spex
:
_pd
}
},
opts
)
do
operation_id
=
controller
.
open_api_operation
(
action
)
.
operationId
if
operation_id
do
call
(
conn
,
Map
.
put
(
opts
,
:operation_id
,
operation_id
))
else
raise
"operationId was not found in action API spec"
end
end
def
call
(
_conn
=
%{
private
:
%{
open_api_spex
:
_pd
}},
_opts
)
do
raise
":operation_id was neither provided nor inferred from conn. Consider putting plug OpenApiSpex.Plug.Cast rather into your phoenix controller."
end
def
call
(
_conn
,
_opts
)
do
raise
":open_api_spex was not found under :private. Maybe OpenApiSpex.Plug.PutApiSpec was not called before?"
end
end
File Metadata
Details
Attached
Mime Type
text/x-c++
Expires
Sun, Nov 24, 4:41 AM (21 h, 21 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
39344
Default Alt Text
cast.ex (3 KB)
Attached To
Mode
R22 open_api_spex
Attached
Detach File
Event Timeline
Log In to Comment